Written by xinyiman Luglio 15, 2014, 10:04:00 pm22819 ViewsRating: 0 (0 Rates)Print
In 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:
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:
{*********************************************************** *** Unit realizzata da Sammarco Francesco *** per inserire delle combobox/picklist *** all'interno della DBGrid. Sembra non funzionare con *** tutti i tipi di DataSet, nel caso qualcuno riesca a *** migliorare questa unit mi invii il codice migliorato *** al seguente indirizzo: francesco.sammarco@gmail.com ***********************************************************} unit Unit_CampoComboDBGrid;
function AddDBComboBoxToGrid(NomeNuovoCampo: string;MyDataSet: TDataSet; CampoDataSet: string ;DataSetList: TDataSet; ChiaveLista: string; CampoLista: string): boolean; var i: integer; ret: boolean; Field:TField; begin ret:=false; try try MyDataSet.FieldDefs.Update; MyDataSet.Close; for i:=0 to MyDataSet.FieldDefs.Count-1 do if MyDataSet.FindField(MyDataSet.FieldDefs[i].Name) = nil then Field:=MyDataSet.FieldDefs[i].CreateField(MyDataSet);
if MyDataSet.FindField(NomeNuovoCampo)<>nil then Exit;
Field:=TStringField.Create(MyDataSet); with Field do begin FieldName:=NomeNuovoCampo; Dataset:=MyDataSet; FieldKind := fkLookup; //QUI DICO CHE E' UNA COMBOBOX LookupDataSet:=DataSetList; //QUI ASSEGNO IL DATASET DA CUI EREDITARE I DATI DA FAR VEDERE NELLA COMBOBOX LookupCache:=FALSE; LookupKeyFields:=ChiaveLista;//'CHIAVE'; //CHIAVE CHE VERRA' INSERITA NEL CAMPO Temf.KeyFields LookupResultField:=CampoLista;//'NOME'; //VALORE CHE VEDI NELLA COMBOBOX DA SELEZIONE ReadOnly:=FALSE; //SOLA LETTURA ProviderFlags:=[pfInUpdate, pfInWhere]; Required:=FALSE; KeyFields:=CampoDataSet;//'CHIAVEPV'; end; MyDataSet.Open; ret:=TRUE; finally end; except on E: Exception do begin
end; end; result:=ret; end; end.
Bene con questa utilissima unit abbiamo messo i presupposti per proseguire nel nostro intento, ora manca una cosa sola, la seguente riga:
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).
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:
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
procedure TForm1.FormCreate(Sender: TObject); var i: integer; app: TStringList; begin for i:=0 to Self.DBGrid1.Columns.Count-1 do begin if Self.DBGrid1.Columns[i].FieldName='MyCheck' then begin Self.DBGrid1.Columns[i].ButtonStyle:=cbsCheckboxColumn; Self.DBGrid1.Columns[i].ValueChecked:='TRUE'; Self.DBGrid1.Columns[i].ValueUnchecked:='FALSE'; end else if Self.DBGrid1.Columns[i].FieldName='MyButton' then begin Self.DBGrid1.Columns[i].ButtonStyle:=cbsButton; end else if Self.DBGrid1.Columns[i].FieldName='MyPick' then begin Self.DBGrid1.Columns[i].ButtonStyle:=cbsPickList; app:=TStringList.Create; app.Add('valore1'); app.Add('valore2'); app.Add('valore3'); Self.DBGrid1.Columns[i].PickList:=app; app.Free; end; //ora vado ad impostare una larghezza fissa per tutte le colonne della griglia Self.DBGrid1.Columns[i].Width:=100; end; //ora vado ad impostare la picklist ereditata da una query utilizzando la Unit chiamata Unit_CampoComboDBGrid AddDBComboBoxToGrid('appoggio', Self.ZQuery1, 'IdPickExternalKey',Self.ZQuery2,'Id', 'Descrizione');
//ora vado ad impostare una larghezza fissa per tutte le colonne della griglia for i:=0 to Self.DBGrid1.Columns.Count-1 do begin Self.DBGrid1.Columns[i].Width:=100; end;
end;
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.
xinyiman registered at Italian community of Lazarus and Free Pascal on Ottobre 14, 2011, 10:56:28 pm and has posted 3263 posts in the boards since then. Last visit was Oggi alle 09:12:20 am.
Questo blog non rappresenta una testata giornalistica poiché viene
aggiornato senza alcuna periodicità. Non può pertanto considerarsi un
prodotto editoriale ai sensi della legge n. 62/2001.
Questo sito utilizza cookie, anche di terze parti, per offriti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina, cliccando su un link o proseguendo la navigazione in altra maniera, acconsenti all’uso dei cookie.