Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [VST]gemischte Daten aus 2 Tabellen ? (https://www.delphipraxis.net/145054-%5Bvst%5Dgemischte-daten-aus-2-tabellen.html)

Hansa 22. Dez 2009 23:41


[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 ?

omata 23. Dez 2009 00:26

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.

Hansa 23. Dez 2009 00:41

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 ?

omata 23. Dez 2009 01:01

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;

Namenloser 23. Dez 2009 03:29

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.

generic 23. Dez 2009 04:07

Re: [VST]gemischte Daten aus 2 Tabellen ?
 
Zitat:

Zitat von omata
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.

Dann kannst du den Record auch weg lassen.
Schau dir mal das Stammtischvideo an. Dort habe ich das erklärt.

Hansa 23. Dez 2009 04:18

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.

omata 23. Dez 2009 13:43

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:
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;
Oder auch...
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;

Hansa 23. Dez 2009 14:42

Re: [VST]gemischte Daten aus 2 Tabellen ?
 
Das habe ich genauso. Hier taucht das Problem auf :

Delphi-Quellcode:
if Data^.Table is TTableA then
   TTableA(Data^.Table).Caption := LeseFeld // aus TTableA
else
  TTableB(Data^.Table).Nr := LeseFeld // aus TTableA
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.

Vielleicht besser etwas mehr :
Delphi-Quellcode:
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;
Wo soll denn dem Knoten überhaupt gesagt werden, ob es sich um TableA oder TableB handelt ? :shock: Daran wirds wohl liegen.

omata 23. Dez 2009 23:23

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.
Seite 1 von 2  1 2      

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