AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView - Daten gruppieren

Ein Thema von Ayumi · begonnen am 4. Aug 2005 · letzter Beitrag vom 4. Aug 2005
 
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, 22: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz