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 I, questo 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!

mercoledì 11 giugno 2014

DelphiDay Italia: buongiorno! App per iOS e Android!

Ci siamo, è il gran giorno! :-)

Buongiorno a tutti i partecipanti del DelphiDay Italia 2014!

Con un tempismo perfetto (ehm...), Apple ha approvato la nostra App (già disponibile da qualche giorno su Google Play Store per i dispositivi Android)!



Ecco i link per scaricarla (vi offre il programma della giornata, i riferimenti dei nostri sponsors e la possibilità di valutare le sessioni, in forma anonima!).


Ci vediamo fra poco ! :-)

Andrea

mercoledì 4 giugno 2014

DelphiDay Italia: iscriviti oggi! E scarica la nostra App!

Oggi è l'ultimo giorno per iscriversi al prossimo Delphi Day Italia!

L'evento, organizzato da Wintech-Italia si terrà mercoledì 11 giugno a Piacenza e rappresenta il principale evento di incontro per i programmatori Delphi in Italia. Il giorno precedente sono in programma dei seminari su argomenti specifici.

Vi rimando, per tutti i dettagli al sito http://www.delphiday.it e vi segnalo che la nostra applicazione mobile è disponibile sul Play Store di Google.


Scaricatela per avere sempre a disposizione il programma della giornata e potrete valutare le sessioni secondo il vostro gradimento (in modo del tutto anonimo :-).

venerdì 30 maggio 2014

Personalizzare il Text di una TListView con MultiDetailAppearance

Durante lo sviluppo di una applicazione FireMonkey mobile è quasi impossibile non trovarsi nella situazione di voler personalizzare l'aspetto grafico di una TListView.

Questo accade generalmente perchè si vogliono mostrare più dati relativi ad un singolo Item, rispetto ai casi più semplici (dove basta impostare Text e magari DetailText).

Uno degli esempi forniti (già da XE4) da Embarcadero (c'è un articolo di Sarina DuPont a riguardo), mostra come sia possibile customizzare l'aspetto degli elementi di una TListView in modo da avere a disposizione più "DetailText", da collegare ad esempio attraverso l'uso dei LiveBindings alla nostra fonte dati (un dataset, per esempio).

Per chi usa RAD Studio XE6, l'esempio si trova nella cartella:

C:\Users\Public\Documents\Embarcadero\Studio\14.0\Samples\Object Pascal\Mobile Samples\User Interface\ListView

L'esempio è completo di un package SampleListViewMultiDetailAppearancePackage che registra nel vostro IDE una nuova ItemAppearance da applicare alla vostra ListView.



Manipolando le proprietà e gli oggetti del nodo ItemAppearance, è possibile personalizzare moltissimi aspetti del nostro TListViewItem, ad esempio il font (dimensione, colore, stili) e il posizionamento del testo (per ogni singolo Detail, usando allineamenti e tutte le altre opzioni come Opacity e WordWrap...).

Per esempio, possiamo dire che vogliamo colorare di rosso il primo Detail di ogni Item:



Forse per una svista, non è presente il nodo Text (al livello dei nodi MultiDetail1/2/3) e quindi non sembra possibile manipolare in alcun modo il testo principale degli item...

In realtà con una piccola modifica alla unit MultiDetailAppearanceU.pas e cioè semplicemente ripubblicando la proprietà Text della classe TMultiDetailItemAppearance e ricompilando il package SampleListViewMultiDetailAppearancePackage, otteniamo nuovamente il nodo Text (presente nelle ItemAppearance standard):

La modifica da effettuare: ripubblicare la proprietà Text di TMultiDetailItemAppearance

Il nodo Text è così visibile (dopo aver ricompilato il package) nell'Object Inspector

Diventerà così facilissimo modificare comodamente nell'IDE tutte le opzioni di Text e ottenere un aspetto personalizzato del testo principale degli item della TListView (con MultiDetailAppearance).

Ad esempio ho impostato che il Text fosse verde e grassetto:


Spero possa esservi utile!

A presto,
Andrea