martedì 23 dicembre 2014

martedì 16 dicembre 2014

RAD Studio XE7 in action Live Bologna: foto, ringraziamenti e codice sorgente

Si è tenuto ieri a Bologna l'evento RAD Studio XE7 in action Live, un evento Embarcadero organizzato da BitTime Software in collaborazione con Wintech-Italia.

L'evento era volto a illustrare le novità introdotte nella VCL (quindi Windows, Desktop) con le ultime versioni di RAD Studio (Delphi e C++ Builder).
In particolare è stata dedicato ampio spazio:

  • a come dare un aspetto moderno alle applicazioni tramite l'uso degli stili VCL;
  • ai nuovi componenti TaskBar e JumpList che migliorano l'integrazione con Windows;
  • alle nuove feature del linguaggio e della RTL (metodi anonimi, generici, AppTethering, nuove estensioni sintattiche, type helpers, ecc);
  • alla nuova Parallel Programming Library;
  • a FireDAC, la libreria di accesso ai dati di RAD Studio inclusa nel prodotto con la versione XE3.
Ringraziandovi per la partecipazione, vi lasciamo qualche fotografia dell'evento:






Qui trovate l'album Google+ con altre fotografie:



Ringraziamo tutti i partecipanti (molto attivi!) e Fabrizio e Valentina di BitTime per l'organizzazione.

Vi ricordiamo che potete trovare il codice sorgente delle demo utilizzate al seguente indirizzo:


Grazie e a presto!

Andrea e Paolo

venerdì 5 dicembre 2014

RAD Studio XE7 in action live: workshop gratuito a Bologna!

Si terrà a Bologna, lunedì 15 dicembre 2014, il prossimo evento RAD Studio XE7 in action live: un workshop gratuito organizzato da bit Time Software e Wintech Italia, in collaborazione con Embarcadero.



L'evento è focalizzato sulle novità introdotte nelle ultime versioni di RAD Studio ed è in particolare rivolto agli sviluppatori di applicazioni VCL Desktop che desiderano ammodernare le proprie applicazioni sfruttando le nuove funzionalità offerte dall'ambiente di sviluppo.

Alcuni degli argomenti trattati: Novità del linguaggio e della RTL, Parallel Computing Library, Librerie REST e FireDAC.
Un pomeriggio denso di informazioni per chi vuole proiettare nel futuro le proprie applicazioni.

Le sessioni tecniche sono affidate a Wintech-Italia e saranno tenute da:
  - Andrea Magni, Embarcadero MVP
  - Paolo Rossi, Embarcadero MVP

Vi rimando alla pagina dell'evento per l'agenda dettagliata, il modulo di iscrizione e i dettagli sulla location:


Vi aspettiamo numerosi!

Andrea

lunedì 1 dicembre 2014

Workaround per l'errore EBitmapLoadingFailed su Android Lollipop

Introduzione

C'è un bug di Delphi XE7 per cui le applicazioni Android non si avviano su Lollipop (Android 5.0). In particolare, vanno in crash subito dopo aver visualizzato lo splashscreen, a causa dell'eccezione EBitmapLoadingFailed che viene sollevata durante il caricamento delle immagini contenute nel file .fmx .
Lo stessa applicazione (stesso APK) esegue senza problemi su versioni di Android precedenti alla 5.

Ci sono un paio di discussioni a riguardo, sui social-network: 

Viene spiegato anche un workaround (che io ho applicato alla versione beta di ColorMapp stamattina) che consiste nel caricare le risorse grafiche (TBitmap) a runtime invece che lasciarle embedded nelle risorse dell'applicazione (evitando così che vengano caricate attraverso una chiamata a TBitmap.LoadFromStream, che sembra essere il punto critico del malfunzionamento).

Passi per applicare il workaround:

1) Salvare su disco tutte le bitmap di ogni form

(comodo se avete già caricato le immagini a design time, meno utile se state scrivendo una applicazione da zero)

Per semplificare il processo, ho scritto un pezzetto di codice che itera sui componenti di una form e salva tutte le bitmap delle TImage che trova.
Potete guardare la funzione SaveAllImagesToDisk della unit ImageDumpUnit.pas, che trovate in un mio repository GitHub:


Per esempio, nell'evento OnCreate della form ho aggiunto:

  {$IFDEF MSWINDOWS}
  SaveAllImagesToDisk(Self);
  {$ELSE}
  LoadAllImagesFromDisk(Self);
 {$ENDIF}

Eseguendo l'applicazione sulla platform Win32, vi verrà generata una cartella images_dump con delle sottocartelle (una per ogni form) con le immagini salvate in files PNG.
Il ramo $ELSE della direttiva di compilazione viene eseguito per esempio su Android, così l'applicazione Win32 fa il dump e l'applicazione Android cerca di caricare dinamicamente le immagini dallo storage del dispositivo.

2) Rimuovere tutte le bitmap dalle risorse (.fmx)

Il modo più semplice (ma richiede di agire manualmente su ogni singolo componente delle vostre form con una bitmap) consiste nel:
  • svuotare tutte le voci delle MultiResBitmap (eliminando tutte le versioni delle bitmap);
  • svuotare le TBitmap (es. le proprietà StartValue / StopValue delle TBitmapAnimation), aprendo il component editor e premendo il tasto Clear;
