lunedì 24 marzo 2014

Leggere e produrre Barcode con Delphi XE5 (Android)

UPDATENuovo blog post con la versione XE7

Introduzione

Esistono online diversi articoli che parlano di come integrare la lettura di codici a barre in applicazioni mobile Delphi (trovate dei link anche nel seguito di questo post).

Vedremo ora un approccio che permette di aggiungere le funzionalità di scansione e produzione di codici a barre (e/o QR code) in una app Delphi (Android), senza necessità di installare componenti di terze parti o compilare nella vostra app librerie di terzi.

Tutto si basa sull'interazione, mediata dal sistema operativo, con una applicazione già esistente (molto diffusa, gratuita e disponibile su Google Play Store) che si chiama Barcode Scanner (dettagli sulla licenza qui).

A costo di un certo livello di dipendenza da questa applicazione di terzi, il beneficio è di poterla sfruttare al massimo con poco sforzo, realizzando facilmente funzionalità che potrebbero essere sufficienti in un buon numero di situazioni.

Pro e contro

Vi anticipo subito quali sono i pregi/difetti di questo approccio:

Contro

  1. Si genera una dipendenza con Barcode Scanner (anche se solo per quanto riguarda le funzionalità di lettura/produzione di barcode, non per l'esecuzione in sè della vostra app): i vostri utenti dovranno installare sui loro dispositivi anche questa applicazione (attualmente gratuita);
  2. La funzionalità di lettura (scan) dei barcode si basa sull'assunto che Barcode Scanner di chiuda dopo aver scansionato un codice e copi il codice letto nella clipboard del dispositivo; se future versioni dell'applicazione dovessero comportarsi diversamente, la vostra applicazione potrebbe non funzionare;
  3. questa soluzione non è crossplatform (è valida solo per Android)

Pro

  1. Tutta la complessità di implementazione viene delegata a Barcode Scanner (incluso il supporto a numerosi formati di codici a barre e la gestione della camera);
  2.  Non è necessaria alcuna libreria di terze parti da compilare con la vostra applicazione;
  3. Sia la lettura che la produzione di codici a barre si risolve con una manciata di righe di codice!

Altri approcci e link di riferimento

Intent

Un Intent è sostanzialmente una descrizione di una operazione da compiere. Le applicazioni Android (activity) possono interagire attraverso gli intent (chiamandoli e registrandosi per servirli) un po' come le applicazioni Win32/64 possono interagire tramite ShellExecute o CreateProcess.
In Delphi sono presenti delle unit che ci aiutano a maneggiare direttamente i wrapper delle classi Java interessate e che ci permettono di effettuare le necessarie conversioni di tipo fra i tipi di dato Delphi e quelli Java. In particolare sono tre le unit che ci serviranno:

  1. Androidapi.JNI.GraphicsContentViewText, dove è definito il wrapper JIntent;
  2. Androidapi.JNI.JavaTypes, dove troviamo SharedActivity (una JActivity);
  3. FMX.Helpers.Android, che offre funzioni di utilità come StringToJString.
Una volta incluse queste unit, siamo in condizione di dichiarare ed eseguire un intent.
Come potete vedere in questo file Java di Barcode Scanner, essa espone diversi intent fra cui uno per avviare una scansione di un codice a barre e uno per produrre un codice a barre partendo da un contenuto testuale fornito nei parametri dell'intent.

Primo step: produzione di un codice a barre

Con queste poche righe di codice possiamo preparare ed eseguire l'intent ENCODE di Barcode Scanner:

procedure TForm1.ButtonProduceClick(Sender: TObject);
var
  Intent: JIntent;
begin
  Intent := TJIntent.JavaClass.init(StringToJString('com.google.zxing.client.android.ENCODE'));
  Intent.setPackage(StringToJString('com.google.zxing.client.android'));

  Intent.putExtra(StringToJString('ENCODE_TYPE'), StringToJString('TEXT_TYPE'));
  Intent.putExtra(StringToJString('ENCODE_FORMAT'), StringToJString(ComboBoxFormat.Items[ComboboxFormat.ItemIndex]));
  Intent.putExtra(StringToJString('ENCODE_DATA'), StringToJString(Memo1.Lines.Text));

  SharedActivityContext.startActivity(Intent);
end;


  • Il valore ENCODE_DATA rappresenta il contenuto che vogliamo rendere con il barcode (ed è il contenuto di un memo presente sulla form della nostra applicazione);
  • ENCODE_FORMAT rappresenta il tipo di codice a barre che vogliamo produrre (nel nostro esempio è preso da un combobox sulla form). I formati supportati attualmente sono i seguenti:
    "UPC_A", "UPC_E", "EAN_8", "EAN_13", "CODE_39", "CODE_93", "CODE_128", "ITF", "RSS_14", "RSS_EXPANDED", "QR_CODE", "DATA_MATRIX".
Il risultato è che una volta lanciata l'activity descritta dal nostro intent, l'applicazione Barcode Scanner verrà eseguita e riceverà i parametri che abbiamo impostato nell'intent, producendo per noi un barcode del tipo specificato e con il contenuto indicato.



Secondo step: lettura di un codice a barre

Sfruttando un secondo intent disponibile, possiamo chiedere a Barcode Scanner di avviarsi in modalità SCAN, presentando all'utente la tipica interfaccia grafica per individuare con la camera un codice a barre e scansionarlo. Una volta acquisito il codice, l'applicazione emette un beep acustico e si chiude, dopo aver copiato negli appunti il valore scansionato. Questo fa sì che la nostra applicazione torni in primo piano.

Il codice per eseguire l'intent SCAN è il seguente:

var
  Intent: JIntent;
begin
  // empty the clipboard (to be sure not to match previous results)
  FClipBoardService.SetClipboard('');
  WaitingForResults := True;

  // launch Barcode Scanner in SCAN mode
  Intent := TJIntent.JavaClass.init(StringToJString('com.google.zxing.client.android.SCAN'));
  Intent.setPackage(StringToJString('com.google.zxing.client.android'));

  Intent.putExtra(StringToJString('SCAN_MODE'), StringToJString('ONE_D_MODE,QR_CODE_MODE,PRODUCT_MODE,DATA_MATRIX_MODE'));

  SharedActivityContext.startActivity(Intent);
end;

In teoria, il modo corretto di intercettare la fine dell'attività di scansione sarebbe implementare un gestore per onActivityResult ma questo comporta attualmente alcune complicazioni tecniche.
Usiamo quindi un semplice workaround: intercettiamo l'evento che ci segnala che la nostra applicazione è di nuovo in primo piano (ottimo articolo di Pawel Glowacki) e leggiamo il contenuto degli appunti per catturare il testo corrispondente al barcode letto da Barcode Scanner.

Codice per agganciare gli eventi dell'applicazione e per ottenere un riferimento alla clipboard:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FWaitingForResults := False;

  if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(FClipBoardService)) then
    raise Exception.Create('Cannot get access to clipboard service!');

  if not TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(FApplicationEventService)) then
    raise Exception.Create('Cannot get application event service');
  FApplicationEventService.SetApplicationEventHandler(ApplicationEventHandler);
end;

Codice per l'event-handler dei cambi di stato dell'applicazione:
function TForm1.ApplicationEventHandler(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
var
  LClipboardContent: string;
  LFound: Boolean;
begin
  case AAppEvent of
    aeBecameActive:
      begin
        if WaitingForResults then
        begin
          WaitingForResults := False;
          LClipboardContent := FClipBoardService.GetClipboard.AsString;
          LFound := LClipboardContent <> '';

          if LFound then
            Log('Scan successful: ' + LClipboardContent)
          else
            Log('Scan failed (please retry)');
        end;
      end;
  end;
  Result := True;
end;

La procedura Log non fa altro che scrivere nel Memo della form principale.



Conclusioni e materiale

Questo è tutto. Come vedete si tratta di poche righe di codice e il meccanismo è semplice ma efficace.
Se le vostre esigenze di leggere e produrre barcode non sono particolarmente eccessive, un approccio come quello illustrato dovrebbe essere una soluzione sufficiente nella maggioranza dei casi.

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

UPDATE: Nuovo blog post con la versione XE7

Buon lavoro e a presto!
Andrea

venerdì 14 marzo 2014

90 giorni al Delphi Day 2014 (save the date!)

Mancano (meno di) novanta giorni al Delphi Day 2014, l'evento annuale che rappresenta il punto di incontro degli sviluppatori Delphi in Italia!




Giunto alla sua tredicesima edizione, è organizzato da Wintech-Italia e si terrà (come di consueto) a Piacenza il giorno 11 giugno 2014. Non potete mancare! :-)


