![]() |
VirtualStringTree und Query
Hallo,
ich benutze die VirtualStringTree komponente als Übersichtsfenster, in dem verschiedene Datensätz einer Tabelle dargestellt werden. Wenn ich die VirtualStringTree direkt mit der Tabelle 'verknüpfe' funktioniert das ganze wunderbar (siehe code unten).
Delphi-Quellcode:
Wenn ich jetzt aber in der procedur TreeInitNode einen Query einfüge funktioniert das ganze leider nicht mehr, denn der Query wird dann in jeder zeile ausgeführt und deshalb bekomme ich immer nur den ersten Datensatz der Tabelle. Ich müsste den Query an eine andere Stelle plazieren, trotzdem wird in der procedur TreeInitNode auf ihn zugegriffen.
type
PListe = ^TListe; TListe = packed record Nummer : String; Name : String; end; procedure TFrmMain.InitList; begin with MainStringTree do begin BeginUpdate; Clear; NodeDataSize := Sizeof(TListe); RootNodeCount := TblMain.RecordCount; EndUpdate; end; end; procedure TFrmMain.MainStringTreeInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Namensliste : PListe; begin Namensliste := Sender.GetNodeData(Node); Initialize(Namensliste^); Namensliste.Nummer := TblMain.FieldByName('nummer').AsString; Namensliste.Name := TblMain.FieldByName('name').AsString; if not TblMain.Eof then TblMain.Next; end; Hatte jemand schon mal ein ähnliches Problem? Gruß Marcus |
Re: VirtualStringTree und Query
Hallo ich hatte das Problem auch,
Schau dir mal ![]() Du must die Daten erst in abfragen und dann die Daten in das VirtualTreeView laden. Bei mir funzt das super. |
Re: VirtualStringTree und Query
Hallo Albi,
danke für das Beispiel. Das hilft mir schon etwas weiter. Ich würde nur gerne wissen wo in welcher Procedur ein Query.Open oder ein Query.ExecSql steht? Marcus |
Re: VirtualStringTree und Query
Ich habe das so gelöst:
Code:
procedure TForm17.TreeView1Change(Sender: TObject; Node: TTreeNode); //Ich habe eine Treeview, wenn ich da was ändere, werden die Daten, entsprechend der Query geändert
var TreeObject : TTreeDataClass; Wurzel : PVirtualNode; i : Integer; Begin VST1.Header.Columns.Clear; //---------------- Mandanten --------------------------------------------------- If Treeview1.Selected.Text = 'Mandanten' then Begin LB1.Enabled:= true; VST1.TreeOptions.PaintOptions:= VST1.TreeOptions.PaintOptions + [toShowTreeLines]; With Form1.QSeaMand Do Begin close; SQL.Clear; SQL.Text:= 'Select Mand.*, DMand.DMIDRSV, ' +'DMand.DMIDHPF, DMand.DMRSV, DMand.DMHPF ' +'From "'+DBPath+DBDMandName+'" DMand ' +'LEFT JOIN "'+DBPath+DBMandName+'" Mand ' +'ON (Mand.MID = DMand.DMID) ' +'WHERE (DMand.DAAkz = "'+SAKz.Text+'")'; //hier die SQL-Abfrage Open; For i:= 0 To 9 Do //Hier füge ich die Spalten ein VST1.Header.Columns.Add; With VST1.Header DO Begin Columns[0].Text:= 'Vorname'; Columns[0].Width:= 100; Columns[1].Text:= 'Name'; Columns[1].Width:= 100; Columns[2].Text:= 'Firma'; Columns[2].Width:= 100; Columns[3].Text:= 'Strasse'; Columns[3].Width:= 100; Columns[4].Text:= 'Wohnhaft'; Columns[4].Width:= 100; Columns[5].Text:= 'PLZ'; Columns[5].Width:= 50; Columns[6].Text:= 'Ort'; Columns[6].Width:= 100; Columns[7].Text:= 'Briefanrede'; Columns[7].Width:= 100; Columns[8].Text:= 'Schadensnummer'; Columns[8].Width:= 100; Columns[9].Text:= 'VersNr'; Columns[9].Width:= 100; //Breite und Spaltennamen werden zugewiesen end; //With VST.Header VST1.BeginUpdate; VST1.NodeDataSize:= SizeOf(TTreeData); VST1.DeleteChildren(VST1.RootNode, True); //------------Create Node's--------------------------------------------- While Not EOF DO Begin TreeObject:= TTreeDataClass.Create; TreeObject.Vorname:= FieldByName('MVorname').AsString; TreeObject.Name:= FieldByName('MName').AsString; TreeObject.Firma:= FieldByName('MFirma').AsString; TreeObject.Strasse:= FieldByName('MStrasse').AsString; TreeObject.WohnBei:= FieldByName('MWohnBei').AsString; TreeObject.PLZ:= FieldByName('MPLZ').AsString; TreeObject.Ort:= FieldByName('MOrt').AsString; TreeObject.BAnrede:= FieldByName('MBriefAnrede').AsString; Wurzel:= AddVSTObject(VST1, nil,TreeObject); //Die Node aus der SQL-Abfrage werden eingefügt //------------Create Root's--------------------------------------------- if FieldByName('MNameGF1').AsString > '' Then Begin TreeObject:= TTreeDataClass.Create; TreeObject.VornameGF1:= FieldByName('MVornameGF1').AsString; TreeObject.NameGF1:= FieldByName('MNameGF1').AsString; TreeObject.StrasseGF1:= FieldByName('MStrasseGF1').AsString; TreeObject.PLZGF1:= FieldByName('MPLZGF1').AsString; TreeObject.Ort:= FieldByName('MOrtGF1').AsString; TreeObject.BAnredeGF1:= FieldByName('MBriefAnredeGF1').AsString; TreeObject.Icon:= 31; AddVSTObject(VST1, Wurzel, TreeObject); //die Root's werden den passenden Node's zugewiesen end; // IF MNameGF1 > ''
Code:
Die Procedure für die Abfrage kannst Du im Programm an irgend einer Stelle aufrufen. Die Hauptsache ist, dass die Zuweisung in der Procedure GetText richtig sind. In der Procedure werden den Spalten der jeweilige Inhalt aus der Abfrage zugewiesen.
Function ADDVSTObject(aVST: TCustomVirtualStringTree; aNode: PVirtualNode;
aObject: TObject): PVirtualNode; var Data: PTreeData; Begin Result:= aVST.AddChild(aNode); aVST.ValidateNode(Result, False); Data:= aVST.GetNodeData(Result); Data^.FObject:= aObject; end; Des Weiteren habe ich die jeweiligen Felder noch seperat wie im dem o.g. Beispiel deklariert. Ich hoffe es ist halbwegs verständlich. Du kannst aber auch mal ![]() |
Re: VirtualStringTree und Query
Hallo,
ein großes Dankeschön an Albi und DelphiDeveloper. Nach etwas anpassen und rumprobieren funktioniert es nun so wie ich mir das vorstelle. Nochmals Dankeschön! Marcus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 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 by Thomas Breitkreuz