24. marts 2006 - 16:40Der 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.
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; }
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.
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.
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?:
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.
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.
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.