Pointer-Probleme im TreeView



  • Moin,
    etwas schwierig zu erklärendes Problem:
    Ich hab eine Datenbanktabelle in der Kategorien gespeichert sind, diese werden über StoredProcedure ausgelesen, sodass ich schön einen TreeView damit füllen kann. Jetzt brauch ich aber noch die Einzeldaten der Artikel, die mit eingetragen werden, dachte deshalb an die Data-Eigenschaft der Nodes. Hab mich dann an dem Beispielcode in der Online-Hilfe orientiert und folgendes zusammengestöpselt: Header:

    typedef struct artikel
    {
     int aid;
     AnsiString bezeichnung;
     AnsiString einheit;
    } Tartikel;
    
    typedef Tartikel* Partikel;
    

    CPP:

    Daten->IBtemp->SQL->Text="SELECT ktree.kid,ktree.rlvl,ktree.aid, ktree.artbezeichnung,ktree.arteinheit, kat2.bezeichnung FROM kategorien kat LEFT JOIN kattree(kat.kid,1,1) ktree ON (1=1) LEFT JOIN kategorien kat2 ON (kat2.kid=ktree.kid) WHERE kat.parent IS NULL";
     Daten->IBtemp->Open();
     Daten->IBtemp->FetchAll();
     Daten->IBtemp->First();
     TTreeNode *node;
     AnsiString nodename;
     int level,lastlevel;
     node=NULL;
     lastlevel=0;
    
     Partikel PtrArtikel;
     while (!Daten->IBtemp->Eof)
     {
      int imgindex=-1;
      level=Daten->IBtemp->FieldByName("rlvl")->AsInteger;
      PtrArtikel = new Tartikel;
      if (Daten->IBtemp->FieldByName("ArtBezeichnung")->AsString=="")
         {nodename=Daten->IBtemp->FieldByName("Bezeichnung")->AsString;
          imgindex=18;
          PtrArtikel=NULL;
          }
         else
         {nodename=Daten->IBtemp->FieldByName("ArtBezeichnung")->AsString;
          imgindex=19;
          PtrArtikel->aid=Daten->IBtemp->FieldByName("AID")->AsInteger;
          PtrArtikel->bezeichnung=Daten->IBtemp->FieldByName("ArtBezeichnung")->AsString;
          PtrArtikel->einheit=Daten->IBtemp->FieldByName("arteinheit")->AsString;
          }
      for (int i=level;i<=lastlevel;i++)
      {
       node=node->Parent; //<--- Fehler
      }
      node=TVangkats->Items->AddObject(node,nodename,PtrArtikel);
      node->ImageIndex=imgindex;
      node->SelectedIndex=imgindex;
    
      lastlevel=level;
      Daten->IBtemp->Next();
     }
     Daten->IBtemp->Close();
     TVangkats->FullExpand();
    

    Jetzt bekomm ich aber in der for-Schleife immer eine Schutzverletzung in einer vcl60***.bpl.
    Kann es sein, dass das mit dem Pointer gar nicht so richtig funktioniert? Der Code tut ohne die Sache mit dem Data, nur jetzt nimmer.



  • OK, habs selber hingekriegt, hab statt AddObject wieder AddChild verwendet und dann node->Data danach zugewiesen, dann hats funktioniert, weiß zwar net warum, aber egal 😉


Anmelden zum Antworten