giovedì 13 marzo 2014

La roadmap di Delphi ed il nuovo Appmethod

Tempo di novità in Embarcadero: dopo aver annunciato la nuova roadmap di Delphi per il 2014 e oltre, un po' a sorpresa è arrivato l'annuncio di un nuovo prodotto, Appmethod.
Appmethod è un tool dedicato agli sviluppatori per generare applicazioni multi-piattaforma: Windows, Mac OS X, iOS, Android. Vi ricorda qualcosa? :-)

Vediamo nel dettaglio queste due novità.


Delphi (e C++ Builder) Roadmap

La nuova roadmap di Delphi pubblicata in marzo 2014 comincia con il consueto disclaimer:

Le funzionalità presentate nella roadmap non sono da considerare vincolanti per Embarcadero da sviluppare o inserire nel prodotto, il momento in cui appariranno nel prodotto può essere diverso da quanto riportato nella roadmap. Infine, Embarcadero si riserva il diritto di cambiare la roadmap in qualsiasi momento.

Funzionalità e tecnologie inserite nel prodotto nel 2013

Nel 2013 l'obbiettivo primario del team di RAD Studio è stato quello di inserire i processori ARM (e i sistemi operativi iOS e Android) come target per i compilatori e le librerie di supporto. In questo momento Delphi supporta sia iOS sia Android mentre C++ Builder solo iOS (Update 2). Le librerie includono FireMonkey (FMX), la libreria RTL, i componenti per l'accesso ai database (FireDAC), ecco l'elenco:
  • Supporto Delphi e C++ per iOS su processore ARM (compiler, linker, debugger)
  • Supporto Delphi per Android su processore ARM (compiler, linker, debugger)
  • Framework FMX per Android e iOS, incluse: RTL, database library e supporto per l'interazione con le API dei sensori mobile
  • Embedded InterBase per le piattaforme mobile (iOS e Android) in due versioni: IBLite free edition e l'avanzato InterBase ToGo edition
  • Nuova libreria FireDAC per l'accesso universale ai dati che supporta tutti i maggiori RDBMS
  • La nuova libreria REST client per connettersi con i servizi REST e le librerie cloud (sia per FMX che per VCL)
  • Supporto ad iOS 7

Funzionalità e tecnologie previste per il 2014

Il tema principale per RAD Studio nel 2014 è l'aggiunta del supporto ad Android per C++ Builder ed in generale una forte spinta per la qualità, le performance e la stabilità del prodotto (QPS), un continuo avanzamento del supporto multi-piattaforma sia del designer sia del runtime, migliorie sulle librerie di remoting e architetture multi-tier e, ultimo ma non ultimo, nuovi componenti e nuove funzionalità nella VCL, vediamo l'elenco:
  • Supporto per Android di C++ Builder
  • QPS (Quality, Performance, Stability)
  • Componenti per Advertising and Payments per le piattaforme Android e iOS
  • Miglioramenti per la libreria middleware DataSnap (performance, REST mapping, architectural improvements)
  • Ulteriori migliorie per supportare il paradigma del singolo sorgente su piattaforme multiple con un nuovo visual designer multi-device e nuovi componenti per l'interfacia utente
  • Componenti per il "Mobile Backend as a Service" (MBaaS), che si interfacciano con alcuni provider di questi servizi, ad esempio Parse and Kinvey
  • Interoperabilità tra applicazioni mobile e desktop!
  • Supporto specifico per Android KitKat (4.4)
  • Nuovo componente VCL per la Windows taskbar
  • Miglioramenti sugli stili VCL e sul supporto delle applicazioni VCL sui tablet Windows Intel con componenti specifici per gli stili e per i sensori
  • Supporto per i dispositivi indossabili Android (wearable devices) con particolari fattori di forma (vedi Google Glass)
  • Supporto ai moduli Apache HTTP server per WebBroker e DataSnap, mantenendo ovviamente il supoprto ISAPI IIS
  • Numerosi miglioramenti alla Run Time Library (RTL) implementati per tutte le piattaforme suportate, soprattutto nelle librerie XML, JSON e altre
  • Nuovi driver database per FireDAC e miglioramenti in quelli esistenti, supporto per nuove versione dei database già supportati
  • Supporto per le versioni future di Android e iOS che saranno annunciate da Google e Apple nel corso del 2014
  • Supporto Bluetooth per i dispositivi mobile
  • Una nuova release del compilatore C++ per Win32, con pieno supporto alle specifiche C++ 11
