martedì 11 febbraio 2014

Gli strumenti per potenziare l'IDE di Delphi (Parte 3 - CnPack)

Aggiornato Marzo 2016

La terza puntata di questa serie dedicata agli strumenti per potenziare l'IDE di Delphi prende in esame un nuovo interessante tool, CnPack
Nome:CnPack
Sito:http://www.cnpack.org/
Sito progetto:https://github.com/cnpack/
Licenza:Open Source
Prezzo:0€



CnPack IDE Wizards è un insieme di strumenti per Delphi e C++ Builder compatibile con Delphi 5 - Delphi 10 Seattle e C++ Builder 5 - C++ Builder 10 Seattle tesi ad aumentare la produttività dell'IDE tramite "wizard" (così sono chiamati i singoli tool dal team di CnPack) e vari miglioramenti di diverse funzionalità.


Oltre ad essere gratuito è anche un progetto OpenSource ospitato su Google Code, quindi potete:

  1. Modificare parti dei tool che non vi piacciono o implementare nuove funzionalità.
  2. Migliorare la vostra conoscenza sulle Tools API e in generale sul codice ad un livello abbastanza elevato.

Menu

Come potete vedere dalla figura qui sotto i wizard (tool) di CnPack sono davvero numerosi.


In questo articolo, come nei precedenti presenterò una selezione (tuttavia abbastanza completa) di questi wizard che sono quelli che uso maggiormente io. Vi invito comunque ad esplorarli uno ad uno per trovare quelli che velocizzeranno maggiormente il vostro lavoro. La documentazione, nella forma di un file di Help agganciato alle finestre (invocabile con il classico F1) è molto buona soprattutto per un progetto Open Source.

Toolbars



Un aspetto interessante e da non sottovalutare sono le toolbar che vederete apparire una volta installato CnPack. Offrono i comandi accessibili in modo diretto ed intuitivo e soprattutto il vedercele davanti ci fanno ricordare che abbiamo a disposizione e a portata di "click" numerosissimi tool che ci offrono aiuto.

Source Highlight

Il cambiamento più evidente appena installato CnPack lo noterete aprendo un qualsiasi vostro sorgente.
Se avete unit (form) con codice con diversi cicli annidati, diversi costrutti if-then-else o istruzioni case complesse, provate ad aprirla e guardate di nuovo il codice... notate cambiamenti?


Come vedete nela figura sopra, tutti i blocchi di codice sono colorati in modo diverso e i begin..end sono uniti da linee (dello stesso colore) che mostrano alla prima occhiata l'indentazione e quindi il flusso del codice!

POtete notare anche l'evidenziazione di un identificatore (nell'esempio LSubIndex) che anche in questo caso mostra alla prima occhiata dove è stato usato

Come tutti i wizard di CnPack potete personalizzarne il comportamento e l'aspetto in modo significativo tramite la voce di menu Options, in questo caso potete  scegliere lo stile delle linee e il colore di evidenziazione degli identificatori (e se abilitare la funzionalità o meno).


Un inconveniente di questa funzionalità è che ovviamente richiede un certo tempo di calcolo e di rendering per mostrare la colorazione e l'evidenziazione e questo lo si può avvertire se avete unit di grandi dimensioni, proprio per questo potete notare l'ultima voce delle opzioni Disable Highlight when Unit Lines Exceeds che dice al wizard di disabilitare il syntax highlighting per le unit grandi dimensioni.

P.S.: Nel caso di unit "giganti" sarebbe opportuno provvedere ad una rifattorizzazione della stessa: imparate bene i comandi di refactoring e... via alle modifiche!


Form Design Wizard



La funzione più importante del Form Design Wizard, che potete avere anche come toolbar (molto più utile infase di design visuale), è quella di allineare, spostare e modificare i componenti sulla form, offrendo molte più opzioni rispetto alla toolbar di allineamento di Delphi.

Locate Components


Se avete form con molti componenti anche nascosti questa è l'utility che fa per voi, questa dialog vi consente infatti di cercare (filtrando per nome) tutti i componenti, visuali e non, che avete sul form. Una volta selezionato il componente dalla lista CnPack lo seleziona.

Convert to Code


Simile alla funzionalità "Components to Code" di GExperts questo wizard è utile per convertire un componente piazzato a design time in un blocco di codice per definirlo e inizializzarlo a run-time. La cosa in più rispetto a GExperts è la possibilità di copiare separatamente nella clipboard la definizione e l'inizializzazione. Anche il codice generato è migliore con commenti e soprattutto hanno evitato di usare il with, da molto considerato... il male!

Coding Toolset

I coding toolset sono per la maggior parte comandi che vi aiutano e assistono nella scrittura del codice, sono lanciati per lo più con tasti rapidi e quindi al prezzo di memorizzare altre scorciatoie da tastiera rendono alcune tra le più noiose operazioni quasi... divertenti!

Convert to String

Quante volte vi siete trovati nella condizione di dover riportare nel codice sorgente (ad esempio) uno statement SQL molto lungo e complesso? Sapete già che per formattarlo decentemente tra doppie virgolette, fine linea, indentazioni si spreca una quantità di tempo incredibile!

E se vi dicessi che CnPack ha un tool che fa esattamente questo?


La prima finestra mostra uno statement SQL scritto in un editor esterno la seconda immagine è presa da Delphi dopo che avevo incollato e convertito lo statement sopra, nessun altra operazione di editing è stata fatta!
Il tool in questione è il Convert to String che trovate sotto al menu Code Editor Wizard. Il tool è anche configurabile dalle opzioni di CnPack.

Eval Swap

