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