Il mio commento

Se Embarcadero conferma i due rilasci annuali, anche nel 2014 possiamo aspettarci 2 release di Delphi (RAD Studio) una in primavera e l'altra in autunno (le ipotizzo in base ai rilasci nel 2013 di XE4 e XE5) e quindi le features saranno spalmate sulle due release. Le mie preferite:
  • QPS! Una release focalizzata sulla qualità, sulle performance (soprattutto relative alla nuova piattaforma FireMonkey) e sulla stabilità generale del prodotto non può che far piacere
  • Migliorie per DataSnap sia come funzionalità che come performance
  • Gestione semplifcata per dispositivi con diversi fattori di forma / risoluzioni
  • Il supporto per dispositivi indossabili (Android) soprattutto per i Google Glass (è comunque già possibile compilare app per i GG anche con XE5)

Funzionalità e tecnologie previste dopo il 2014

  • Supporto per le versioni future di Android e iOS
  • Supporto per Linux (server-side) delle librerie DataSnap, WebBroker, RTL e database
  • Dispositivi indossabili e HUDs (Head-up Displays), quando diverranno disponibili, incluso dispositivi Android con fattori di forma particolari e relative API
  • Integrazione nativa e diretta con le nuove REST API, focalizzate in diverse aree dai sistemi automatizzati ai database NOSQL
  • Compilatore Mac OS X 64bit
  • Supporto per Windows 8 ARM/WinRT (Windows Phone e/o Windows RT desktop)
  • Avamzamenti e aggiunte ai componenti BAAS e Cloud
  • Supporto per le versioni future di Windows desktop che saranno annunciate nel 2014
  • Completa e semplificata libreria per la programmazione multi-thread (parallel computing library) per sfruttare completamente le moderne architetture multi-core
  • Android per la piattafroma Intel
Il mio commento

Le aree più interessanti (per me) sono il supporto a Linux (solo server-side) che include la libreria RTL ma anche WebBroker, FireDAC e soprattutto DataSnap, il supporto ai database NOSQL. Interessante anche la libreria per uno sviluppo multi-thread semplificato.
Altra piattaforma che seguo on interesse e che quindi vorrei veder supportata da Delphi è Android per Intel.

Non ci resta che aspettare il 2015 per vedere il futuro dello sviluppo cosa ci riserva!

Embarcadero Appmethod


Appmethod è un nuovo prodotto venduto (prossimamente) da Embarcadero che promette "Build Fast Apps Fast for Android, iOS, Windows and Mac". Se vi sembra che già esista uno strumento Embarcadero che fa esattamente queste cose, avete ragione ed il tool è RAD Studio (Delphi e C++ Builder).

Tecnicamente Appmethod condivide lo stesso IDE di Delphi e C++ Builder, la stessa libreria FM (FireMonkey), la stessa libreria di accesso ai dati, ecc... 
Sarà però possibile in Appmethod costruire solo applicazioni FireMonkey (FM) quindi non sarà presente il framework VCL e pertanto non sarà in alcun modo possibile ricompilare vecchie applicazioni Delphi basate, appunto, sulla VCL. Allo stesso modo non saranno presenti i framework COM, ActiveX il BDE e dbExpress.
Appmethod quindi si pone come soluzione per tutti quelli che devono costruire nuove applicazioni che sfruttino ad esempio le nuove tecnologie REST, SOAP e connettendosi a server middle-tier scritti con diversi strumenti.

