{***********************************************************
*** 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;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, db, Grids;
function AddDBComboBoxToGrid(NomeNuovoCampo: string;MyDataSet: TDataSet; CampoDataSet: string ;DataSetList: TDataSet; ChiaveLista: string; CampoLista: string): boolean;
implementation
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.
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;