Danke danke danke, jetzt habe ich ein neues Problem
Es funktioniert wunderbar, nur kann ich mir jetzt überhaupt nicht mehr erklären wieso
Delphi-Quellcode:
type
TData = record
FBez: String;
FMonat: array [0..1] of double;
end;
PData = ^TData;
...
var
Istdaten: PData;
Plandaten: PData;
Prognosedaten: PData;
...
procedure TForm1.BildeSumme(atree: TVirtualStringTree; var adata: PData; aString: String);
var
myNode: PVirtualNode;
begin
aTree.Clear;
aTree.NodeDataSize:=sizeof(TData); // Dies ist die einzigste "Beziehung", die zwischen einem VTV und "Art der Daten" überhaupt auftaucht - diese Anweisung muss auch nur einmal im Programm pro VTV auftauchen
myNode:=atree.AddChild(nil);
atree.BeginUpdate;
adata:=atree.GetNodeData(myNode);
adata.FBez:=aString; // dient nur zum Testen, ob tatsächlich die richtigen Records angesprochen werden
adata.FMonat[0]:=1000;
adata.FMonat[1]:=2000;
atree.EndUpdate;
end;
procedure TForm1.est11Click(Sender: TObject);
begin
// Genauso wollte ich es haben :-)
BildeSumme(TIST, IstDaten,'Ist');
BildeSumme(TPLAN, Plandaten,'Plan');
end;
Hier wird mir schon etwas mulmig. Warum greift er auf den richtigen Record-Typ zu?
Delphi-Quellcode:
procedure TForm1.TISTFocusChanged(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex);
var
myNode: PData;
begin
myNode:=TIST.GetNodeData(Node);
ShowMessage(myNode.FBez); // Anzeige "Ist"
end;
procedure TForm1.TPLANFocusChanged(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex);
var
myNode: PData;
begin
myNode:=TPlan.GetNodeData(Node);
ShowMessage(myNode.FBez); // Anzeige "Plan"
end;
Und hier wird mir ganz schwummerig
Ich habe beiden Treeviews (TIST, TPLAN) die gleiche Ereignis-Routine zugewiesen (dient zur Anzeige der Inhalte):
Delphi-Quellcode:
procedure TForm1.TISTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
myData : PData;
begin
myData:=Sender.GetNodeData(node);
if TextType=ttNormal then
begin
case Column of
0: CellText:=myData.FBez;
1: CellText:=floattostr(myData.FMonat[0]);
2: CellText:=floattostr(myData.FMonat[1]);
end;
end;
end;
Ich kann mir das nur so erkären, dass der VirtualTreeview (der ja wie gesagt selbst die Daten nicht hält) durch die Methode "GetNodeDataSize" nicht nur die Grösse des Records, sondern anscheinend auch ein Verweis auf den Record anlegt.
Vielen Dank und Gruß
Igotcha
... der jetzt wohl einige Tage seinen Code dahingehend anpassen wird...