Se avete molte TBitmap e svuotarle manualmente vi sembra improponibile, potreste agire direttamente sul DFM, cercando tutte le occorrenze di Bitmap.

3) Caricare a run-time le immagini corrispondenti

Anche in questo caso potete sfruttare la funzione LoadAllImagesFromDisk della unit ImageDumpUnit.pas, avendo cura di chiamarla per esempio nell'evento OnCreate delle vostre form.

4) Aggiungere al deploy tutti i file PNG generati al passo 1

Attraverso il deployment manager di Delphi, aggiungete i file PNG in modo che vengano distribuiti con la vostra applicazione. Abbiate cura di indicare come RemotePath, il valore  'assets/internal/images_dump/' seguito dal nome della form corrispondente.


5) controllate di non avere altre TBitmap

Per esempio mi sono accorto che il problema si presenta anche con le TBitmap (non solo le TMultiResBitmap) presenti in molti componenti (es. le TBitmapAnimation). Per queste io ho risolto manualmente (mimando il comportamento di LoadAllImagesFromDisk ) ma potrebbe aver senso automatizzare il dump e il load dinamico anche di quelle.

Conclusione

E' tutto, seguendo questi passi io ho risolto il crash della mia applicazione XE7 ColorMapp su Android 5.0 Lollipop e attualmente ho una beta funzionante sul mio Nexus 5.
Conto di promuovere la versione beta in produzione appena fatti i test su qualche altro dispositivo.

Buon lavoro e a presto,
Andrea

mercoledì 12 novembre 2014

TFDDataSetProvider: un supporto a design time per Datasnap e FireDAC (FireDACJSONReflect)

Introduzione

Con Delphi XE5 Update 2, è stata introdotta la unit FireDACJSONReflect che rappresenta una prima occasione di integrazione di FireDAC con DataSnap.
Tale unit permette di serializzare uno o più dataset FireDAC e restituirli in un'unica chiamata DataSnap REST. Inoltre sono presenti diverse funzionalità utili allo sviluppo di una applicazione multitier dataset-oriented quali ad esempio:
- l'estrazione lato client del delta dei dataset;
- l'applicazione delle modifiche lato server una volta ricevuti i delta dai client.

Personalmente ritengo FireDAC una delle migliori tecnologie aggiunte a Delphi (e RAD Studio) negli ultimi anni e sono stato molto felice di vedere introdotta la unit FireDACJSONReflect.
Chi di voi ha usato DataSnap nella sua accezione dbExpress (con il ClientDataSet e il DataSetProvider, per intenderci), sicuramente avrà notato che attualmente è difficile avere un supporto design time nello sviluppo del client di una applicazione DataSnap+FireDAC.
Di fatti, come spiegato egregiamente anche da Cary Jensen nella sua sessione FireDAC di EuroDevCon 2014 (EKON 18), l'approccio d'uso di FireDAC con DataSnap differisce dal precedente (DataSnap + dbExpress) in quanto i dati sono restituiti dal server come risposta a chiamate a metodi (e non affacciati all'esterno tramite IAppServer e l'uso dei TDataSetProvider).

La possibilità di avere il dataset pieno durante la progettazione della nostra applicazione (cioè a design-time) è fondamentale se vogliamo sfruttare a pieno le funzionalità RAD di Delphi e in particolar modo questa esigenza mi sembra importante in una applicazione FireMonkey in cui si voglia sfruttare la tecnologia dei (Visual) LiveBinding.  

Sviluppo di un componente (VCL e FMX) per aggiungere un supporto design-time a DataSnap+FireDACJSONReflect

Ho pensato che:
  1. sfruttando la possibilità di usare la REST Client Library per effettuare una chiamata REST ad un server DataSnap;
  2. catturando il risultato JSON di un metodo che ritorni un'istanza di TFDJSONDataSets;
  3. usando il meccanismo di unmarshaling presente in DBXJSONReflect;
  4. e appoggiando i dati ad una TFDMemTable (che poi è lo stesso di quanto si faccia attualmente a run-time con una applicazione client DataSnap+FireDACJSONReflect)
sarebbe stato semplice ottenere un componente in grado di riempire a design-time una TFDMemTable ed effettivamente così è stato.
Ho creato il componente TFDDataSetProvider (una cinquantina di righe di codice che potete vedere qui) che potete aggiungere alle vostre form (o datamodule) VCL o FireMonkey (desktop o mobile) e, grazie al relativo component editor, recuperare i dati dal server DataSnap per poi travasarli in una o più TFDMemTable per le vostre esigenze.

Demo

A) Creare una DataSnap Server REST Application con FireDACJSONReflect


In sostanza, assumiamo di avere un metodo come il seguente:

function TServerMethods1.GetData: TFDJSONDataSets;

B) Creare una DataSnap Client Application

Potete creare una nuova applicazione e decidere o meno se usare il wizard di creazione di un DataSnap REST Client Module e farvi generare le classi proxy per l'invocazione dei metodi del server DataSnap.


Ma per provare il mio componente, non è strettamente necessario. Infatti, non volevo includere nel componente un livello di complessità tale da rigenerare automaticamente le classi proxy per ogni eventuale progetto DataSnap server con cui utilizzarlo. Ho pensato di sfruttare l'anima REST (http+JSON) e quindi l'unica cosa che vi servirà è appunto un'istanza del componente TFDDataSetProvider (dovrete installarlo, installando i due package che ho preparato).


