Skip to content

Xojo2019r2

Seconda release del 2019 di Xojo. Questa release vede la nascita delle API 2.0, con tantissime novità e nuovi approcci alla programmazione in questo linguaggio. Ovviamente non mancano miglioramenti globali e correzioni di bug.

La nuova release dell’ambiente di sviluppo multipiattaforma dell’azienda texana, porta con se tantissime novità specialmente a livello di linguaggio. Protagoniste assolute sono le API 2.0 che praticamente permettono di usare il linguaggio e la sua interazione con i programmi in modo completamente nuovo.

Ci sono tantissimi nuovi comandi praticamente per ogni oggetto, ma tranquilli, la transizione è soft. I vecchi metodi sono ancora utilizzabili anche se deprecati, per cui con calma si potranno aggiornare i propri progetti per utilizzare le nuove funzionalità.

Attenzione. I progetti creati con questa versione o salvati con altro nome con questa versione non saranno più leggibili con le versioni precedenti.

API 2.0

Le novità come detto sono tantissime ed è difficile decidere da dove cominciare. Iniziamo da alcuni concetti generali.

La prima cosa da ricordare è che non è obbligatorio passare alle nuove API immediatamente. Ma i nuovi progetti creati con questa versione si aspettano (e di conseguenza i controlli utilizzeranno i nuovi eventi) l’uso delle API2.0; i progetti delle versioni precedenti resteranno compatibili, ma salvando un nuovo file con la nuova versione perderanno la retrocompatibilità.
Forse un po’ complicato, ma solo il tempo dirà se è la scelta migliore.

Queste API ricordano molto quelle del framework Xojo, ma sono state semplificate rendendone l’uso decisamente più agevole.

il suggerimento che appare per un array

In ogni caso l’autocompletamento ci viene in aiuto suggerendo i nuovi metodi, ma anche i vecchi con la loro sostituzione evidenziati in rosso, come si pu

Ancora non “compatibili” restano i Report e alcune funzionalità XML. Per i report pubblicherò a breve una classe che permette di utilizzare i nuovi RowSet con i Report, garantendo una sorta di compatibilità.

Riordino dei metodi globali

Molti dei metodi globali sono stati riorganizzati in modo da avere un arsenale coerente di funzionalità. Forse questo è uno dei settori dove era più evidente una stratificazione nel tempo delle aggiunge risultante in una difficoltà di uso, specialmente per i nuovi utenti.
Ad esempio il metodo Microseconds ora è disponibile (con le stesse funzionalità) come System.Microseconds.

Eccezioni invece che errori

In tutte le nuove funzionalità gli errori non vengono più gestiti come flag da interpretare ma creano un’eccezione che quindi andrà gestita. Seppure questo comporta cambiare il modo di scrivere il codice, è in realtà un metodo più esplicito per gestire le cose correttamente e prendere le dovute precauzione già in scrittura del codice.

Database

L’uso dei database è fondamentalmente stato modificato, pur rimanendo uguale. Al di là della citazione gattopardiana, questo vuol dire che gli errori generano eccezioni, quindi andrà cambiata la routine di apertura del database; i recordSet non esistono più ma esistono i RowSet che offrono le stesse funzionalità ma con una serie di metodi e proprietà che hanno nomi nuovi ma definiscono meglio quello che fanno. L’utilità è nell’avere, in pratica, il codice auto documentato.

Vediamo in questa tabella il confronto tra il nuovo RowSet e il vecchio RecordSet

RowSetRecordSetSignificato
BeforeFirstRowBOFProprietà per che indica se si è all’inizio dei dati
AfterLastRowEOFProprietà che indica se si è concluso di scorrere i dati
Storicamente BOF e EOF derivano dalla lettura dei file, nelle nuove API vengono modernizzati
ColumnCountFieldCountProprietà che indica il numero di campi presenti, ma nella nuova versione è corrispondente al numero di elementi in un vettore.
RemoveRow
EditRow
SaveRow
DeleteRecord
Edit
Update
Metodi per eliminare, modificare e salvare un record che, come molte altre cose nelle API2.0 vengono visti come row
ColumnFieldPer ottenere un campo dato il nome
ColumnAtIdxFieldPer ottenere un campo data la posizione.
Qui una delle differenze fondamentali, il vecchio metodo (per motivi sconosciuti) era a base 1, quello nuovo è a base 0. Per cui più coerente con il resto del sistema.
MoveToFirstRow
MoveToLastRow
MoveToNextRow
MoveToPreviousRow
MoveFirst
MoveLat
MoveNext
MovePrevious
Per spostarsi all’interno dei dati.
RowCountRecordCountTotale delle righe / record ottenuti

Chiaramente abbiamo diverso codice da cambiare e lo stesso vale per altri oggetti. Ma L’IDE da con suggerimenti e altro, diversi metodi per aiutare lo sviluppatore in questo processo.

Ma il cambiamento non è solo nei recordset/rowset. Le azioni su database (select, execute) sono ora selectSQL invece di SQLselect e executeSQL invece di SQLexecute; la differenza non è solo nel nome, ma nel fatto che non serve più creare preparedStatement. Ora è possibile chiamare questi metodi con la query che prevede parametri e far seguire la stringa dai parametri. Veramente molto comodo.

Stringhe

Tutte le operazioni sulle stringhe sono ora a base 0 (finalmente), per ragioni storiche erano sempre state a base 1, ma visto che tutto l’ambiente prevedeva l’uso di un indice 0, ogni volta era necessario ripensare e verificare il calcolo degli indici.

Array, popup, listbox etc.

Tutti i metodi che prevedono l’accesso ad un elemento hanno or il termine At. Per i vettori (qualsiasi dimensione) si usano metodi con il nome row (si, lo so è strano e a mio avviso fuorviante, ma questo è quello che hanno scelto); ad esempio per aggiungere un elemento ad un vettore non si usa più append ma addRow, per inserire un elemento in una posizione non si usa insert ma addRowAt.

La stessa istruzione vale per popup e listbox.

Per avere l’indice dell’ultimo elemento inserito in una listbox non usiamo più lastIndex ma LastAddedRowIndex; però ora possiamo usarlo anche nei popup, mentre prima non avevamo nulla.

Per sapere quanti elementi ci sono useremo rowCount (negli array count), per sapere l’ultima posizione (prima era count-1) useremo LastRowIndex che è anche il sostituto di ubound per gli array.

In pratica una gran fatica per imparare i nuovo metodi ma alla fine, passato un periodo di transizione, il linguaggio risulterà più semplificato.

Nuovi eventi per i controlli

Nell’ambito delle API2.0 va menzionato anche il cambio di nome di molti eventi. Questo vuol dire che tutti i vecchi progetti andranno modificati per utilizzare la nuova nomenclatura. Fortunatamente hanno previsto funzionalità per semplificare questo processo.

Ora i nomi degli eventi hanno (in genere) dei nomi che hanno più senso, dicono esplicitamente se una azione è in corso o sta per essere eseguita o è stata eseguita. I nomi precedenti erano in moltissimi casi ambigui e per abitudine eravamo in grado di comprenderli, ma per i nuovi utilizzatori erano fonte di enormi dubbi.

Altro

Ci sono una notevole quantità di nuove funzionalità portate da queste API2.0 e molte altre verranno in seguito con l’arrivo di web2.0 e i nuovi framework per il mobile.

In seguito scriverò singoli post sulle varie nuove funzionalità.

Altre novità

Oltre alle API 2.0, ma si potrebbe dire insieme, visto che alcune cose sono legate sono presenti, tra l’altro, le seguenti novità

Compatibilità con Catalina

Questa release è compatibile con macOS Catalina e molti dei cambiamenti introdotti si basano sull’uso delle nuove funzionalità delle ultime release di macOS. Ad esempio l’accesso al disco ora sfrutta in tutti gli aspetti le moderne funzionalità del sistema operativo e non si poggia più su routine ormai deprecate da tempo.

Gestione delle date

Per una gestione completa delle date sono state introdotte le classi DateTime e DateTimeInterval. Sono le equivalenti del “vecchio nuovo” framework. In quanto DateTime è immutabile, ma ha una gestione corretta delle timeZone, e DateInterval si utilizza per fare i calcoli sulle date (differenza, spostamento etc.)

Novità nell’IDE

Ora è possibile fare la progettazione delle finestre utilizzando anche la vista in dark mode. Inoltre sono stati migliorati il salvataggio dei progetti in formato testo ed è possibile testare i progetti ignorando i breakpoint (che a loro volta ora sono attivati anche dove prima venivano misteriosamente ignorati).

Grafica per path

L’oggetto graphics (ad esempio nell’evento paint di un canvas) ora permette di generare disegni in tutte le piattaforme utilizzando i Path, come già si faceva per iOS. Questo permette di creare grafica molto più evoluta rispetto a prima, visto che sarà possibile utilizzare curve di bezier e archi.

Thread

Ora è possibile, tramite evento, aggiornare l’interfaccia utente mentre si esegue un thread. In pratica la soluzione è molto simile a quanto pubblicato in questo blog. La classe qui proposta è ancora utile in quanto permetteva di avere per eventi quello che doveva succedere prima del lancio del thread e dopo il lancio. Ma aggiungere questi eventi è triviale e la nuova classe thread garantisce un comportamento standard a livello di ambiente.

Novità per iOS

Ora è possibile utilizzare i simulatori di Xcode11 ovvero testare le app su iOS13.

SQLSelect e SQLExecute accettano un numero indeterminato di parametri (prima era necessario utilizzare un funzione bridge per permettere questo e andava “corretta” se non era previsto un numero adeguato di parametri)

IDE Script

Importante aggiunta a questa funzionalità. Ora è possibile leggere e scrivere files direttamente. Utilissimo per leggere configurazioni particolari nell’automazione della compilazione o per generare documenti per completare la creazione del prodotto finale.

Conclusioni

Questa release rappresenta una pietra miliare nell’evoluzione di questo ambiente di sviluppo. Apre la strada alle prossime novità in arrivo e modernizza oltre che uniforma il linguaggio.

Chiaramente ci sono anche aspetti negativi da tener in conto: è comunque la prima release delle nuove API e nonostante il lungo periodo di gestazione in beta, ci possono essere comunque alcune cose da rivedere; alcuni nuovi nomi non sono proprio chiarissimi e alcuni sono fuori contesto e a mio avviso fuorvianti; il cambio di proprietà ed eventi nei controlli, seppur mitigato da una serie di ausili, può creare problemi per progetti in sistemi di controllo delle versioni e condivisi con progetti realizzati in ambienti precedenti.

D’altro canto, da qualche parte si doveva iniziare e se questo processo porterà ad una semplificazione finale del tutto, si può sopportare una fase transitoria e di coesistenza con situazioni diverse e API multiple.

Visto cosa ha portato questa release, sarà molto interessante sentire il CEO di Xojo alla prossima conferenza di Colonia per avere un’idea dei prossimi passi.