Pagine: 1 2 [3] 4 5 ... 14

15 Lug 2014 - Advanced Record Syntax

 
Con 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]
{$mode delphi}
.

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
CaratteristicaRecordOggetto
tipo dativaloripuntatori
assegnamentotramite l'assegnamento il loro contenuto viene copiato con l'assegnamento sono passati per riferimento
come parametrosono passati per valore sono passati, quando parametri, per riferimento
memoriasono allocati nello stack (a meno che non si faccia uso di New e Disposte che
lavorano nello heap)
sono allocati nello heap



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

verifica effettuata: in effetti non c'è nessuna differenza nella dimensione, vedere articolo http://www.lazaruspascal.it/index.php?page=151



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.
Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
In 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
Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
Quando 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
Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
Questo articolo spiega come installare fpc, il compilatore free pascal, su un raspberry con gentoo, scaricando i sorgenti da subversion.
E' una guida che può comunque essere di aiuto per fare lo stesso tipo di installazione sia su raspberry con qualsiasi altra distron che su una qualsiasi installazione di gentoo.

Read More

Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
Con questo articolo vedremo come realizzare un semplice socket server, utilizzando le librerie synapse.
Diamo per scontato che abbiamo installato e configurato tali librerie.
Apriamo Lazarus e creiamo una nuova applicazione console che salveremo con il nome "serverSock" e andiamo a sostituire le unit presenti con le seguenti

Codice: [Seleziona]

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp, echo, Unit_Operazioni
  { you can add units after this };


poi successivamente cerchiamo il pezzo di codice

Read More

Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
Pagine: 1 2 [3] 4 5 ... 14