Anche il modello di vendita si discosta nettamente da quello di Delphi, infatti oltre ad un'interessante versione free per singoli sviluppatori (con alcune limitazioni) è affiancata una versione individual/small team e una versione business che costeranno rispettivamente ($299/anno/sviluppatore/piattaforma) e ($999/anno/sviluppatore/piattaforma). La differenza tra le ultime due dovrebbero essere i servizi enterprise (Appmethod Enterprise Mobility Services). I servizi enterpise di appmethod possono essere classificati come MEAP, una serie di librerie che includono API Hosting, Data Access e Data Storage che possono servire per applicazioni mobile, desktop e web.


La mia personale opinione è che Appmethod non è solo una "ripacchettizazione" di RAD Studio, invece nell'ottica di nuovo sviluppo davvero multi-piattaforma (e soprattutto mobile) rappresenta un'offerta rivolta a tutti gli sviluppatori (al di fuori del mondo Delphi/C++ Builder) interessati a costruire in modo rapido e semplice applicazioni business per le diverse piattaforme (che ormai per noi utenti Delphi è una cosa normale!)

Links su Appmethod


Conclusioni

Di sicuro in Embarcadero non stanno con le mani in mano! Oltre ad inserire nuove funzionalità e supportare nuove piattaforme nel nostro Delphi e C++ Builder, cercano di allargare a tutti gli sviluppatori mondiali le tecnologie per la costruzione rapida di applicazioni multi-piattaforma creando nuove offerte e nuovi prodotti.



mercoledì 12 marzo 2014

Delphi IDE Shortcuts!

Spesso mi capita di scrivere del codice a fianco di altri sviluppatori Delphi (durante alcune sessioni demo o durante lo sviluppo vero e proprio). Una cosa divertente è che quasi sempre capita che, alternandosi alla tastiera, ci si fermi un attimo per "rubarsi" a vicenda le combinazioni di tasti utilizzate per velocizzare alcune attività.

L'IDE di Delphi infatti nasconde un numero considerevole di shortcut utilissimi. Brian Long e Cary Jensen (due eminenti figure della comunità Delphi internazionale) hanno fatto lo sforzo di raccoglierli in un unico documento.

Vi lascio il link al post Delphi Editor Key Combination Table Updated del blog di Cary Jensen che contiene un link al documento PDF (da appendere vicino al monitor!).

La mia top five:

  1. Ctrl + Shift + C, esegue class completion (funziona anche da implementation a interface!)
  2. Ctrl + Shift + Su/Giù, per navigare fra codice (implementation) e dichiarazioni (interface)
  3. Ctrl + Shift + J, avvia SyncEdit
  4. Ctrl + T, elimina la parola a destra del cursore (io lo uso a fine riga, per eliminare le righe vuote)
  5. Ctrl + Shift + T, aggiunge una voce TODO
Menzione speciale per il tasto F6 (o Ctrl + .) che invoca l'IDE Insight (utilissimo in varie occasioni).

A presto e buon lavoro!

Andrea 

domenica 2 marzo 2014

Delphi Porte Aperte: grazie!

L'evento Delphi Porte Aperte organizzato da Wintech-Italia a Padova il 25 febbraio scorso è stato un successo: tanti sviluppatori Delphi erano presenti e interessati alle ultime novità introdotte nel nostro ambiente di sviluppo preferito!

Se, come da aspettative, abbiamo registrato un forte interesse per le funzionalità mobile offerte da Delphi XE5,  ottimo è stato anche il riscontro per la libreria FireDAC e per la sessione conclusiva di Paolo, sulle nuove funzionalità del linguaggio e dell'IDE.

Ringraziando tutti i partecipanti, ne approfittiamo per lasciarvi qualche fotografia scattata durante l'evento (grazie Lorenzo):



Vi ricordo che sono ancora aperte le iscrizioni per i prossimi corsi, che si terranno a Padova nelle prossime settimane:
A presto!