Scambia le espressioni in un blocco di codice selezionato, ad esempio da A := B; a B := A; molto utile nei casi di load/save di dati (ad esempio da un dataset)

Toggle Uses/Include

Quando state scrivendo codice e avete bisogno di usare una funzione che si trova in una unit che non è ancora nelle clausole uses, il workflow più breve è questo: (se siete bravi ad usare i bookmark dell'IDE)

  1. salvo il bookmark alla posizione corrente
  2. vado in interface o implementation (se la unit è grande devo inoltre usare un cerca) 
  3. scrivo la unit nella clausola la uses
  4. ritorno al bookmark salvato
  5. cancello il bookmark
Usando la funzionalità Toggle Uses/Include per arrivare allo stesso punto:
  1. premo Ctrl-Alt-U 
  2. scrivo il nome della unit da usare 
  3. premo Esc ed è tutto fatto
Facile vero? Moltiplicate il tempo per le migliaia di volte che avete eseguito questa banale ma tediosa operazione e ditemi quanto tempo avreste risparmiato usando questo wizard! :-)

Toggle Var Field

Questa funzionalità e simile alla precedente solo dedicata alle variabili locali. Premete Ctrl-Shift-V e CnPack porta in cima alla funzione, se non c'è la parola chiave var, la aggiunge voi scrivete il nome ed il tipo della variabile e premendo Esc ritornate a lavorare.

Jump to Intf, Jump to Impl, Jump to Matched Keyword Tool 

Comandi comodi per saltare alla parte di interface/implementation di una unit, utile per gestire le clausole uses. I comandi sono invocabili anche dai pulsantini sulla toolbar.

Jump to Previous Identifier, Jump to Previous Identifier

Questa è un'altra funzione per cui vale la pena di installare CnPack (almeno per me). Usando Ctrl-Alt-Up e Ctrl-Alt-Down è possibile navigare all'interno di una unit selezionando l'identificatore (in realtà semplicemente una stringa di testo) precedente o successivo. Quindi se sono posizionato su una certa parola premendo Ctrl-Alt-Up mi sposterò nelle righe precedenti che contengono questa parola e premendo Ctrl-Alt-Down mi sposterò nelle righe successiveche contengono questa parola.

Con questa funzionalità l'uso della funziona ricerac si è drasticamente ridotto (nel mio caso) visto l'incredibile comodità di questo wizard.

Collector


Il collector è un utile strumento che consente di aver vari "snippet" di testo tutti in un unico posto, dimeticatevi di copie del notepad aperte e pezzi di codice che si perdono.. In collector potete avere più tab aperti, prendere codice dall'IDE e incollarlo nell'IDE.


MessageBox


Quando devi costruire le DialogBox non ti ricordi mai gli enumerativi dei pulsanti e delle icone? non ti ricordi le costanti dei valori di ritorno?

Beh allora devi proprio usare il wizard MessageBox di CnPack che visualmente ti aiuta a creare la tua Message Dialog senza impazzire tra opzioni e costanti impossibili da ricordare.

In aggiunta permette di scegliere tra diverse API per invocare la finestra: la MessageDlg di Delphi, Application. MessageBox oppure la MessageBox API, ovviamente pensa lui a cambiare tipo di parametri, effettuare conversioni di tipo ecc... tutto quello che dovete fare è premere il pulsante OK ed il codice apparirà come per incanto nell'editor.

Replace in Files


Ricercare e sostituire testo in file diversi non è mai stato così semplice. Con questo tool è possibile applicare trasformazioni di testo ad un insieme anche grande di file in un'unica operazione. Sebbene questo tool sia molto potente e  semplice da usare io preferisco il "Grep Search" di GExperts (vedi precedente articolo)

Tab Orders

Una corretta impostazione del Tab Order all'interno delle proprie form è molto importante per permettere all'utente di navigare da tastiera la nostra applicazione e riuscire ad effettuare data-entry il più velocemente possibile ma, ahimè, è anche molto facile dimenticarsi alla fine della progettazione della form di impostare correttamente l'ordine.


Il wizard Tab Orders di CnPack ci viene in aiuto in diversi modi:

Visualizzazione

Per visualizzare il numerino corrispondente all'ordine del controllo direttamente sul form la voce di menu è Display Tab Orders

Modifica

Per modificare l'ordine sulla form corrente, su tutte le form aperte o su tutte le form del progetto seguendo regole impostabile dal sottomenu Options

Auto aggiornamento

