Moin,
ich habe den Code erstmal aufgeräumt...
Zitat von
Ayumi:
Delphi-Quellcode:
function TDataModule1.fuelleTreeView(TreeView1: TTreeView):boolean;
var i, jahr : integer;
VkampagneRec : PKampagneRec;
vJahrTreeNode : TTreeNode;
vKundeTreeNode : TTreeNode;
vProduktTreeNode : TTreeNode;
vKampagneTreeNode : TTreeNode;
vMutterTreeNode : TTreeNode;
begin
try
vMutterTreeNode := nil;
with ADODataSet1 do begin
close;
CommandType := cmdText;
CommandText :=
'SELECT DECODE(TO_CHAR(MAX(a.sttmact), ''yyyy''), ' +
' '''', ' +
' ''unbekannt'', ' +
' TO_CHAR(MAX(a.sttmact), ''yyyy'')) Jahr, ' +
' c.advert, c.product, c.ccamp, c.icamp ' +
'FROM campaign c, actions a ' +
'WHERE c.ccamp = a.ccamp(+) ' +
'GROUP BY c.ccamp, c.icamp, c.product, c.advert ' +
'ORDER BY jahr, c.advert, c.product, c.icamp';
Open;
end;
jahr:=-1;
vJahrTreeNode:=nil;
while not ADODataSet1.Eof do begin
new(vKampagneRec);
//datum, kunde, produkt, kampagne aus der Datenbankselektion lesen
vKampagneRec^.rec_Jahr := ADODataSet1.FieldByName('Jahr').AsString;
vKampagneRec^.rec_Kunde := ADODataSet1.FieldByName('advert').AsString;
vKampagneRec^.rec_produkt := ADODataSet1.FieldByName('product').AsString;
vKampagneRec^.rec_kampagne := ADODataSet1.FieldByName('icamp').AsString;
if jahr <> ADODataSet1.FieldByName('Jahr').AsInteger then begin
jahr:=ADODataSet1.FieldByName('Jahr').AsInteger;
vJahrTreeNode:=TreeView1.Items.AddObject(
vMutterTreeNode,
ADODataSet1.FieldByName('Jahr').AsString,
vkampagneRec
);
end;
vKundeTreeNode := TreeView1.Items.AddChildObject(
vJahrTreeNode,
ADODataSet1.FieldByName('advert').AsString,
vKampagneRec
);
vProduktTreeNode := TreeView1.Items.AddChildObject(
vKundeTreeNode,
ADODataSet1.FieldByName('product').AsString,
vKampagneRec
);
vKampagneTreeNode := TreeView1.Items.AddChildObject(
vProduktTreeNode,
ADODataSet1.FieldByName('icamp').AsString,
vKampagneRec
);
ADODataSet1.next;
end;
result := true;
except
result := false;
end;
end;
Da du nach dem Jahr sortierst kannst du dir das doch einfach merken und bei einer Änderung einen neuen Jahr-Knoten anlegen. Sonst bleibt der Knoten einfach unverändert. Ein Jahr -1 wird es nie geben und somit ist die richtige Initalisierung auch gegeben.
Aber mal ne ganz andere Frage, alle Knoten auf dem Weg zum Blatt bekommen den selben
vKampagneRec. Dann gibt es doch keine Unterscheidung mehr und wie soll das beim Zusammenfassen gehen?
Wird der reservierte Speicher überhaupt wieder richtig freigegeben? Dann müsste es bei dir nur so Zugriffsverletzungen hageln. Oder merkst du dir alle Zeiger und schaust, ob du den Zulöschenden vielleicht schon freigegeben hast?
MfG
Thorsten