SMF - Just Installed!
17 Lug 2014 - DB concetti fondamentali e TDBEdit, TDBMemo e TDBTextIn questo articolo visioneremo i concetti basilari della programmazione per database con i componenti che permettono la visualizzazione dei contenuti di un campo appartenente al record selezionato di un datasource.
Nell'esempio che andremo a vedere prenderemo in considerazione SQLite come DBMS. La struttura SQL che useremo per il nostro esempio è la seguente. CREATE TABLE "main"."" ( "Id" INTEGER PRIMARY KEY AUTOINCREMENT, "Cognome" TEXT, "Nome" TEXT, "Citta" TEXT ); Lazarus possiede molti package per poter lavorare con i DB, i due sicuramente più usati, mantenuti e testati sono: i componenti standard rilasciati con Lazarus stesso e ZeosLib. Questo articolo prende in considerazione ZeosLib il quale permette un altissimo grado di astrazione del DBMS, cosa estremamente utile per non vincolare l'applicazione al DBMS. L'esempio che andremo a vedere vi permetterà di acquisire i rudimenti per impadronirvi dell'argomento. Per prima cosa, creiamo una nuova applicazione tenendo in considerazione quanto imparato nei precedenti articoli sui database, quello che segue è il codice del nostro esempio Codice: [Seleziona]
ma prendiamo in considerazione le singole parti Andiamo a vedere la FormCreate, ovvero le azioni che vengono svolte dal programma alla creazione della form, nel nostro caso specifico la prima procedura che viene eseguita dal programma Codice: [Seleziona]
come si può vedere andiamo a cancellare il contenuto della tabella usata nell'esempio. Poi possiamo notare che abbiamo creato la seguente funzione Codice: [Seleziona]
che permette di ottenere l'indice massimo contenuto nella griglia. Nell'evento OnClick del pulsante Button1 andiamo ad inserire il codice che automaticamente aggiunge in maniera incrementale le singole righe della tabella basandosi sul risultato della funzione GetLastId visionata poco sopra. Codice: [Seleziona]
Poi successivamente andiamo ad impostare la proprietà ReadOnly a True nella DbGrid del nostro esempio in modo da non lasciare modificare i dati all'utente dalla DBGrid stessa. Ora aggiungiamo al seguente esempio 3 componenti DBEdit1: TDBEdit; DBMemo1: TDBMemo; DBText1: TDBText; Andiamo ad impostare per il componente DBEdit1 le seguenti proprietà: DataSource: DataSource1 DataField: Nome Andiamo ad impostare per il componente DBText1 le seguenti proprietà: DataSource: DataSource1 DataField: Cognome Andiamo ad impostare per il componente DBMemo1 le seguenti proprietà: DataSource: DataSource1 DataField: Citta Se eseguiamo il programma vedremo che in funzione del record su cui ci spostiamo possiamo visionare ma non modificare il campo Nome, mentre possiamo visionare e modificare i campi Cognome e Citta. Qui trovate il link per scaricare l'esempio dell'articolo: www.lazaruspascal.it/esempi/Quarta_Applicazione.zip 15 Lug 2014 - DB concetti fondamentali e DBGridIn questo articolo visioneremo i concetti basilari per usare le DBGrid in maniera professionale.
Partiamo subito dicendo che le DBGrid sono tra i componenti più usati e più comodi per lavorare con i database, permettono di sveltire di molto il lavoro dell'utente finale se sono usate correttamente. Le DBGrid necessitano di un solo parametro ovvero la voce DataSource che a sua volta punta ad un oggetto Query sia che si tratti dei componenti standard sia che si tratti di un componente ZeosLib. Così otteniamo un uso standard della DBGrid, ma possiamo personalizzarla di molto usando un po' di codice, partiamo dall'esempio realizzato nell'articolo “DB concetti fondamentali e ZeosLib” e andiamo a modificare il database sqlite con il seguente codice: -- Descrizione UTENTI CREATE TABLE utenti ( "Id" INTEGER, "Cognome" VARCHAR(50), "Nome" VARCHAR(50), "Citta" VARCHAR(50), "MyCheck" VARCHAR(50), "MyButton" VARCHAR(50), "MyPick" VARCHAR(50) , "IdPickExternalKey" INTEGER) -- Descrizione CHIAVEESTERNAPICK CREATE TABLE "ChiaveEsternaPick" ( "Id" INTEGER PRIMARY KEY AUTOINCREMENT, "Descrizione" TEXT ) Come si può notare abbiamo aggiunto il campo IdPickExternalKey alla tabella principale in modo che faccia da chiave esterna e successivamente abbiamo creato una tabella apposita che contiene la chiave e il valore dei dati che vogliamo compaiano nella PickList (o combobox) che apparirà in una colonna della nostra DBGrid. Ora aggiungiamo al progetto lazarus un componente TZQuery dal nome ZQuery2 e andiamo ad impostare i seguenti valori ai parametri: Connection: ZConnection1 SQL: select * from chiaveesternapick; Active: true Successivamente aggiungiamo una nuova unit al progetto e inseriremo questo codice al suo interno: Codice: [Seleziona]
Bene con questa utilissima unit abbiamo messo i presupposti per proseguire nel nostro intento, ora manca una cosa sola, la seguente riga: AddDBComboBoxToGrid('appoggio', Self.ZQuery1, 'IdPickExternalKey',Self.ZQuery2,'Id', 'Descrizione'); Che non fa altro se non dire di aggiungere alla griglia una nuova colonna (al fondo) di metterle come titolo della colonna la stringa 'appoggio' che riporta il valore del campo 'Descrizione' che ha come chiave di accoppiamento la colonna 'Id' e che entrambi i dati sono presenti nell'oggetto TZQuery (ma andrebbe benissimo ogni oggetto TdataSet) di nome ZQuery2, in modo tale da modificare automaticamente il valore presente nella colonna 'IdPickExternalKey' della fonte ovvero all'oggetto TZQuery (ma andrebbe benissimo ogni oggetto TdataSet) di nome ZQuery1. Ma il nostro esempio non si ferma qui, vediamo inoltre come usare delle checkbox e altri utilissimi oggetti all'interno di una colonna (della Dbgrid). Self.DBGrid1.Columns.ButtonStyle:=cbsCheckboxColumn; Self.DBGrid1.Columns.ValueChecked:='TRUE'; Self.DBGrid1.Columns.ValueUnchecked:='FALSE'; Come si può notare dal codice posto sopra andiamo a giocare con tre proprietà della colonna numero i (ovviamente i è un indice per scorrere tutte le colonne della griglia), che sono: ButtonStyle: in cui andiamo a dire che forma possiederà la colonna, nel nostro caso andremo a dirgli che si tratta di una checkbox ValueChecked: ovvero il valore che deve avere la colonna per apparire selezionata ValueUncheked: ovvero il valore che deve avere la colonna per apparire deselezionata Se invece avessimo voluto una picklist “fissa” che non facesse uso di chiavi esterne avremmo potuto usare il codice che segue: Self.DBGrid1.Columns.ButtonStyle:=cbsPickList; app:=TStringList.Create; app.Add('valore1'); app.Add('valore2'); app.Add('valore3'); Self.DBGrid1.Columns.PickList:=app; app.Free; Dove con Self.DBGrid1.Columns.ButtonStyle:=cbsPickList; andiamo a dire che vogliamo una picklist, mentre concetti app:=TStringList.Create; app.Add('valore1'); app.Add('valore2'); app.Add('valore3'); andiamo a creare una stringlist, ovvero una stringa di liste e gli aggiungiamo dentro tre stringhe, e con la seguente riga diciamo che la colonna deve presentare i valori della stringlist appena creata Self.DBGrid1.Columns.PickList:=app; Ora creiamo l'evento FormCreate e inseriamo il seguente codice al nostro esempio Codice: [Seleziona]
otterremo così una griglia con una colonna checkbox, una colonna con la picklist fissa, ed una con una picklist variabile in funzione di quanto contenuto nell'apposita tabella. Il tutto con delle colonne tutte larghe 100. Qui trovate il link per scaricare l'esempio dell'articolo: www.lazaruspascal.it/esempi/Terza_Applicazione.zip 15 Lug 2014 - Advanced Record SyntaxCon la versione 2.6.0 di fpc è stata introdotta, tra le altre, una nuova caratteristica che vale sicuramente la pena di conoscere: Advanced recod syntax (sintassi record avanzata). E' stata introdotta come elemento di compatibilità con Delphi e quindi è utilizzabile con la direttiva: Codice: [Seleziona]
Solitamente quando si programma si ha in mente uno schema ben preciso: record + procedure = classe e quindi, dovendo lavorare con le liste di record o oggetti, dobbiamo quasi subito risolvere un problema: implementare un "manager" che gestisca i record o utilizzare le classi? E' bene sapere che i record possono avere funzioni e procedure, equivalenti a quelli che in OOP sono conosciuti come metodi! Le note fpc che parlano di questa caratteristica rimandano ad una pagina di delphi: http://docwiki.embarcadero.com/RADStudio/XE6/en/Structured_Types#Records_.28advanced.29 Record e oggetti quindi si avvicinano mantenendo però una profonda diversità. ereditarietà i record non supportano l'ereditarietà contenuto variante con i record si possono definire contenuti varianti, con le classi no memoria e passaggio dati
operator overloading i record permettono l'operator overloading, le classi no gestione memoria i record sono costruiti automaticamente mentre le classi devono essere istanziate esplicitamente costruttore i record hanno un costruttore di default senza argomento (volendo dichiararne uno bisogna che abbia uno o più parametri) distruttore i record non hanno distruttore metodi virtuali i record non possono avere metodi virtuali e non possono usare la keyword "message" interfacce i tipi record non implementano le interfacce Ho anche fatto una verifica personale (in quanto non ho trovato documentazione in merito) che però voglio approfondire e, quindi, non prendetela ancora per oro colato ma aspettate che a breve fornirò i risultati della prova. Mi sono domandato se nello stack la memoria occupata da ogni singolo item fosse al netto di funzioni e procedure oppure se lo spazio allocato comprendesse pure il codice. Non è una differenza da poco se applicata ad un array. Sembra che l'implementazione sia come ci si aspetterebbe: solo i dati nello stack. Edit: Citazione
Le differenze sono quindi sostanziali e come già accennato è importante conoscerne l'esistenza. Da quì i ragionamenti che si possono fare sono molteplici. Pensate ad esempio al classico accesso ai file con record tipizzato: si potrebbe incapsulare qualche funzione/procedura per trasformare una semplice struttura dati in un cursore (esempio: First, Next, Last, Prior, EOF, ecc...). Pensando invece alla gestione della memoria (ricordo che i record sono nello stack) ed ai fanatici dei garbage collector di cui il pascal è (a mio avviso) fortunatamente privo, possiamo essere certi di avere fatto un altro passo avanti in favore dell'efficenza e della facilità di programmazione allo stesso tempo. Altra riflessione obbligatoria va fatta per le liste, decisamente diverso l'approccio che questa funzionalità permette. Si chiude quì questa breve introduzione sulla nuova caratteristica del compilatore fpc. Seguirà a breve un articolo con un esempio pratico. 05 Lug 2014 - DB concetti fondamentali e ZeosLibIn questo articolo visioneremo i concetti basilari della programmazione per database con la libreria ZeosLib, dando per scontato che abbiate già installato il package appropriato.
Nell'esempio che andremo a vedere prenderemo in considerazione SQLite come DBMS. La struttura SQL che useremo per il nostro esempio è la seguente. CREATE TABLE "main"."" ( "Id" INTEGER PRIMARY KEY AUTOINCREMENT, "Cognome" TEXT, "Nome" TEXT, "Citta" TEXT ); Lazarus possiede molti package per poter lavorare con i DB, i due sicuramente più usati, mantenuti e testati sono: i componenti standard rilasciati con Lazarus stesso e ZeosLib. Questo articolo prende in considerazione ZeosLib il quale permette un altissimo grado di astrazione del DBMS, cosa estremamente utile per non vincolare l'applicazione al DBMS. L'esempio che andremo a vedere vi permetterà di acquisire i rudimenti per impadronirvi dell'argomento. Per prima cosa, creiamo una nuova applicazione con: File → Nuovo... → Applicazione Ci si presenterà una form vuota sulla quale andiamo a disporre i seguenti oggetti (tra parentesi trovate i nomi delle tab che contengono tale oggetto nell'IDE). DataSource1: TDataSource; DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; ZConnection1: TZConnection; ZQuery1: TZQuery; TZConnection è un connettore per db che permette di astrarre il passaggio da un DBMS ad un altro, permettendo una facilità di gestione e manutenzione del software che pochi componenti al mondo possono vantare. I parametri da valorizzare sono: DataBase: /home/francesco/Documenti/Lazarus/ArticoliDB/Seconda_Applicazione/db.s3db HostName: 127.0.0.1 Password: User: Protocol: sqlite-3 Connected: True Ovviamente questi dati vanno bene sul mio pc, in quanto il database file si trova nel percorso da me menzionato, con 127.0.0.1 diciamo che il database si trova sul pc locale, in caso contrario avremmo dovuto mettere l'indirizzo IP del DB server remoto. Il file non possiede dati d'autentificazione, in caso contrario avremmo dovuto inserire il nome utente e la password per accedervi. Se andate a visionare la lista delle voci presenti nella combobox alla voce protocol capirete cosa si intende con astrazione e quanto è facile passare da un dbms ad un altro lavorando con l'accoppiata Lazarus+ZeosLib. TZQuery è un oggetto che permette di elaborare i dati del DBMS attraverso il linguaggio SQL, i parametri che vanno valorizzati sono i seguenti Connection: ZConnection1 SQL: select * from utenti; Active: True; TdataSource è un oggetto che si occupa di essere il contenitore della sorgente dei dati appena ottenuti attraverso la query SQL sopra realizzata. I parametri da visualizzare sono: DataSet: ZQuery Ora siamo pronti per parametrizzare gli oggetti con cui andremo ad interfacciarci per modificare i dati presenti nel database relazionale su cui operiamo, nel caso specifico una griglia e un navigatore di record, con la prima vediamo/modifichiamo/inseriamo/cancelliamo i singoli record, con il secondo ci spostiamo di record in record. Sia per gli oggetti TDBGrid che per i TDBNavigator bisogna impostare il seguente parametro: DataSource: DataSource1 Fatto questo compilate il vostro progetto e noterete che avrete una griglia che vi permeterà di lavorare con i dati del database da voi scelti. Personalmente ZeosLib è il componente che uso per i miei lavori, è comodo, flessibile ed estremamente potente, grazie a Lazarus si astrae il sistema operativo, con ZeosLib astraggo il dbms, in questo modo i miei software non hanno dipendenze che lo vincolano, permettendomi di usare database open source e gratuiti per i test e i lavori per le piccole aziende e prodotti di colossi dell'informatica per le aziende che lo richiedono. Qui trovate il link per scaricare l'esempio dell'articolo: www.lazaruspascal.it/esempi/Seconda_Applicazione.zip 04 Lug 2014 - DB concetti fondamentali e connessioni standardQuando si lavora con i database su Lazarus è bene capire che bisogna passare attraverso un connettore DB, ovvero un oggetto che si prende l'incarico di collegare l'applicazione che state scrivendo con il DBMS (database management system). Nell'esempio che andremo a vedere prenderemo in considerazione SQLite come DBMS. La struttura SQL che useremo per il nostro esempio è la seguente.
CREATE TABLE “main"."utenti" ( "Id" INTEGER PRIMARY KEY AUTOINCREMENT, "Cognome" TEXT, "Nome" TEXT, "Citta" TEXT ); Lazarus possiede molti package per poter lavorare con i DB, i due sicuramente più usati, mantenuti e testati sono: i componenti standard rilasciati con Lazarus stesso e ZeosLib. Questo articolo prende in considerazione i primi, ma vanno spese due parole anche per ZeosLib, che è un ottimo strumento il quale permette un altissimo grado di astrazione del DBMS, cosa estremamente utile per non vincolare l'applicazione al DBMS. L'esempio che andremo a vedere vi permetterà di acquisire i rudimenti per impadronirvi dell'argomento. Per prima cosa, creiamo una nuova applicazione con: File → Nuovo... → Applicazione Ci si presenterà una form vuota sulla quale andiamo a disporre i seguenti oggetti (tra parentesi trovate i nomi delle tab che contengono tale oggetto nell'IDE). SQLite3Connection1: TSQLite3Connection; (Tab SQLDB) SQLQuery1: TSQLQuery; (Tab SQLDB) SQLTransaction1: TSQLTransaction; (Tab SQLDB) DataSource1: TdataSource; (Data Access) DBGrid1: TDBGrid; (Data Controls) DBNavigator1: TDBNavigator; (Data Controls) TSQLite3Connection è un connettore per db, nel caso specifico per SQLite, avessimo dovuto collegarci con Firebird avremmo usato TIBConnection e via discorrendo. In caso avessimo usato le ZeosLib avremmo astratto questo discorso in quanto il passaggio da un DBMS ad un altro sarebbe stato un parametro del TZConnection ottenendo così l'astrazione che ha reso famoso questo tool. Tali oggetti devono essere parametrizzati con alcuni dati che elencherò qui sotto: DataBaseName: /home/francesco/Documenti/Lazarus/ArticoliDB/Prima_Applicazione/db.s3db HostName: 127.0.0.1 Password: UserName: Transaction: SQLTransaction1 Connected: True Ovviamente questi dati vanno bene sul mio pc, in quanto il database file si trova nel percorso da me menzionato, con 127.0.0.1 diciamo che il database si trova sul pc locale, in caso contrario avremmo dovuto mettere l'indirizzo IP del DB server remoto. Il file non possiede dati d'autentificazione, in caso contrario avremmo dovuto inserire il nome utente e la password per accedervi. TSQLTransaction è un oggetto che permette tra transazione dei dati dal DB all'applicazione che fa riferimento al connettore, infatti lo abbiamo passato per parametro poco sopra. A tutti gli effetti è un oggetto che non esiste nelle ZeosLib visto che è inglobato automaticamente nel TZConnection per semplificare la vita del programmatore. Ora impostiamo il parametro: Active: True; TSQLQuery è un oggetto che permette di elaborare i dati del DBMS attraverso il linguaggio SQL, i parametri che vanno valorizzati sono i seguenti DataBase: SQLite3Connection1 SQL: select * from utenti; Active: True; TdataSource è un oggetto che si occupa di essere il contenitore della sorgente dei dati appena ottenuti attraverso la query SQL sopra realizzata. I parametri da visualizzare sono: DataSet: SQLQuery1 Ora siamo pronti per parametrizzare gli oggetti con cui andremo ad interfacciarci per modificare i dati presenti nel database relazionale su cui operiamo, nel caso specifico una griglia e un navigatore di record, con la prima vediamo/modifichiamo/inseriamo/cancelliamo i singoli record, con il secondo ci spostiamo di record in record. Sia per gli oggetti TDBGrid che per i TDBNavigator bisogna impostare il seguente parametro: DataSource: DataSource1 Fatto questo compilate il vostro progetto e noterete che avrete una griglia che vi permeterà di lavorare con i dati del database da voi scelti. Qui trovate il link per scaricare l'esempio dell'articolo: www.lazaruspascal.it/esempi/Prima_Applicazione.zip |