Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TreeView - Daten gruppieren

  Alt 4. Aug 2005, 23:52
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
  Mit Zitat antworten Zitat