![]() |
[VST]gemischte Daten aus 2 Tabellen ?
Hi,
kurze Frage : kann der VST nur eine Art von Daten aufnehmen, oder auch gemischt ? Es geht um 2 DB-Tabellen. Die eine liefert pro Root-Knoten nur einen String. Wenn der aufgeklappt wird, dann sollen ganz andere Daten angezeigt werden. Soll ich da jetzt alles in einen Record reinhauen oder geht das auch anders ? |
Re: [VST]gemischte Daten aus 2 Tabellen ?
Im Record ein Objekt ablegen und eben unterschiedliche Objekte designen. Dann ist die Unterscheidung leicht möglich und die unterschiedlichen Daten können sinnvoll abgelegt werden.
|
Re: [VST]gemischte Daten aus 2 Tabellen ?
Sieh an, der kann auch mit Objekten hantieren ? :shock: Nur, wie soll denn das mit der Unterscheidung gehen ?
|
Re: [VST]gemischte Daten aus 2 Tabellen ?
Wieso sollte das nicht gehen?
Beispiel:
Delphi-Quellcode:
type
TNodeObject = class Caption:string; end; TTableA = class(TNodeObject) Name:string; end; TTableB = class(TNodeObject) end; TNodeData = record Table:TNodeObject; end; PNodeData = ^TNodeData; : : procedure TForm.OnCreate... begin VST.NodeDataSize := sizeof(TNodeData); end; procedure TForm.OnVSTChange(Sender..., Node... var Data:PNodeData; begin Data:=Sender.GetNodeData(Node); if assigend(Data) then begin if Data^.Table is TTableA then begin TTableA(Data^.Table).Caption:='Caption: TableA'; TTableA(Data^.Table).Name:='TableA'; end if Data^.Table is TTableB then begin TTableB(Data^.Table).Caption:='Caption: TableB'; end; end; end; |
Re: [VST]gemischte Daten aus 2 Tabellen ?
Hallo, ich kenn mich zwar mit dem VST nicht wirklich aus, aber könnte man nicht einfach das Objekt direkt in Data ablegen und sich den Record sparen? Objekte sind doch auch nichts anderes als Pointer.
So habe ich es zumindest bei anderen Komponenten bisher immer gemacht. |
Re: [VST]gemischte Daten aus 2 Tabellen ?
Zitat:
Schau dir mal das Stammtischvideo an. Dort habe ich das erklärt. |
Re: [VST]gemischte Daten aus 2 Tabellen ?
Ich frage mich eher, warum Omata das im OnChange macht ? Der Code ist mir insoweit auch klar. Aber nicht das Zusammenspiel mit dem VST. Habe das jetzt mal soweit umgesetzt, dass das Programm läuft (aöso nicht lediglich compiliert !). Aber der Tree zeigt nichts an. Mir ist noch nicht ganz klar, wo der Typ genau gesetzt werden muss. Der VST ist komplizierter zu bestücken, als erwartet. Allerdings bin ich damit auch erst einen Tag beschäftigt. 8) Wegen der ganzen Type-Castings landet der bei Tests immer in falscher Zeile, greift dann auf falsche Tabelle zu und es kracht.
|
Re: [VST]gemischte Daten aus 2 Tabellen ?
Ich benutze dort gern das Record und nicht nur ein Objekt, dann ist man noch flexibler, wenn es um Erweiterungen geht.
OnChange war nur ein Beispiel. Damit etwas angezeigt wird, ist das OnGetText-Ereignis nötig. Dort kann bzw. muss man selber dafür sorgen, dass etwas angezeigt wird. Also...
Delphi-Quellcode:
Oder auch...
procedure TForm.VSTGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var Data:PNodeData; begin Data:=Sender.GetNodeData(Node); if assigend(Data) then begin if Data^.Table is TTableA then CellText:=TTableA(Data^.Table).Caption else if Data^.Table is TTableB then CellText:=TTableB(Data^.Table).Caption; end; end;
Delphi-Quellcode:
procedure TForm.VSTGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var Data:PNodeData; begin Data:=Sender.GetNodeData(Node); if assigend(Data) then CellText:=TNodeObject(Data^.Table).Caption; end; |
Re: [VST]gemischte Daten aus 2 Tabellen ?
Das habe ich genauso. Hier taucht das Problem auf :
Delphi-Quellcode:
An der Stelle geht es nur um TTableA. Der landet aber im else-Zweig. Deshalb ist anzunehmen, dass zumindest "is TableA" falsch ist. Zu guter Letzt kommt jedenfalls Zugriffsverletzung.
if Data^.Table is TTableA then
TTableA(Data^.Table).Caption := LeseFeld // aus TTableA else TTableB(Data^.Table).Nr := LeseFeld // aus TTableA Vielleicht besser etwas mehr :
Delphi-Quellcode:
Wo soll denn dem Knoten überhaupt gesagt werden, ob es sich um TableA oder TableB handelt ? :shock: Daran wirds wohl liegen.
Node := vstZeigTour.AddChild(nil);
Data := vstZeigTour.GetNodeData(Node); vstZeigTour.ValidateNode (Node, False); if assigned(Data) then begin if Data^.Table is TTour then TTableA(Data^.Table).Caption := LeseFeld //.. else TTableB(Data^.Table).Nr := LeseIntFeld //.. end; |
Re: [VST]gemischte Daten aus 2 Tabellen ?
Du mußt doch irgendwo dein Objekt erzeugen... und genau dort wird auch festgelegt, um welches Objekt es sich handelt...
Delphi-Quellcode:
var Tour:TTour;
begin Node := vstZeigTour.AddChild(nil); Data := vstZeigTour.GetNodeData(Node); Tour:=TTour.Create; Tour.Caption := LeseFeld; Data^.Table:=Tour; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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