Il componente, ingloba i componenti necessari ad eseguire la chiamata REST (TRESTClient e TRESTRequest, della REST Client Library, introdotta con XE5) e quindi (con il server DataSnap in esecuzione, fuori dall'IDE) non occorre altro che configurare la richiesta ad esempio nel seguente modo (considerando il metodo di esempio TServerMethods1.GetData illustrato prima):

FDDataSetProvider1.RESTClient.BaseURL := 'http://localhost:8080/datasnap/rest/TServerMethods1/';

FDDataSetProvider1.RESTRequest.Resource := 'GetData';

In questo modo il componente saprà come contattare il vostro server DataSnap ed invocare il metodo GetData via REST. Potete eseguire quest'azione direttamente nell'IDE facendo click con il pulsante destro sul componente e scegliendo la voce di menù contestuale: "Retrieve data from server".
Una dialog vi confermerà se la chiamata REST è andata a buon fine e quanti dataset (con relativi nomi) sono stati scaricati dal server.

Ora, se aggiungiamo alla nostra form una TFDMemTable (es. FDMemTable1) e impostiamo la proprietà TargetDataSet del nostro FDDataSetProvider1 a FDMemTable1.
Se ora clicchiamo nuovamente sul FDDataSetProvider1 (con il pulsante destro), noteremo che per ogni dataset scaricato è presente una voce di menù che ci permette di travasare i dati nel TargetDataSet (la nostra FDMemTable1).





Da qui in poi, possiamo lavorare con i nostri dati a disposizione e, per esempio usare i live bindings per costruire comodamente la nostra GUI (VCL o FireMonkey) o direttamente i componenti db-aware (VCL).



Ho registrato un video che mostra il componente all'opera, lo trovate qui:


Conclusioni

Probabilmente nelle prossime versioni di Delphi vedremo una sempre maggiore integrazione di FireDAC con l'ambiente di sviluppo e quindi può essere che questo approccio diventi obsoleto, ma per il momento mi sembra un modo comodo per costruire la GUI delle vostre applicazioni sfruttando le potenzialità RAD che fanno di Delphi (e RAD Studio) uno dei migliori ambienti di sviluppo in circolazione.

Sorgenti

Per chi non avesse confidenza con GitHub, qui c'è un link per scaricare un file zip.

Commenti e suggerimenti sono sempre ben accetti.
Buon lavoro,

Andrea

lunedì 10 novembre 2014

Disponibili i replay di CodeRage 9!

Nel canale Embarcadero di YouTube sono disponibili i replay delle sessioni di CodeRage 9 (conclusasi qualche giorno fa).
Molte di queste sessioni sono veramente interessanti e rappresentano ottimi esempi di uso delle ultime funzionalità di RAD Studio, spiegati dai migliori esperti internazionali.

Non posso che consigliarvi di dare un'occhiata (io ne ho una dozzina da guardare, avendole perse quasi tutte durante i giorni della conferenza) ! ;-)

Buona visione e buon lavoro

Andrea

giovedì 6 novembre 2014

Google Material Design e FireMonkey?

Google Material Design

Qualche settimana fa Google ha rilasciato ufficialmente le specifiche del Material Design, le nuove linee guida per la GUI delle applicazioni Android.
Si tratta di una documentazione molto estesa che riguarda moltissimi aspetti della GUI delle applicazioni mobile e sicuramente ci vorrà del tempo prima che tutte queste proposte vengano assorbite dagli sviluppatori di tutto il mondo.
Alcune applicazioni molto popolari però hanno già pubblicato degli aggiornamenti includendo elementi del Material Design e ovviamente non c'è miglior fonte di ispirazione delle applicazioni di Google stessa (Chrome, Google+, Play Store, Play Music, ...).

Da qualche giorno stavo cercando di mimare il comportamento dell'app Android Google+ per quanto riguarda le animazioni di entrata/uscita delle barre superiori e del pulsante delle azioni situato nella parte inferiore dello schermo.




Oltre a dare all'utente una sensazione di responsività dell'applicazione (c'è molta enfasi circa le transizioni animate nel Material Design), questo approccio permette anche di dedicare il massimo spazio disponibile alla lista dei contenuti che vogliamo presentare e al contempo poter usufruire di una barra del titolo di dimensioni decenti e che possa ospitare controlli anche complessi (ComboBox, Slider, trackbar ecc..).

Un tentativo

Con un po' di attenzione a non complicare troppo le cose, ho provato a replicare lo stesso effetto con Delphi XE7.
Ho scelto di usare una TListView come contenitore principale (popolandola con un TPrototypeBindSource) e l'ho posizionata sulla form (Align = Client).
Per poter aggiungere sopra di essa gli altri controlli interessati (le barre del titolo ed eventuali altri pannelli animati) senza interferire con la ListView stessa, ho aggiunto al suo interno un TLayout con Align = Contents (un valore introdotto nelle ultime versioni di Delphi che permette al layout di coprire l'intera area della listview), di modo da poter avere una sorta di secondo layer su cui poggiare altri componenti costituitivi delle barre superiori e della pulsantiera inferiore.


Sfruttando la proprietà ScrollViewPos della TListView (per capire come l'utente sta muovendo la lista), l'evento OnPaint della stessa (per avere una forte frequenza di aggiornamento, avendo cura di aggiungere qualche accorgimento per evitare di peggiorare troppo le prestazioni) e aggiungendo qualche effetto (TShadowEffect) qua e là, il risultato mi sembra abbastanza soddisfacente e si tratta in tutto di poche decine di righe di codice.
Ecco un paio di screenshot (che non rendono molto l'idea, trattandosi per lo più di animazioni) del risultato finale:


Si tratta ovviamente di un approccio minimale e per riuscire ad avere uno scostamento iniziale della listview tale da non far finire i primi item sotto i pannelli di intestazione, ho dovuto sacrificare la possibilità di sfruttare gli ItemHeader, forzandone uno di altezza pari ai pannelli di intestazione stessi (un po' un trucchetto, diciamo).

Vi invito a scaricare i sorgenti e provare direttamente (anche su Win32 ma meglio su un dispositivo mobile) o di installare direttamente l'APK di cui trovate il link qui sotto.

Update: ho aggiunto un video dimostrativo (grazie alla app gratuita Mirror)!

Source code e APK

martedì 4 novembre 2014

Delphi&Dintorni in Delphi Feeds (votate!)

Abbiamo aperto una richiesta per includere blog.delphiedintorni.it nei Delphi Feeds, un aggregatore di notizie nel mondo Delphi noto a moltissimi sviluppatori in tutto il mondo.
Se volete aiutarci, potete votare la richiesta al seguente indirizzo:


Grazie in anticipo!

Andrea

sabato 4 ottobre 2014

Leggere e produrre Barcode con Delphi XE7 (Update)

Introduzione

In un precedente blog post, avevamo visto come sia possibile comandare via Intent applicazioni di terzi (Barcode Scanner) per implementare facilmente la funzionalità di lettura (e produzione) di un codice a barre dalla vostra applicazione Delphi (XE5) per Android.

Ho deciso, dopo alcune richieste pervenute via email, di pubblicare questo aggiornamento che sfrutta il supporto (introdotto nella versione XE6 e illustrato da Brian Long in un suo blog post) per gestire l'evento onActivityResult.

Motivazioni

Nella vecchia versione di questo esempio (per XE5), infatti, sfruttavo gli appunti di sistema e la gestione degli eventi dell'applicazione per capire quando, una volta avviata Barcode Scanner in modalità di lettura, l'utente avesse effettivamente concluso la scansione di un codice a barre.
Grazie al fatto che Barcode Scanner copia il codice scansionato negli appunti, potevo così ottenere nella mia applicazione Delphi la stringa con il testo corrispondente al codice a barre.

L'approccio, un po' primitivo, era dovuto al fatto che l'Intent veniva lanciato chiamando startActivity (una sorta di ShellExecute nel mondo Android) che non prevede un meccanismo di notifica al termine dell'Activity lanciata (nel nostro caso, al termine della scansione di un codice a barre o quando l'utente annulla l'operazione).

Nuovo approccio

Da XE6 in poi, invece, è possibile chiamare startActivityForResult che lancia l'Activity e chiede di essere notificati dell'esito dell'Activity (un po' come ShellExecuteEx permette di attendere la fine del processo lanciato nel mondo Windows). Tale notifica avviene tramite il sistema di messaging della RTL di Delphi (unit System.Messaging) e quindi è facilissimo registrare un nostro metodo (HandleActivityMessage nel mio codice) come message-listener di un messaggio specifico (TMessageResultNotificationqui c'è la lista dei messaggi supportati) ed eseguire il nostro codice applicativo al momento opportuno e con tanto di accesso a tutti gli eventuali parametri di uscita dell'Activity eseguita (nel nostro caso, ad esempio, il valore e il tipo di codice a barre scansionato).


Il codice di subscribe per il TMessageResultNotification e il metodo HandleActivityMessage

La gestione di onActivityResult, con l'estrazione degli SCAN_RESULT

Risultato della scansione: codice e tipo

Conclusioni e materiale

Di sicuro, rispetto alla versione XE5:

  • non si rischiano interferenze nella gestione degli appunti o se altre applicazioni vengono avviate (bastava l'arrivo di una telefonata e il meccanismo precedente smetteva di funzionare);
  • si ottiene l'accesso ai parametri "accessori" come il tipo di codice a barre effettivamente scansionato.

Inoltre, questo approccio è generale e può essere usato con qualunque applicazione e con qualunque Activity/Intent supportati (non solo quindi per Barcode Scanner!)

Link: Codice sorgente Delphi XE7
Link: Demo APK (da installare sul vostro dispositivo Android)

Buon lavoro e a presto,

Andrea


mercoledì 10 settembre 2014

FreeDrawing e XE7: multitouch, nuovo menù, immersive mode e splashscreen!

A pochi giorni dall'uscita di RAD Studio XE7, sono riuscito ad aggiungere (con facilità) alcune nuove funzionalità introdotte con XE7 anche alla mia applicazione FreeDrawing (versione 1.0.14)!

I principali cambiamenti:


Supporto multitouch

Ora è possibile usare più di un dito per comporre il proprio disegno. Inoltre, il passaggio dal tradizionale evento OnMouseMove al nuovo OnTouch ha portato anche un sensibile miglioramento nel riconoscimento del tocco;

Disegno multitouch

Immersive Full-Screen mode

l'utente ora può concentrarsi sul proprio disegno sfruttando tutta la superficie tattile disponibile, anche questo grazie al supporto introdotto con XE7 a questa funzionalità di Android 4.4+ ;


Nexus 5, Immersive Full-Screen mode

Nexus 5, Immersive Full-Screen mode, con sticky flag


Splashscreen

Aggiunto senza sforzo grazie al supporto introdotto in XE7;

Nuovo menù con TMultiView

In occasione della semplificazione delle impostazioni relative al tratto, ho reimplementato il menù dell'applicazione utilizzando il TMultiView (altra novità di XE7). Anche in questo caso, tutto è stato molto semplice e ora su dispositivi differenti (smartphone e tablet) si ottiene una rappresentazione del menù idonea al contesto (per esempio con un drawer sui dispositivi più piccoli e con un docked panel sui tablet in orientamento orizzontale).


Tablet Nexus 7, orientamento verticale (notare il pulsante del menù in alto a sinistra)

Tablet Nexus 7, orientamento verticale, drawer aperto


Tablet Nexus 7, orientamento orizzontale, docked panel
Una cosa molto piacevole (che non avevo ancora letto da nessuna parte) è che il drawer si apre anche facendo uno scorrimento del tocco dal bordo sinistro del tablet all'interno del display (quello che chiamano "inward swipe").

Considerazioni:

  • Il nuovo XE7 mi sembra davvero più stabile e veloce delle versioni precedenti, anche nelle fasi di compilazione per le piattaforme mobile (non ho misurato precisamente ma la sensazione è abbastanza netta compilando per Android);
  • Il componente TMultiView è veramente comodo da usare e risolve un problema decisamente ostico da affrontare altrimenti (offrire la migliore esperienza d'uso all'utente a prescindere dal dispositivo che sta usando);
  • Veramente semplice sfruttare anche il supporto multitouch (comunque concordo con Andrey Yefimov e mi sarebbe piaciuto [se possibile] che il parametro Action di OnTouch fosse declinato per ogni elemento di Touches);
  • Il prossimo passo è aggiornare anche la versione iOS (e nell'occasione sfruttare le nuove tecnologie FireUI per differenziare leggermente l'interfaccia fra le versioni iOS e Android)!
  • Ho fatto provare il supporto multitouch ad un paio di amici (Davide & Davide, che ringrazio) possessori di Microsoft Surface Pro e funziona, a breve cercherò di compilare una versione di FreeDrawing anche per Windows (su dispositivi touchscreen)!
Un'applicazione Delphi XE7 di test multitouch in esecuzione su Surface Pro
Microsoft Surface Pro (Tablet Windows)


A presto e buon lavoro!

Andrea

martedì 9 settembre 2014

Delphi XE7: Le novità in dettaglio

Delphi XE7

Da qualche giorno Embarcadero ha rilasciato la versione XE7 dei suoi strumenti RAD (Delphi XE7, C++ Builder XE7, RAD Studio XE7), questa nuova release introduce davvero tante funzionalità distribuite in diverse aree: RTL, FMX e VCL. Vediamo di seguito le principali.

Risorse online



FireUI: Revolutionary Multi-Device Development


In XE7 lo sviluppo Multi-Device, ovvero dispositivi con fattore di forma e dimensioni diverse, è stato semplificato con la modalità di progettazione di FireUI. Il classico "Form Designer" è stato infatti esteso e rinominato "Multi-Device Designer". La nuova modalità dello sviluppo delle form si basa sul concetto di form "master" per condividere tutto il codice e l'interfaccia utente e di viste ereditate (ad esempio per differenti dimensioni e fattori di forma) che contengono la UI o il codice particolare. Queste viste (form) ereditate contengono solo il codice specifico differente dalla vista master, mentre si può continuare a cambiare la vista master avendo la sicurezza che i cambiamenti saranno propagati alle viste ereditate.

XE7 contiene già un set di viste predefinite: Windows Desktop, Surface Pro, Mac Desktop, iPhone, iPad, diversi telefoni e tablet Android ed anche la vista ottimizzata per i Google Glass.

Interessante anche il nuovo componente MultiView Smart Menu (TMultiView) che gestisce automaticamente la posizione, l'orientamento e lo stile di un'area (ad esempio usata per mostrare il menu dell'applicazione) a seconda del fattore di forma e della piattaforma su cui gira l'applicazione. Ad esempio un menu può essere mostrato come un "drawer" in dispositivi con un piccolo schermo o come un pannello "docked" sui dispositivi con schermo grande, tutto ciò avviene semplicemente mettendo il componente sul form ed impostandone alcune proprietà. Ovviamente è anche possibile una personalizzazione via codice completa.

Altra funzionalità molto importante per la gestione di dispositivi hardware molto diversi è la nuova API (FMX) chiamata "Behavior Services". I Behavior Services consentono di ottenere informazioni dai dispositivi hardware su cui gira l'applicazione. Questa API è ad esempio sfruttata proprio dal componente TMultiView per recuperare il tipo di piattaforma, l'orientamento, il fattore di forma, ecc...

Risorse online sull'argomento


Bluetooth e Bluetooth LE con supporto AppTethering

Questa a mio avviso è una delle novità più interessanti, soprattutto per il supporto Bluetooth LE che giocherà un ruolo fondamentale nei prossimi anni nel mondo degli smartphone e più in generale dei dispositivi portatili (e indossabili).
Grazie a ciò AppTethering, acquista quindi il supporto Bluetooth in aggiunta all'attuale supporto WiFi. Da XE7 AppTethering permette anche di connettersi fuori dalla propria subnet.
Da notare che il supporto Bluetooth e Bluetooth LE è inserito a livello di RTL, ciò significa che potranno beneficiarne tutte le applicazioni scritte con Delphi: VCL e FMX

Sempre restando in tema di dispositivi mobili, indossabili e "gadget" vari, XE7 può interfacciarsi con dispositivi anche molto diversi dai tradizionali smartphone, per citarne alcuni: Google Glass, Emotiv Epoc, Amazon FireTV, Ouya, Leap Motion, Kinect, Parrot: AR Drone, Chromecast.
Come vedete non avete che l'imbarazzo della scelta per divertirvi usando i gadget "del momento"! :-)

Risorse online sull'argomento

Parallel Programming library

In Delphi XE7 c'è un'aggiunta molto interessante, la nuova libreria di programmazione parallela (Parallel Programming Library). Potete trovare la libreria in questione nella unit System.Threading (essendo nella RTL è quindi a disposizione di tutte le piattaforma supportate da Delphi). Con la nuova libreria è possibile scrivere codice che riesce a sfruttare al massimo le caratteristiche dell'hardware a disposizione sulla macchina in deployment (numero di core e carico di lavoro). La libreria mette a disposizione diverse classi che consentono operazione quali il "Parallel For", la schedulazione di task, il wait for tasks e i "Future".  
A mio avviso l'introduzione di questa libreria va a colmare una mancanza storica nella class library di Delphi permettendo la scrittura di codice "parallelo" facilmente scalabile su architetture Multi-Core. 

Risorse online sull'argomento

Enterprise Mobility Services (EMS)

Enterprise Mobility Services (EMS) è una soluzione pronta all'uso per mettere in deployment application server che usano tecnologie standard (chiamate REST e dati JSON) e che possono ospitare moduli di accesso dati e business logic. 
Per far capire meglio di che si tratta, dico subito EMS va a posizionarsi nello stesso dominio applicativo di DataSnap ma l'approccio è sicuramente differente: DataSnap consente di costruire un server REST da zero (o quasi, sfruttando wizard e codice del framework) mentre EMS fornisce un server pronto all'uso e facile al deployment, personalizzabile tramite moduli (packages).
Con EMS è possibile esporre API REST in modo molto semplice creando un package Delphi registrando una o più risorse con i rispettivi metodi di accesso, il tutto tramite i comodi wizard messi a disposizione da Delphi.
EMS fornisce anche una semplice ma efficace interfaccia amministrativa da cui poter tracciare gli accessi, gli utenti, l'uso delle risorse (REST) e provvedere statistiche in tempo reale (real-time analytics).
Vedremo se questo modello di costruzione di server REST incontrerà il favore degli sviluppatori Delphi, sicuramente è un modello interessante in alternativa a DataSnap.

Risorse online sull'argomento

Nuova libreria XML Cross-Platform

Con Delphi XE7 viene introdotta una nuova libreria (un nuovo vendor) XML: OmniXML, un progetto open source (ora su Google Code) iniziato da Miha Remec e portato avanti da Primož Gabrijelčič.
OmniXML è una libreria interamente Delphi molto performante e completa con accesso al DOM classico e tramite XPath. Il progetto originale (che io uso da diversi anni) contiene anche un serializzatore (in XML ovviamente) di oggetti Delphi davvero molto comodo soprattutto come gestore della configurazione.

Risorse online sull'argomento

String-Like Operations Supported on Dynamic Arrays

L'unico cambiamento del compilatore in XE7 (almeno cambiamento visibile) è il supporto degli operatori classici sugli array dinamici, ad esempio questo codice  in XE è valido:


Oltre agli operatori standard è possibile usare le funzioni stringa classiche: Insert, Delete, Concat, ecc...
La funzionalità può non essere da "slogan" ma io ritengo le aggiunte al linguaggio sempre importantissime e segno che Delphi viene spinto dal team di sviluppo Embarcadero sempre più avanti aggiornando anche il compilatore!

Risorse online sull'argomento

Altre novità XE7

Le novità non finiscono certo qui, io ho dettagliato quelle più importanti per me ma ce ne sono davvero tante (spazio magari per un prossimo articolo).
Ho categorizzato le altre novità (così come il documento what's new di Embarcadero) in FireMonkey, IDE, VCL, ecc...

FireMonkey

  • New Google Mobile Ads API for Android
  • Native Presentation of TEdit and TCalendar on iOS
  • Multi-Monitor Support
  • Multi-Touch Support and Gestures Changes
  • Full-Screen Immersive Mode for Android
  • FireMonkey Save State Feature
  • Dialog Box Methods Support Anonymous Methods to Handle Their Closing
  • General refactoring of FireMonkey Libraries
  • Platform Assistant Changes for XE7

IDE

  • Changes in the Form Designer for Multi-Device Applications
  • Project Files Automatically Added to the Deployment Manager
  • Entitlement List Added for Android
  • Splash Screen Support for Android
  • Git Version Control System Integrated in the IDE
  • Add Java Libraries to Your Applications for Android from the Project Manager

RTL

  • New Unit for Web Encoding and Decoding
  • PCRE 8.35 for Windows and Mobile Platforms
  • Zlib 1.2.8

VCL

  • New Component for Windows Taskbar Jump Lists

Database

  • FireDAC Changes
  • Parse Provider Support for Your Android Push Notification Applications
  • BDE Removed (ma questa è una novità?? Si!)
  • Enhancements to the Data Explorer

Debugger

  • New PAServer Manager App on the Mac
  • MultiByte Support for Mobile Debuggers
  • Binary info.plist File Deployed

Conclusioni

Beh, che dire.. Wow! E' stato un lungo lavoro elencare e dettagliare alcune novità, figuratevi provarle e cominciare ad integrare queste funzionalità nel nostro codice! ;-)

A parte gli scherzi, una release davvero importante! Importante di sicuro per gli sviluppatori mobile e FireMonkey ma anche per gli sviluppatori classici VCL che possono scegliere XE7 come versione su cui standardizzare (magari per qualche versione) lo sviluppo dei vostri applicativi Windows.

Se dopo la lettura di questo articolo avete deciso che non potete non avere XE7 vi rimando al nostro shop per l'acquisto!





Al prossimo articolo!
Paolo.


giovedì 4 settembre 2014

Rilasciato Delphi XE7!


Due giorni fa (il 2 settembre 2014), Embarcadero Technologies ha rilasciato la nuova versione di Delphi (e RAD Studio): si tratta della XE 7, numero che per molti delphisti è sicuramente di grande auspicio (visto il grande successo di Delphi 7 e Delphi 2007 anni fa).

Qui trovate il blog post di Marco Cantù (Delphi and RAD Studio Product Manager) con l'annuncio e la descrizione di alcune nuove funzionalità.

Fra le principali novità non possiamo non elencare:

  • FireUI (video): nuovi strumenti a design-time (designer) e runtime (componente MultiView e Behavior services di FireMonkey) per lo sviluppo di applicazioni multi-device;
  • Supporto per la programmazione parallela (multi-thread, multi-core, cicli for paralleli, futures, thread-pooling...);
  • Novità in ambito di supporto Bluetooth (incluso Bluetooth LE e l'utilizzo con la tecnologia AppTethering);
  • Una nuova soluzione per lo sviluppo multi-tier, chiamata EMS (Enterprise Mobility Services), per lo sviluppo di application server REST HTTP;

Fra le novità introdotte in FireMonkey, segnalo il supporto multi-touch, la possibilità di usare controlli nativi per alcuni componenti (TEdit e TCalendar) e il supporto (Android) per l'immersive-mode (KitKat) e gli splash-screen.

Qualche link utile (non perdete il Webinar di oggi!):


Qualche articolo apparso su Internet:

Buon lavoro e a presto!

Andrea

martedì 1 luglio 2014

TDataSetRESTRequestAdapter: serializzare un dataset in JSON per eseguire una TRESTRequest (PUT/POST)

Introduzione

La REST Client Library è una libreria introdotta con la versione XE5 e che permette di interagire facilmente con un qualunque server REST HTTP (JSON).

Una delle funzionalità più potenti (soprattuto per un approccio RAD) di questa libreria è implementata dal componente TRESTResponseDataSetAdapter, che permette di prendere il contenuto JSON ottenuto con una chiamata REST ad un server e presentarlo in forma di TDataSet (ad esempio in una TFDMemTable). Una volta ottenuto un TDataSet, possiamo per esempio mostrare i dati ottenuti da una richiesta REST come se fossero risultati di una query database.

Trovate online diverse demo (ad esempio questo video YouTube di David Iquesto blog post di Marco Cantù e questo articolo di Sarina DuPont) di come usare il TRESTResponseDataSetAdapter.


TRESTResponseDataSetAdapter all'opera

Dal server al client, ma poi?

Grazie alla REST Client Library e al TRESTResponseDataSetAdapter, è facile interrogare un qualunque server REST HTTP JSON e portare i dati sul nostro applicativo client (mobile o desktop che sia) sotto la familiare forma di un TDataset... ma poi?

Se dobbiamo fare qualche modifica sui dati (magari attraverso una GUI e al meccanismo dei Live Bindings) e rispedirli al server, sarebbe carino avere un qualche supporto per effettuare l'operazione inversa di quella implementata da TRESTResponseDataSetAdapter.

TDataSetRESTRequestAdapter: esecuzione di UpdateRequest (a design-time)

TDataSetRESTRequestAdapter

Sostanzialmente si tratta di un componente che prende un TDataSet (con una struttura compatibile a quella generata da TRESTResponseDataSetAdapter), ne produce una serializzazione JSON e imposta di conseguenza il valore di un parametro di una TRESTRequest che può rispedire al server i dati modificati (usando una PUT o una POST, per esempio).

TDataSetRESTRequestAdapter e "Update Request" disponibile a design-time

Considerato che questo genere di necessità mi sembra abbastanza diffusa (soprattutto fra chi sta sviluppando applicazioni in cui il backend è di terze parti o sviluppato in altre tecnologie), ho pensato di mettere il codice su un mio repository GitHub.

Trovate il codice del package, del componente e di un semplice progetto di esempio al seguente indirizzo (se non avete confidenza con Git, potete scaricare uno zip direttamente dalla seguente pagina):


Alcune feature implementate:
  1. RecordsMode: possibilità di decidere se rispedire tutto il dataset, solo il record corrente o applicare un filtro custom per decidere quali record includere nella serializzazione;
  2. TargetParamName: possibilità di indicare il nome del parametro della TRESTRequest da valorizzare (chiamando il metodo UpdateRequest);
  3. supporto design-time: potete fare click-destro sul componente direttamente dall'IDE ed eseguire la serializzazione direttamente a design-time (così da poter poi eseguire anche la richiesta REST sempre a design-time, molto utile per i test e il debug);
  4. SingleObjectAsArray: se impostate RecordsMode = CurrentRecord, potete decidere se il risultato della serializzazione deve essere un TJSONObject o un TJSONArray contentente un singolo TJSONObject.

Alcune implementazioni future che mi piacerebbe realizzare:
  1. maggiore integrazione con la TRESTRequest da eseguire a valle (sto pensando di aggiungere un metodo TDataSetRESTRequestAdapter.UpdateRequestAndExecute);
  2. gestire i tipi di campi del dataset in fase di serializzazione (attualmente sono tutte stringhe, anche perchè mi risulta che il TRESTResponseDataSetAdapter non permetta di personalizzare il tipo di campi generati [forse ci stanno lavorando, in teoria dalla documentazione dovrebbe essere possibile definire le proprie FieldDefs e stabilire così i tipi dei campi da generare]);
  3. investigare se e come potrebbe essere utile sfruttare il delta dei dataset (FDMemTable o ClientDataSet) per rispedire al server solo i record modificati o qualcosa del genere (solo i campi modificati?);
  4. supporto per array innestati (non appena disponibile nella REST Client Library)

Conclusioni

TDataSetRESTRequestAdapter è un tentativo di implementare quanto indicato anche nella wiki di Delphi per permettere l'invio al server di dati modificati sul client a seguito di una richiesta REST gestita attraverso l'uso di un TRESTResponseDatasetAdapter.

Il progetto è disponibile su GitHub, spero possa esservi utile! Ogni commento/suggerimento è ben accetto!

Ciao,
Andrea


lunedì 30 giugno 2014

DelphiDay 2014: il codice sorgente delle nostre demo

Abbiamo caricato i sorgenti delle applicazioni mostrate da me e da Paolo durante il DelphiDay 2014 sull'account GitHub di Wintech-Italia.

La cartella dedicata al DelphiDay 2014 si trova al seguente link:

https://github.com/wintech-italia/conferences/tree/master/DelphiDay2014

In particolare potete trovare:

  1. i sorgenti di Paolo sull'AppTethering (desktop):

    https://github.com/wintech-italia/conferences/tree/master/DelphiDay2014/AppTethering/PR_source
  2. i sorgenti di Andrea sull'AppTethering (mobile e desktop) - BarcodeScanner:

    https://github.com/wintech-italia/conferences/tree/master/DelphiDay2014/AppTethering/AM_DesktopServer

    https://github.com/wintech-italia/conferences/tree/master/DelphiDay2014/AppTethering/AM_Mobile
  3. i sorgenti di Andrea sull'AppTethering (mobile e desktop) - DelphiDayWall_Mobile:

    https://github.com/wintech-italia/conferences/tree/master/DelphiDay2014/AppTethering/AM_DelphiDayWall_Mobile

    https://github.com/wintech-italia/conferences/tree/master/DelphiDay2014/AppTethering/AM_RemoteKeyboard

     
  4. i sorgenti di Paolo sulla REST Client Library:

    https://github.com/wintech-italia/conferences/tree/master/DelphiDay2014/RESTClientLibrary

Per quanto riguarda il punto 3, cioè la demo dell'app mobile che pilotava la rotazione del DelphiDayWall (l'applicazione 3D mostrata durante la conferenza e che riassumeva le informazioni fondamentali della giornata), ho pensato che fosse più pratico fornirvi un server più semplice: RemoteKeyboard è una semplice applicazione VCL che simula la pressione di tasti (su qualunque applicazione che sia in primo piano, quindi va benissimo per cambiare le slide di una presentazione :-) ) e che viene comandata dalla app DelphiDayWall_Mobile (che vedete nello screenshot qui sotto).




PS: Se non avete un client GIT installato, potete sempre scaricare l'intero repository come file ZIP cliccando sul pulsante "Download ZIP" in basso a destra nella pagina https://github.com/wintech-italia/conferences

Per qualunque domanda, non esitate a contattarci!

Andrea

venerdì 27 giugno 2014

DelphiDay 2014: ecco le foto!

Per chi se le fosse perse sugli spazi Wintech-Italia dei principali social network (Twitter, Facebook e Google+), eccovi i link per gli album pubblici (Facebook e Google+) delle fotografie della XIII edizione del DelphiDay 2014 (tenutosi a Piacenza, l'11 giugno 2014).

Se vi vedete, taggatevi :-)




Ancora una volta grazie a tutti i partecipanti, agli sponsor e agli speaker intervenuti!