Per aggiornare automaticamente il Tab Order ogni volta che aggiungo un controllo sulla form dovete spuntare la voce di menu Auto Update Tab Orders
    Con l'ausilio di questo tool non potete più dire di esservi scordati l'impostazione del Tab Order!

    Source Templates


    Con questo semplice tool è possibile applicare template, soprattutto per commenti, al sorgente. Esempi possono essere l'intestazione della unit oppure l'intestazione di procedure e funzioni ecc...

    Convenzioni e stile di programmazione

    Prima di introdurre il Prefix Wizard ritengo necessarie due parole su un aspetto importante (non solo in Delphi) ma spesso trascurato: le convenzioni per l'assegnazione dei nomi alle variabili, campi, classi e componenti, e più in generale lo stile di scrittura del codice sorgente, che non può e non deve essere lasciato al caso o alle preferenze personali (pure legittime) del singolo programmatore soprattutto se facente parte di un team.

    L'argomento è piuttosto vasto ed intendo, prossimamente, scrivere un articolo dedicato, qui metterò invece i punti salienti.

    Le "Coding Conventions" sono un insieme di regole o meglio ancora un insieme di linee guida che coprono: le convenzioni di nome per gli identificatori, la scrittura dei commenti, l'indentazione, ecc...
    Il primo testo sull'argomento è stato pubblicato nel 1978, si chiama The Elements of Programming Style di Kernighan e Plauger ed il libro è una sorta di "introvabile" infatti le copie nuove arrivano fino a 200$!
    Pur avendo una 30ina d'anni gli argomenti sono ancora di attualità visto che a distanza di tutto questo tempo la maggior parte dei programmatori continua a non seguirli!

    Le principali regolette che enuncia il testo sono tutt'altro che complicate da mettere in pratica, le mie preferite:
    1. Use variable names that mean something.
    2. Format a program to help the reader understand it.
    3. Write clearly, don't sacrifice clarity for efficiency
    4. Let the machine do the dirty work.
    5. Choose variable names that won't be confused.
    6. Write first in easy-to-understand pseudo language; then translate into whatever language you have to use.
    7. Modularize. Use procedures and functions. (e visto che Delphi è un linguaggio ad oggetti: classi)
    8. Don't patch bad code -- rewrite it.
    9. Test input for plausibility and validity.
    10. Make sure all variables are initialized before use.
    11. Make it right before you make it faster.
    12. Make it fail-safe before you make it faster.
    13. Make it clear before you make it faster.Don't strain to re-use code; reorganize instead.
    14. Instrument your programs. Measure before making efficiency changes.
    15. Make sure comments and code agree. :-)
    16. Don't just echo the code with comments -- make every comment count.
    17. Don't comment bad code -- rewrite it. (una delle mie preferite!)
    e per ultimo quella che riesco a seguire:
    1. Don't over-comment. (tranquilli, non mi capita mai! ;-) )

    Se notate ai primi due posti ci sono le regole per il naming e di formattazione che sono le due regole che CnPack ci aiuta a seguire.

    Come nominare le variabili e i componenti?

    La notazione più famosa è la "Hungarian Notation" introdotta da Charles Simonyi diventato poi Chief architect in Microsoft (gli effetti di questa notazione li vediamo nel nome dei parametri della API Windows e nei tipi di dato del registry).
    Sostanzialmente la regola dice di prefissare le variabili con il tipo del dato da esse rappresentato quindi lParam è un parametro di tipo long, szParam è un parametro di tipo stringa e così via...

    Parlando di Delphi ritengo questa regola molto utile per nominare i componenti visuali messi sul form, meno per le variabili, i campi e le proprietà che a mio avviso devono seguire una differente notazione (il prefisso, IMO, deve indicare lo "scope" F per i campi di classe, L per le variabili locali, ecc... ma questo non è l'argomento di questo articolo).
    Altra regola è quella di dare (oltre al prefisso) un nome "decente" ai vostri componenti, non avrete mica Button1..Button37 sulle vostre form vero?? :-)

    Beh se così fosse troverete nel Prefix Wizard un valido alleato per aiutarvi a superare la tipica pigrizia del programmatore.

    Prefix Wizard

    Questa funzionalità penso sia la più amata e assieme la più odiata di CnPack. Il wizard permette di rinominare i componenti sul form per aggiungere un prefisso secondo regole impostabile dall'utente.
    Le tre modalità di nomina dei componenti sono:

    Prompt


    Con le impostazioni di default una volta installato CnPack noterete che ogni volta che piazzate un controllo su una form vi appare una finestrella che vi chiede di impostare il nome del componente (e questa è la parte più odiata perchè, per chi installa CnPack e non conosce ancora la funzionalità, questi ulteriori passi sembrano un'inutile complicazione)
    La prima finestra vi chiede di inputare il nome del componente mettendo un prefisso di default per il tipo di componente, se non vi piace il prefisso premete il pulsante Modify Prefix e lo cambiate ad questa dialog. 

    Automatic


    Nella finestra delle opzioni basta togliere il check alla voce Show Dialog when Add New Component or Rename e quando si mettono nuovi componenti sul form questi verranno automaticamente nominati.

    Io non consiglio questa modalità perché benché i componenti abbiano il prefisso "giusto" questi verranno nominati (ad esempio per i pulsanti) btn1, btn2, ecc... vanificando l'obbiettivo di avere componenti con nomi "sensati" btnSalva, btnVerifica, ecc...

    Manual


    Il prefisso dei componenti si può cambiare manualmente, e soprattutto, processando tutti i componenti del form corrente, di tutte le form aperte o di tutte le form del progetto o del gruppo di progetti.

    Una volta confermata questa dialog, se ci sono componenti da processare (che hanno prefisso diverso da quello voluto), vengono mostrati nella seguente finestra da dove è possibile variare anche il nome del componente stesso.


    Property Corrector

    Avere la connessione ad un database aperta a design-time è una delle feature più comode di Delphi (che altri importanti strumenti di programmazione hanno copiato solo nelle ultime versioni mentre i programmatori Delphi l'hanno usata fin dalla prima versione). Vedere i dati nelle griglie e negli altri controlli è davvero impagabile! Peccato che (almeno a me) è successo più di una volta (per mia disattenzione) di mandare al cliente l'applicativo che appena lanciato tenta di connettersi a localhost (o qualsiasi altro indirizzo usato per lo sviluppo) perchè ci siamo dimenticati di mettere a false la connection al database.


    Con questo wizard è possibile processare tutti i componenti sulla form o su tutte le form del progetto e settare automaticamente le proprietà a valori voluti. Oltre alle connessioni database questo wizard può essere utile anche per settare la posizione delle form, o impostare in un sol colpo l'altezza dei pulsanti , ecc... 

    Sebbene questo wizard sia utile e potente i GExperts hanno un tool simile che però viene invocato direttamente in compilazione e quindi ci solleva dalla responsabilità di ricordarci di lanciare il wizard.

    Project Enhancements


    Browse Current File's Dir, Browse Project Dir, Browse Output Dir

    Comandi comodi per saltare direttamente ai folder più usati in un progetto.

    List Units, List Forms, List Used



    Altro wizard (per me) insostituibile. Le finestre che vedete sopra si sostituiscono alle dialog standard di Delphi View Unit (Ctrl-F12), View Form (Shift-F12).
    Come potete notare già dalle schermate sono molto più potenti rispetto a quelle standard, supoprtano la ricerca inline, come testo contenuto o iniziale, permettono di filtrare l'elenco sul progetto attivo o su tutti i progetti del project group e molto altro.
    Come dovete fare per invocarle? Nulla, quando installate i CnPack queste finestre vengono mostrate al posto di quelle standard ed invocate dalla stessa combinazione di tasti. Ovviamente potete disabilitarle e tornare alle precedenti... 
    Ma perchè mai? :-)

    Project Backup


    Comodo per effettuare velocemente un backup di tutto il progetto, è possibile anche aggiungere file che non appartengono in senso stretto al codice sorgente.

    Ricordo che comunque questo tool non è un rimpiazzo per un version control che rimane lo strumento principe per la gestione della storia del proprio codice sorgente.

    Project CleanUp


    Altro wizard molto comodo e di immediata comprensione, con in più la possibilità di non cancellare dcu/obj se non esistono i corrispondenti file sorgenti.

    Project Dir Builder

    Quando si hanno diversi progetti all'attivo è prassi comune standardizzasi su un layout di progetto pensato e ben definito, sfruttando poi la possibilità di Delphi di mettere nei path percorsi relativi un layout come quello che vedete in figura sopra (che solitamente adotto io per i miei progetti)  aiuta a rendere la gestione (version control, deployment, ecc...) operazioni gestibili automaticamente, quindi scriptabili, quindi automatizzabili.


    Questo wizard permette di definire vari layout di progetto e poi applicarli ad una directory (creerà per voi tutta la struttura ad albero)

    INI Reader & Writer (Menu Repository List)

    Adesso uso sempre meno i file INI visto che da anni ho costruito classi che gestiscono la configurazione in XML dei miei applicativi ma quante volte avete scritto righe e righe di codice sempre uguale che legge/scrive i valori in un file INI? Se siete programmatori da più di qualche giorno il numero sicuramente è dell'ordine delle migliaia!


    Questo wizard è in grado di prendere come input un normalissimo file INI con multiple sezioni, valori, ecc... e generare una unit pascal con una classe pronta all'uso solamente referenziando le proprietà (che ovviamente si chiameranno come le voci del file INI).
    Avercelo avuto prima, vero? :-)

    Explorer


    Wizard molto comodo per avere smepre a fianco una vista sulle directory del progetto. La finestra è una finestra explorer-like e il click destro sugli elementi apre il normale menu contestuale di windows.

    Historical File Snapshot


    Permette di salvare i file più usati in un progetto e successivamente riaprirli senza tutte le volte aprirli manualmente uno per uno, soprattutto se i file da aprire non sono aggiunti alla lista del dpr ma sono solamente nel search path del progetto.

    Procedure List

    Parecchio utile per navigare il codice sorgente in modo potente e facile allo stesso tempo. In questo caso già i tasti rapidi di Delphi Ctrl-Shift-Up/Down rendono la navigazione nel codice sorgente davvero immediato ma questo expert aggiunge un'interfaccia visuale che a volte è comoda per "vedere" in un'unica occhiata i metodi di una classe.


    Anche se altri tool hanno strumenti simili (i GExperts hanno appunto la "Procedure List") ma questo è a mio avviso il più completo e il più comodo.
    In più questo wizard aggiunge la funzionalità anche alla toolbar per un uso ancora più immediato.


    Uses Clean


    Molto comodo quando si cambiano spesso componenti su un form. Si corre il rischio di includere unit non più necessarie, quindi ricordatevi di lanciare questo wizard almeno prima di effetuare le build definitive per fare un poco di pulizia.

    IDE Enhancements


    Code Input Helper

    Una sorta di CodeComplete (a mio avviso più veloce e completo), funziona per tutti questi casi:
    • When input in the uses section, all unit names available will be listed.
    • Compiler directives. When input '{$', all compiler directives will be listed.
    • Comments in XML Style. When input '///', all comment templates in XML Style will be listed.
    • Comments in JavaDoc Style. When input '{*', all comment templates in JavaDoc Style will be listed.
    • Code Templates defined in IDE. Such as trycf, forb and etc.
    • User-defined identifiers, compiler directives, comment templates, code templates and etc.
    • Macros are supported in code template.
    Trovo insostituibile il completamento automatico nella scritture delle unit nelle uses (qui il completamento di Delphi non è così preciso e potente), nella scrittura delle direttive del compilatore (io uso parecchio le {$REGION ...} per comodità di lettura del sorgente) e nella scrittura dei TODO perchè digitando //t questo wizard mi prepara una riga TODO standard con data/ora utente e mi posiziona nel punto in cui devo inserire la descrizione.
    Questo wizard è inoltre davvero molto configurabile con la dialog delle opzioni.


    Editor Enhancements Wizard

    Questo wizard contiene diverse funzionalità per arricchire l'editor, le toolbar, ecc...
    Le opzioni sono davvero tante, vi consiglio di guardarle tutte perchè davvero possono aiutarvi a digitare codice molto più velocemente.

    IDE Config Backup/Restore

    Questo è un tool importantissimo perchè vi può salvare diverse ore di configurazione di una nuova installazione di Delphi e permette di effettuare un backup (in un formato binario) di tutti i settaggi dell'IDE di Delphi).


    Questa operazione è in realtà molto semplice per chiunque abbia un minimo di dimestichezza con il Registry Editor di Windows, infatti basta salvare le chiavi di registro di Delphi a patto di conoscerne la locazione ed il significato (la gestione delle chiavi di registry di Delphi sarà oggetto di un prossimo articolo sul blog)   

    Se invece non volete preoccuparvi di queste cose semplicemente usate questo Expert che in più vi da la possibilità di eliminare quelle chiavi usate solo per salvare la history dei file o delle operazioni fatte.


    CnPack Options

    Dopo anni di uso dei CnPack non ho (nemmeno lontanamente) visto e cambiato tutte le opzioni che mostrano le finestre dei settings! Divertitevi! :-)


    Conclusioni

    Ricordo ancora che i wizard di CnPack sono molti di più rispetto a quelli presentati in questo articolo, vi esorto a provarli per trovare quelli migliori per voi.

    Nel prossimo articolo prenderemo in esame uno strumento che si occupa della gestione dei commenti/documentazione: DevJet DocumentInsight.

    Se avete quesiti o proposte di recensione di altri tool scrivetemi o lasciate un commento su questo blog.

    venerdì 31 gennaio 2014

    Evento Delphi Porte Aperte - Padova, 25/02/2014

    Come ogni anno, Wintech-Italia organizza "Delphi Porte Aperte", un evento gratuito per incontrare la comunità Delphi e illustrare le novità introdotte con le ultime versioni del prodotto.

    L'evento si svolgerà nel pomeriggio del 25 febbraio 2014, presso l'Hotel Sheraton di Padova (lo stesso dell'anno scorso).

    Visto il successo dell'iniziativa negli anni precedenti, vi invitiamo a registrarvi il prima possibile (l'evento è gratuito ma la registrazione è obbligatoria) usando l'apposita pagina sul nostro shop.

    Vi riporto di seguito il programma della giornata e vi rimando alla pagina di informazioni sul sito Wintech per ulteriori dettagli.




    14:00Registrazione dei partecipanti
    14:30Delphi: Presente e Futuro
    Paolo Rossi - Wintech Italia
    Un'esauriente chiacchierata sulle novità (non solo tecniche) di Delphi e tecnologie correlate
    15:05Sviluppo mobile (Android e iOS)
    Andrea Magni - Wintech Italia
    Delphi XE5 permette di sviluppare applicazioni mobile native per le due principali piattaforme esistenti: Google Android e Apple iOS. Questa sessione offre una panoramica su come sfruttare al massimo le potenzialità offerte dal nostro ambiente di sviluppo nelle fasi di sviluppo e deploy delle nostre app
    16:00Coffee Break
    16:20FireDAC per applicazione VCL e FMX
    Andrea Magni - Wintech Italia
    FireDAC è la nuova libreria di Delphi per l'accesso ai dati universale, che permette di sviluppare applicazioni per dispositivi diversi (PC, tablet e smartphone), fornendo accesso nativo a molti database
    17:10Live Binding e altre funzionalità del linguaggio
    Paolo Rossi - Wintech Italia
    Il linguaggio di Delphi è ormai uno dei più avanzati linguaggi di programmazione esistenti nel panorama di oggi, vediamo come usarlo per costruire le applicazioni del futuro!
    17:50Domande e discussione finale
    Spazio per le vostre domande
    18:15Conclusione





    martedì 21 gennaio 2014

    FreeDrawing: disponibile su Apple Store e Google Play Store!

    FreeDrawing è una app per dispositivi mobile (iOS e Android) che ho sviluppato con Delphi XE 5, ne avevo parlato in un precedente blog post e da qualche giorno è disponibile pubblicamente su entrambi gli store di Apple e Google.

    Link alla pagina web del Google Play Store (per dispositivi Android):
    https://play.google.com/store/apps/details?id=eu.andreamagni.FreeDrawing

    Link alla pagina web di iTunes App Store (per dispositivi Apple):
    https://itunes.apple.com/us/app/freedrawing/id791419335?l=it&ls=1&mt=8

    Nel (poco) tempo libero a disposizione, ho aggiunto (rispetto a quanto descritto su questo blog in precedenza) la funzione "Ricalca" che permette all'utente di avere un'immagine (fotografia o immagine presa dalla propria galleria del dispositivo) "in sovraimpressione" per poter appunto "ricalcare" l'immagine e comporre così più facilmente un bel disegno (provate a fare qualche ritratto/caricatura!).

    Per il resto, ho ancora qualche idea e c'è ovviamente molto margine di miglioramento della app ma più che altro mi interessava fare esperienza "sul campo" sia con lo sviluppo multipiattaforma (iOS e Android) che con la pubblicazione delle app sui due principali store esistenti.

    Sviluppo multipiattaforma

    Delphi ha mantenuto la sua promessa: ho due applicazioni per piattaforme (molto) differenti compilate a partire dalla stessa base di codice e il 99% del codice è semplicemente lo stesso.
    Ho dovuto solo ricompilare selezionando la target platform opportuna, il resto del lavoro l'ha fatto FireMonkey che mi ha offerto tutti gli strumenti necessari per realizzare l'applicazione senza dovermi preoccupare dei dettagli specifici di ogni sistema operativo.

    Ho anche usato la Mobile Preview (introdotta con XE5 Update 2), che mi ha semplificato lo sviluppo delle parti meno interattive della app (es. il drawer e i controlli legati alle opzioni di disegno).

    Deploy su Google Play Store e Apple App Store

    Se avete già usato Delphi per lo sviluppo mobile, saprete che è semplicissimo (NB: questa affermazione vale di più se si pensa al mondo Android :-) ) sviluppare una propria applicazione ed averla in esecuzione su un dispositivo fisicamente connesso al proprio computer.
    Il modo ufficiale però di distribuire un'applicazione mobile è quello di pubblicarla sugli store delle due principali piattaforme esistenti (iOS e Android) e quindi esistono procedure precise che il programmatore deve seguire per la pubblicazione.

    Embarcadero offre una esaustiva documentazione su come fare in entrambi i casi:


    Google Play Store:

    Sostanzialmente, in entrambi i casi dovete essere degli "sviluppatori registrati" (per Apple, dovete aderire all'Apple Developer Program e pagare un abbonamento annuale, per Android dovete registrarvi e pagare una tantum una cifra molto più esigua) e dovete "firmare" la vostra applicazione in modo che sia riconoscibile e che possiate per esempio erogare degli aggiornamenti della stessa.
    In entrambi i casi Delphi vi offre un ottimo supporto, accogliendo tutte le informazioni necessarie (anche se ovviamente dovrete registrarvi sui portali di Apple e Google e dovrete procurarvi gli ID e i certificati per la firma delle applicazioni in modo standard) e preparando i binari (gli "eseguibili") sul vostro disco pronti per essere utilizzati.

    Una differenza significativa fra i due mondi (iOS e Android) è che le applicazioni iOS vanno caricate sull'App Store (come quelle Android su Play Store) ma sono soggette a revisione da parte di personale Apple e quindi è necessario considerare che questa operazione richiede qualche giorno (nella mia esperienza, 4-5 giorni ogni volta).

    Di seguito, vi lascio qualche screenshot sia di iTunes Connect (il portale Apple per lo sviluppatore) che della Developer Console di Google:

    Application Loader: una applicazione Mac (desktop) che permette di caricare l'app iOS (in formato IPA) su iTunes Connect
    Google Play: developer console

    Google Play Developer Console: sezione per il caricamento del APK Android

    iTunes Connect: la pagina principale

    iTunes Connect: la scheda dell'applicazione FreeDrawing

    iTunes Connect: la sezione per il caricamento di nuovi aggiornamenti dell'app

    Approfondimenti

    Alcuni spunti che spero di approfondire magari nei prossimi post:
    • ho dovuto modificare un po' il file manifest Android per ampliare il numero di dispositivi compatibili (non per la compatibilità effettiva ma per quella "dichiarata" dal Play Store), in particolare ho dovuto introdurre la dichiarazione delle feature usate (al di là delle permissions);
    • ho corretto il targetSDKversion per eliminare il pulsante "Settings" che è legacy ormai (serve per restare compatibili con applicazione pensate per dispositivi Android con tasti fisici) ma questo ha uno spiacevole effetto collaterale (l'applicazione va in crash se si ruota il dispositivo);
    • ho fatto un po' di pratica con le funzioni di disegno sul Canvas FireMonkey e sulla gestione delle differenti densità di pixel dei vari dispositivi; 

    Conclusioni

    Sono molto felice di essere riuscito senza intoppi a realizzare un'applicazione mobile multipiattaforma e averla pubblicata con successo su entrambi gli store ufficiali.
    L'applicazione è molto abbozzata ma è possibile comunque divertirsi e realizzare disegni abbastanza carini e condividerli, provatela!

    Vi ricordo che sono sempre in programma, sul sito Wintech-Italia, corsi per lo sviluppo di applicazioni mobile: il prossimo si terrà il 4 e 5 febbraio! 

    martedì 31 dicembre 2013

    FreeDrawing: disegnare e scrivere a mano libera (Android e iOS)

    Una richiesta che spesso mi è stata fatta nelle ultime settimane è quella di poter far firmare un utente su un dispositivo mobile in una applicazione fatta con Delphi.
    Al di là delle questioni legali relative, ho pensato che potesse essere interessante realizzare un'applicazione mobile che permettesse di disegnare a mano libera (o con un pennino).

    Devo dire che è stato relativamente semplice, grazie agli strumenti messi a disposizione da FireMonkey.
    L'idea di fondo è quella di sfruttare l'evento OnMouseMove di una TImage e disegnare sul canvas della Bitmap della TImage stessa.

    Alcuni punti fondamentali che voglio brevemente evidenziare:
    1. grazie all'evento OnMouseMove abbiamo a disposizione le coordinate X e Y dei punti attraversati durante l'azione di disegno effettuata dall'utente con il dito o con il pennino;
    2. molte opzioni di disegno sono disponibili fra le proprietà dell'oggetto TStroke del canvas stesso;
    3. sfruttiamo i metodi DrawLine e DrawEllipse di TCanvas per realizzare la linea spezzata che congiunge i punti rilevati nell'handler di OnMouseMove e per disegnare dei punti nel caso di tocchi singoli sulla superficie di disegno (ottimo per realizzare i puntini sulle i e la punteggiatura);
    4. grazie ai componenti TColorPicker e ai TColorQuad, è facile permettere all'utente di personalizzare i colori dello sfondo e del tratto;
    5. un semplice algoritmo per ridurre "glitches" nel disegno (soprattutto nella scrittura a mano libera) è stato implementato tenendo in considerazione la distanza fra due punti da unire nelle spezzate e il gap temporale fra due tocchi distinti (anche qui, usando i componenti TTrackBar, è facile dare un minimo di personalizzazione dei parametri dell'algoritmo all'utente);
    6. l'uso di un Drawer (cfr. articolo e video tutorial di Josè Leon) ci permette di avere la massima superficie di disegno a disposizione e al contempo realizzare una GUI intuitiva per l'utente;
    7. la TToolbar superiore permette facilmente di mettere a disposizione dei comandi rapidi all'utente fra cui troviamo anche i pulsanti per utilizzare una immagine scattata dalla fotocamera (o presa dalla galleria immagini del dispositivo) come sfondo; da notare come l'implementazione di questa funzionalità (utilizzare un'immagine già scattata o scattare un'immagine dalla fotocamera) non abbia richiesto che le tre righe di codice necessarie a disegnare (in stretch mode) l'immagine selezionata sulla nostra superficie di disegno, grazie all'uso delle TTakePhotoFromCameraAction TTakePhotoFromLibraryAction a disposizione fra le standard action;
    8. Ultima ma non meno importante, una volta completato il nostro disegno, l'utente può condividere il risultato attraverso lo ShareSheet standard di sistema, che permetterà di inviare il contenuto (la Bitmap) a qualunque applicazione installata sul nostro dispositivo (ottimo per inviarla via social networks o per email / instant messaging).

    Conclusioni e materiale

    Realizzare una semplice applicazione per il disegno a mano libera (e scrittura) è possibile con Delphi XE5 ed è possibile, con poco sforzo, realizzare le funzionalità fondamentali per offrire all'utente una buona esperienza d'uso. Grazie a FireMonkey molte di queste funzionalità sono realizzabili con pochissime righe di codice (scattare una foto dalla camera, usare un'immagine dalla libreria, condividere il risultato del disegno con altre applicazioni).

    Trovate i sorgenti completi dell'applicazione qui: Link to sources DXE5
    Demo: Link to Android APK

    Di seguito qualche screenshot preso con il mio Nexus 7, e con l'occasione possiamo anche farvi i migliori auguri per un felice anno nuovo!

    FreeDrawing semplice (auguri!)

    FreeDrawing con una foto come sfondo

    FreeDrawing, opzioni di disegno nel drawer

    Ed ecco uno screenshot da un iPad 4:
    FreeDrawing su iPad4 (iOS 7)

    lunedì 16 dicembre 2013

    Gli strumenti per potenziare l'IDE di Delphi (Parte 2 - GExperts)

    La seconda puntata di questa serie dedicata agli strumenti per potenziare l'IDE di Delphi prende in esame un tool storico, i GExperts.
    Nome:GExperts
    Sito:http://www.gexperts.org/
    Download per XE5:Experimental for Delphi XE5
    Licenza:Open Source
    Prezzo:0€



    GExperts è il tool che installo ed uso fin dalle prime versioni di Delphi, è un progetto Open Source iniziato da Erik Berry nel 1996 e poi portato avanti dal "GExperts Development Team"


    Una volta installato i GExperts vedrete un nuovo menu in Delphi GExperts che contiene tutti i (numerosi) comandi e le impostazioni di questo strumento.
    Come nel caso di ModelMaker Code Explorer vi mostrerò una selezione dei comandi e funzionalità che ritengo più utili e che uso più spesso mentre vi invito ad esplorare estesamente questi tool e scegliere poi quali sono le caratteristiche che a voi sembrano più interessanti.

    Backup dei progetti

    La prima funzionalità che vi descrivo è il backup dei progetti che, soprattutto in passato, ho usato parecchio. Il funzionamento è semplice, l'expert prende l'elenco dei file dalle impostazioni di progetto e crea un archivio compresso (zip) con un nome scelto dall'utente. Ovviamente è possibile aggiungere file che non sono del progetto (configurazione, risorse, ecc...)
    Come ho accennato sopra ultimamente uso sempre di meno questa funzionalità visto che da numerosi anni uso altri strumenti per gestire il codice sorgente, ovvero i version control. Se siete interessati all'argomento i version control saranno oggetto di un prossimo articolo.

    Class Browser



    La finestra Class Browser è una vista utile sulla classi del progetto (anche qui viene effettuato il parsing dei file del progetto per popolare l'elenco delle classi). E' possibile navigare tra le varie classi e tra i membri delle stesse. In Delphi questa funzionalità è presente in due viste: la vista Structure e la vista Delphi Class Explorer.

    Clean Directories

    La funzionalità della pulitura delle directory è allo stesso tempo molto senplice e molto utile. Ormai i file di Delphi "di contorno" si sono moltiplicati, dai vecchi .dsk o .ddp ai recenti .local e .identcache, più vari file di backup ed altri ancora. La presenza di questi file (che sono solo di supporto all'IDE per vari task) rende noiosa la pulizia manuale del progetto ad esempio prima di un backup o di un'importazione in un version control. La "pulizia" diventa invece quasi obbligatoria se dobbiamo spedire il progetto ad un collega oppure renderlo aperto al pubblico.
    Il comando Clean presente in questa finestra consente quindi di cancellare in un colpo solo tutti i file non richiesti con una personalizzazione molto potente.

    Code Librarian


    Una vera e propria gemma nascosta (che oggigiorno andrebbe ripensata in versione "remotizzata") è il tool Code Librarian, in pratica un browser di "code snippets" più utili o ricorrenti da richiamare in ogni momento con funzionalità di copia dall'IDE e incolla sull'IDE per velocizzare le operazioni. Questo tool si basa su un file in formato ClientDataSet (salvato in formato binario) che contiene i nostri pezzetti di codice con la possibilità di salvarli in folder e sotto folder. E' anche possibile mettere il file degli snippets in una directory su una share di rete in modo da condividerli tra diversi sviluppatori (ovviamente sulla stessa rete).

    Components to Code

    Altra funzionalità essenziale, soprattutto per chi è alle prime armi o vuole farsi aiutare nella costruzione a runtime dei componenti Delphi, è la conversione che effettua GExperts di un componente piazzato sul form o su un DataModule a Design Time nelle righe di codice necessarie a definire, creare e configurare il suddetto componente.

    Nella foto sopra potete vedere un classico componente data aware (in questo caso una query UniDAC) convertito con il comando di GExperts Components to Code, a destra il risultato del comando incolla in un metodo del DataModule. Da quyesto momento potremo eliminare il componente a Design Time e tenere il codice corrispondente a Run Time.

    Editor Experts

    Il sotto-menu Editor Experts visualizza una serie di comando molto utili per la scrittura e la modifica del codice sorgente nell'editor di Delphi. 


    Come vedete si tratta di una serie di comandi da menu con relativo shortcut per applicare alcune trasformazioni al testo del nostro codice. Alcuni sono per me irrinunciabili, vdiamoli:
    • Ctrl-Alt-Z Allinea linee diverse di codice sorgente in base ad alcuni identificatori (se avete decine di righe di lettura da field di un dataset dovete assolutamente provarlo)
    • Shift-Alt-R inverte la parte di statement a destra del := con quella a sinistra. Anche qui per intuire la comodità del comando pensate che le vostre 100 righe di lettura dai campi del dataset possono essere trasformate istantaneamente nella scrittura dei campi stessi.
    • Ctrl-Alt-Up e Ctrl-Alt-Down - Questi comandi consentono di "saltare" dalla parola su cui è posizionato il cursore alla stessa parola più avanti o più indietro nel codice. Per me indispensabili. La percentuale di utilizzo  di questi due comandi rispetto alle funzioni classiche di ricerca (F3, ecc...)  per quanto mi riguarda è di 100 a 1.

    Expert Manager


    La finestra Expert Manager consente di gestire gli expert installati nell'IDE in modo semplice ed intuitivo invece di giocare con le stringe nel registry in Windows. Il tool è utile soprattutto per testare Delphi senza caricare expert che possano falsare il risultato oppure per verificare che alcune instabilità dell'ambiente Delphi non siano in realtà imputabili a qualche expert in particolare.

    Grep Search

    Qualora le funzioni di ricerca di Delphi o di altri experts non riescono avenirvi in aiuto la funzione Grep Search dei GExperts fa al caso vostro.


    Diciamo che è una funzione di ricerca del testo all'interno di file (non solo quelli Delphi) molto veloce, precisa e configurabile. Potete ricercare del testo (anche con le Regular Expression) nel file corrente, in tutti i file del progetto oppure a partire da una (o più di una) directory, è possibile escluderne alcune e provvedere alla mask per il tipo di file in cui ricercare. 
    La funzionalità di search all'interno dei file è talmente utile che è possibile usare il "Grep Search" direttamente dalla shell (explorer) sostituendo così l'orribile funzionalità di ricerca di Windows.

    Hide/Show non Visual

    Se avete molti componenti non visuali piazzati sulle form timer, actionlist, imagelist, menu, popup, datasource ma soprattutto dataset (questi ultimi andrebbero però tolti e piazzati su datamodule) e dovete continuamente spostarli per vedere i controlli UI messi sotto questo comando è perfetto per voi, nasconde (e poi visualizza) tutti i componenti non visuali sul form corrente.

    IDE Menu Shortcut



    Questo tool è interessante qualora i vostri comandi preferiti (parlo di tutto l'IDE di Delphi, non solo dei GExperts) non abbiano uno shortcut associato. Con questo tool, appunto, è possibile assegnarne uno (o cambiarlo se è in conflitto oppure vi è scomodo)

    Replace Components

    Questo è un tool che mi ha fatto risparmiare (e ha fatto risparmiare a migliaia di programmatori Delphi) diverse ore di lavoro e possibili errori. Vi descrivo un possibile scenario: voi (il vostro capo, il vostro cliente) avete deciso che i pulsanti standard non vi vanno più bene e volete sostituirli con pulsanti molto più belli. A questo punto di solito comincia un lavoro di sostituzione immane (se il progetto è grande) che può anche portare all'introduzione di bug se no fatto in modo preciso. Se invece avete installato i GExperts potete selezionare il componente tipo che volete sostituire (un TButton) invocare il comando Replace Components impostare la configurazione appropriata... et voilà la conversione su tutto il progetto è già terminata.

    Come vedete dall'immagine le opzioni sono piuttosto chiare. 


    Per raffinare il processo di conversione poi, è possibile dalla voce Settings accedere ad un'altra finestra di opzioni da cui potete mappare una proprietà del componente sorgente ad una proprietà (anche con nome diverso) del componente di destinazione.

    Set Tab Order



    Nei programmi non c'è nulla di più fastidioso (per chi è abituato a lavorare con la tastiera) di premere Tab per spostarsi sul campo successivo ed invece saltare in modo quasi casuale a qualsiasi controllo sul form. Come ovviamente sapete è frutto di una non corretta impostazione del Tab Order su form. Con questo strumento dei GExperts potete invece tenere sotto controllo (e cambiare) l'ordine dello scorrimento dei campi nella vostra maschera.

    Conclusioni

    Ricordo ancora che i GExperts contengono più funzionalità rispetto a quelle presentate in questo articolo e quindi vi esorto a testare i vari tool contenuti per trovare quelli più utili a voi.

    Nel prossimo articolo prenderemo in esame uno strumento che si è affacciato da alcuni anni nel panorama Delphi, CnPack.

    Se avete quesiti o proposte di recensione di altri tool scrivetemi o lasciate un commento su questo blog.