Avatar billede tommya Nybegynder
24. marts 2006 - 16:40 Der er 9 kommentarer og
1 løsning

Problem med TTreeView

Jeg har et program hvor der er en slags menu (et TreeView) og et indholds vindue (HTML lignende vindue) når man klikker på et blad i menuen så hopper indholdsvinduet hen til den side der bliver refereret til. Konceptet minder meget om det der er set i html hjælpefiler hvor der er en indholdsfortegnelse og et indholdsvindue.

Problemet er at jeg ikke kan gemme en reference til en fil i treeview (TTreeView VCL) komponenten. Og da jeg ikke kan være sikker på at teksten der står på den er unik kan jeg heller ikke bruge denne som indeks.

Jeg ville helst undgå at have en liste vedsiden hvor jeg referere til f.eks. det absolutte index i treeview da denne så skal opdateres når treeview ændres.

Mit spørgsmål er så hvordan jeg får gemt min fil reference sammen med min titel i treeview komponentet sådan at når jeg klikker på et blad åbner den fil jeg referede til.

Jeg bruger Borland C++ Builder 2006.
Avatar billede bertelbrander Novice
24. marts 2006 - 20:58 #1
Du kan lave en class der arver fra TTreeNode:
class MyNode : public TTreeNode
{
public:
  MyNode(TTreeNodes* aOwner, int aUnique) :
      TTreeNode(aOwner), Unique(aUnique)
  {
  }
  int Unique;
};

Class'en kan indeholde alle de felter du ønsker, f.ex. en streng.

Du tilføjer så elementer af denne class til dit træ:
  MyNode *Node = new MyNode(TreeView1->Items, 321);
  TreeView1->Items->AddChild(Node, "POP");

I dine events skal du så caste tilbage til MyNode:
void __fastcall TForm1::OnCol(TObject *Sender, TTreeNode *Node)
{
  MyNode *Pop = (MyNode *)Node;
}
Avatar billede tommya Nybegynder
26. marts 2006 - 23:06 #2
undskyld jeg ikke har svaret endnu, men prøver det af så snart jeg er på arbejde igen, så skal jeg nok svare tilbage :)
Avatar billede tommya Nybegynder
27. marts 2006 - 14:34 #3
Der er lige det ene problem at AddChild funktionen tager parent som første argument. Og jeg kan ikke lade den returnerede node være af min egen type, da den skal vøre af typen TTreeNode.

Har du nogen ide om hvordan jeg kan undgå det?
Avatar billede bertelbrander Novice
27. marts 2006 - 16:22 #4
Jeg forstår vist ikke problemet.
Din egen type (MyNode) er (også) af typen TTreeNode.
Hvad mener du med "den returnerede node"?
Man kan ikke lave om på at AddNode skal bruge parent som første argument, og jeg kan ikke se at det skulle være et problem.
Avatar billede tommya Nybegynder
27. marts 2006 - 16:47 #5
Ja så langt er jeg skam med, vi udnytter nedarvning. Problemet for mig er i AddChild funktionen. Som er defineret som følger i Borlands hjælp:

TTreeNode * AddChild (TTreeNode * Parent, AnsiString S);

I den kode du har givet sender du vores node som skal indsættes som første parameter. Men denne skal være parent node, altså ikke den nyligt indsatte node. bør jeg ikke lave et kald der bruger følgende funktion istedet?:

TTreeNode * AddChildObject (TTreeNode * Parent, AnsiString S, void * Ptr);
Avatar billede tommya Nybegynder
27. marts 2006 - 16:48 #6
hvor ptr så peger på den node jeg vil indsætte?

eller er jeg helt forkert på den?
Avatar billede bertelbrander Novice
27. marts 2006 - 17:38 #7
Først, jeg absolut ikke ekspert udi BCB.

Jeg tror vi skal prøve noget andet, først indsætter vi:

TTreeNode *Parent = TreeView1->Items->AddChildObject(0, "POP", "This is the parent object");
TreeView1->Items->AddChildObject(Parent, "Hello", "Some text, or some pointer to a struct");

Og så kan vi:
  TTreeNode* Node = TreeView1->Selected;
  if(Node && Node->Data)
  {
    char Msg[105];
    sprintf(Msg, "Data: %s", Node->Data);
    MessageBox(0, Msg, "Tree", MB_OK);
  }

I dit tilfælde kan du bruge den sidste parameter i kaldet til AddChildObject, som bliver til Node->Data i eventen, som en reference til filen. Det kan være som en simpel char * eller pakket ind i en struct.
Avatar billede tommya Nybegynder
29. marts 2006 - 15:44 #8
Tak for hjælpen, vil stadig prøve at finde en måde at bruge dit første forslag, men ind til da, kan jeg bruge den sidste. Du har i hvert fald givet mig en del inspiration til hvordan jeg skal løse det. Tak for det, hvis du smider et svar så lukker jeg posten. Mange tak for hjælpen.
Avatar billede bertelbrander Novice
29. marts 2006 - 20:19 #9
Jeg samler ikke på point.
Avatar billede tommya Nybegynder
30. marts 2006 - 01:05 #10
Ok, men mange tak for hjælpen alligevel :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester