![]() |
Verbesserungsvorschlag: TcxDBTreeList with unbounded Fields
Aufgabe 1:
Stellen Sie folgende 100 Datensätze einer TADOQuery in einem cxDBTreeList hierarchisch dar: Field1; Name: Id Value: {1..100} //Identity Field2; Name: ParentId Value: {1..100} //TreeNode ParentId Field3; Name: Description Value: {Node1..Node100} Kein Problem: cxDBTreeList.Datasource := dsADOQuery1; cxDBTreeList.KeyField := 'Id'; cxDBTreeList.ParentField := 'ParentId'; und erstelle die gewünschten Columns Problem: Ungebundene Felder Ergänzen Sie den Tree mit einer Spalte Checkbox (welche NICHT in der DB ist) um beliebige Werte zu aktivieren (und irgendwie später zu verarbeiten) Mein Lösungsvorschlag zum Testen: Platziere folgende Kompos auf deiner Form: 1 x TADOQuery (ADOQuery1) 1 x TClientDataset (ClientDataset1) 1 x TDatasource (dsClientDataset) 1 x TcxDBTreeList (cxDBTreeList1) dsDatasource.dataset := ClientDataset1 cxDBTreeList1.Datasource := dsClientDataset Ergänze cxDBTreeList1.Columns mit einer zusätzlichen Column (mit Properties Checkbox) 1 x TButton with Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer; fField: TField; fd: TFieldDef; v: Array of TVarRec; bCheckedDefaultValue: Variant; //kopiert hier irgendwo aus der DP - many thx to the coder! function CreateVariantPtr(_Value: variant): pVariant; begin GetMem( Result, SizeOf(Variant) ); Initialize(Result^); Result^ := _Value; end; begin //Copy FieldDefs from ADOQuery to ClientDataset for i := 0 to adoquery1.FieldDefList.Count - 1 do begin fd := ClientDataSet1.FieldDefs.AddFieldDef; fd.Name := adoquery1.FieldDefList.FieldDefs[i].Name; fd.DataType := adoquery1.FieldDefList.FieldDefs[i].DataType; fd.Precision := adoquery1.FieldDefList.FieldDefs[i].Precision; fd.Size := adoquery1.FieldDefList.FieldDefs[i].Size; end; //Add unbounded FieldDefs fd := ClientDataSet1.FieldDefs.AddFieldDef; fd.Name := 'Checked'; fd.DataType := ftBoolean; fd.Precision := 0; fd.Size := 0; bCheckedDefaultValue := True; //Create DataSet ClientDataSet1.CreateDataSet; //Prepare Variant Record SetLength( v, ClientDataSet1.FieldDefs.Count ); //copy Data from TADOQuery To TClientDataset adoQuery1.First; while NOT adoQuery1.Eof do begin for i := 0 to ClientDataSet1.FieldDefs.Count - 1 do begin v[i].VType := vtVariant; fField := adoQuery1.FindField( ClientDataSet1.FieldDefs[i].Name ); if assigned(fField) then v[i].VVariant := CreateVariantPtr( fField.AsVariant ) else if ClientDataSet1.FieldDefs[i].Name='Checked' then v[i].VVariant := CreateVariantPtr( bCheckedDefaultValue ) else end; ClientDataSet1.AppendRecord( v ); adoQuery1.Next; end; //set cxDBTreeList cxDBTreeList1.DataController.KeyField := 'NodeId'; cxDBTreeList1.DataController.ParentField := 'ParentId'; cxDBTreeList1.Columns[0].DataBinding.FieldName := 'Checked'; cxDBTreeList1.Columns[1].DataBinding.FieldName := 'NodeId'; cxDBTreeList1.Columns[2].DataBinding.FieldName := 'ParentId'; cxDBTreeList1.Columns[3].DataBinding.FieldName := 'Bezeichnung'; end; Nun, so ist mein Ansatz - der auch funktioniert! Vielleicht hat aber jemand Lust den Code zu perfektionieren und in die CodeLib zu beantragen Viel Spass und ich hoffe falls jemand mal das gleiche Problem zu lösen hat - er habe hier einen Ansatz gefunden[b] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz