So, nicht das noch einer glaubt, der Beitrag interresiert mich nicht mehr. Ich bin schon die ganze Woche dabei, das VST mit verschiedenen Tutorials mir in den Kopf zu arbeiten.
Das ganze ist auch mittlerweile Verständlicher für mich. Ich mache das ganze aktuell mit einem Record und auch ohne Fehlermeldung. Mein Verständnisproblem liegt allerdings aktuell trotzallem noch in der Datenhaltung.
Folgenden Aufbau möchte ich kurz darstellen:
Delphi-Quellcode:
//So sieht jetzt mein neuer Datenrecord aus
type
pVSTNodeData = ^rVSTNodeData;
rVSTNodeData = record
KundenName, ObjektName, AnlagenTyp, AnlagenBezeichnung : WideString;
KundenNr, ObjektNr, AnlagenNr : Integer;
end;
//Über folgende Funktion lade ich jetzt mein VST (Allerdings nur den ersten Root mit Daten und diesen setze ich im OnInit auf vsHASChildren)
procedure TfReportClient.LoadVST;
var
pNode : PVirtualNode;
i : Integer;
begin
try
try
vstKunden.BeginUpdate;
vstKunden.Clear;
//Datenpfad Knoten erstellen
pNode := vstKunden.AddChild(nil);
//Kundendaten laden und zugehörige Knoten erstellen
LoadCustomersData(pNode);
//vst Fertigstellen
vstKunden.EndUpdate;
ExpandedRootNodes(vstKunden);
vstKunden.SortTree(0,sdAscending,True);
except
//...
end;
finally
//...
end;
end;
procedure TfReportClient.LoadCustomersData(ANode : PVirtualNode);
var
pNode : PVirtualNode;
Daten : pVSTNodeData;
i : Integer;
begin
try
try
//Kundentabelle öffnen
if DMMasterData.OpenCustomerQuery then
begin
//Ersten Datensatz wählen
DMMasterData.qryCustomerData.First;
//Schleife um alle Kunden zu durchlaufen und die Knoten für die Kunden zu erstellen.
for i := 0 to DMMasterData.qryCustomerData.RecordCount -1 do
begin
//Kunden Knoten erstellen
pNode := vstKunden.AddChild(ANode);
//Daten zuweisen
Daten := vstKunden.GetNodeData(pNode);
Daten^.KundenName := DMMasterData.qryCustomerData.FieldByName('Kunden_Kundenname').AsString;
Daten^.KundenNr := DMMasterData.qryCustomerData.FieldByName('Kunden_Kundennummer').AsInteger;
//Nächsten Datensatz anwählen
DMMasterData.qryCustomerData.Next;
end;
end;
except
end;
finally
//Datenbank wieder schliessen
end;
end;
//Die einzelnen Nodes darauf vorbereiten, das Sie Childs haben
procedure TfReportClient.vstKundenInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
case vstKunden.GetNodeLevel(Node) of
1:
begin
vstKunden.CheckType[Node] := ctCheckBox;
vstKunden.CheckState[Node] := csCheckedNormal;
vstKunden.HasChildren[Node] := True;
end;
2:
begin
vstKunden.HasChildren[Node] := True;
end;
3:
begin
vstKunden.HasChildren[Node] := True;
end;
end;
end;
//Den Node für das Objekt und die zugehörigen Daten erstelle ich erst mit dem aufklappen (OnExpanding) des jeweiligen Node
procedure TfReportClient.vstKundenExpanding(Sender: TBaseVirtualTree;
Node: PVirtualNode; var Allowed: Boolean);
var
Daten : pVSTNodeData;
begin
case vstKunden.GetNodeLevel(Node) of
1:
begin
if Node.ChildCount = 0 then
begin
//Objektdaten laden und zugehörige Knoten erstellen
Daten := vstKunden.GetNodeData(Node);
LoadObjektData(Node, Daten^.KundenNr);
end;
//...
end;
end;
end;
//Objektnode erstellen und Daten laden
procedure TfReportClient.LoadObjektData(ANode : PVirtualNode; AInt : integer);
var
i : Integer;
pNode : PVirtualNode;
Daten : pVSTNodeData;
begin
try
try
//Objektedaten laden aus Objektdatenbank
DMMasterData.qryObjectData.Parameters.ParamByName('Kundennummer').Value := AInt;
if DMMasterData.OpenObjectQuery then
begin
//Ersten Datensatz wählen
DMMasterData.qryObjectData.First;
//Schleife um alle Objekte zu durchlaufen und die Knoten für die Objekte zu erstellen.
for i := 0 to DMMasterData.qryObjectData.RecordCount -1 do
begin
//Objekt Knoten erstellen
pNode := vstKunden.AddChild(ANode);
//Daten zuweisen
Daten := vstKunden.GetNodeData(pNode);
Daten^.ObjektName := DMMasterData.qryObjectData.FieldByName('Objekt_Objektname').AsString;
Daten^.ObjektNr := DMMasterData.qryObjectData.FieldByName('Objekt_Objektnummer').AsInteger;
//Nächsten Datensatz anwählen
DMMasterData.qryObjectData.Next;
end;
end;
except
end;
finally
DMMasterData.CloseObjectQuery;
end;
end;
So, und jetzt stell ich mir die Frage. Das ganze funktioniert auch, allerdings, wenn ich ja die Daten des Objekts zuweisen, dann mache ich das ja wie folgt..
Delphi-Quellcode:
Daten := vstKunden.GetNodeData(pNode);
Daten^.ObjektName := DMMasterData.qryObjectData.FieldByName('Objekt_Objektname').AsString;
Würde ich jetzt diesen Record zu diesem Node abfragen...
Delphi-Quellcode:
Daten := vstKunden.GetNodeData(pNode);
ShowMessage(Daten^.Kundenname);
ShowMeddage(Daten^.Objektname);
wird das Ergebniss immer
Kundenname = '';
Objektname = 'Ich bin der Objektname von pNode'
sein. Ist ja auch klar, weil der zeiger zum Kundennamen bzw. zum Datenrecord nicht vorhanden ist. Wie löst man sowas. Ist das so vorgesehen. Müsste ich hier wirklich mit...
Delphi-Quellcode:
Daten := vstKunden.GetNodeData(pNode.Parent);
ShowMessage(Daten^.Kundenname);
arbeiten?