Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
Delphi XE2 Professional
|
AW: Fehler beim Programm beenden
15. Nov 2015, 19:34
Hallo zusammen,
ich habe das Problem gelöst. Und ich glaube sogar, das ganze zu verstehen. Abschließen nochmal vielen Dank für Eure Hilfe und folgend mal die Lösung des Problems...
Delphi-Quellcode:
//Der Record mit dem integrierten Objekt
type
PTreeData = ^TTreeData;
TTreeData = record
FObject : TObject;
end;
//Im OnCreate der Form
...
vstKunden.NodeDataSize := SizeOf(TTreeData);
LoadVST(true);
...
//Das Laden des ersten Knoten
procedure TfReportClient.LoadVST(IsStarted: Boolean);
var
pNode : PVirtualNode;
begin
try
vstKunden.BeginUpdate;
vstKunden.Clear;
....
pNode := vstKunden.AddChild(nil);
//Kundendaten laden
LoadCustomersData(pNode,IsStarted);
vstKunden.EndUpdate;
ExpandedRootNodes(vstKunden);
vstKunden.SortTree(0, sdAscending, True);
...
end;
//Das Laden der Kunden
procedure TfReportClient.LoadCustomersData(ANode : PVirtualNode; IsStarted : Boolean);
var
i : Integer;
Daten_Kunde : TOCustomers;
begin
try
try
//Kundendaten laden aus Kundendatenbank
if DMMasterData.OpenCustomerQuery then
begin
DMMasterData.qryCustomerData.First;
for i := 0 to DMMasterData.qryCustomerData.RecordCount -1 do
begin
Daten_Kunde := TOCustomers.Create;
with Daten_Kunde do
begin
Kunden_Kundennummer := DMMasterData.qryCustomerData.FieldByName('Kunden_Kundennummer').AsInteger;
Kunden_ESKundennummer := DMMasterData.qryCustomerData.FieldByName('Kunden_ESKundennummer').AsInteger;
Kunden_Kundenname := DMMasterData.qryCustomerData.FieldByName('Kunden_Kundenname').AsString;
Kunden_Ort := DMMasterData.qryCustomerData.FieldByName('Kunden_Ort').AsString;
Kunden_Straße := DMMasterData.qryCustomerData.FieldByName('Kunden_Straße').AsString;
Kunden_Bemerkung := DMMasterData.qryCustomerData.FieldByName('Kunden_Bemerkung').AsString;
Ansprechpartner_Id := DMMasterData.qryCustomerData.FieldByName('Ansprechpartner_Id').AsInteger;
Ansprechpartner_Name := DMMasterData.qryCustomerData.FieldByName('Ansprechpartner_Name').AsString;
end;
vstKunden.AddChild(ANode,Daten_Kunde);
DMMasterData.qryCustomerData.Next;
end;
end;
DMMasterData.CloseCustomerQuery;
except
Daten_Kunde.Free;
end;
finally
DMMasterData.CloseCustomerQuery;
end;
end;
//Festlegung, das die Knoten Kunden Kinder haben im OnInit des VST
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;
//Die Objekte und Anlagen werden erst nach dem sie aufgeklappt werden erstellt
procedure TfReportClient.vstKundenExpanding(Sender: TBaseVirtualTree;
Node: PVirtualNode; var Allowed: Boolean);
var
NodeLevel : Integer;
Daten : PTreeData;
begin
NodeLevel := vstKunden.GetNodeLevel(Node);
if vstKunden.ChildCount[Node] = 0 then
begin
case NodeLevel of
1: //Objektdaten beim aufklappen des Objekt Knoten erstellen/laden
begin
Daten := vstKunden.GetNodeData(Node);
LoadObjektData(Node, TOCustomers(Daten.FObject).Kunden_Kundennummer);
end;
2: //Anlagendaten beim aufklappen des Anlagen Knoten erstellen/laden
begin
Daten := vstKunden.GetNodeData(Node);
LoadSystemData(Node, TOBuilding(Daten.FObject).Objekt_Objektnummer);
end;
end;
end;
end;
//Das Freigeben der Daten
procedure TfReportClient.vstKundenFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
Daten : PTreeData;
begin
Daten := vstKunden.GetNodeData(Node);
if not Assigned(Daten) then
exit;
Daten.FObject.Free;
end;
Jens Hartmann Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
|
|
Zitat
|