Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - [C++][TreeView] Data aus einer Node in Variable zurück geben
R4id - Mo 20.07.09 19:43
Titel: [C++][TreeView] Data aus einer Node in Variable zurück geben
N'abend ^^
INFO: In diesem Thread handelt es sich um
C++
Ich hab hier eine Struktur (
struct):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| struct TChannel { int ID; AnsiString Codec; int ParentID; int SortOrder; int MaximumPlayers; AnsiString Name; TStringList * Flags; AnsiString Extension; bool Password; AnsiString Topic; }; |
Nun Speichere ich eine Variable von diesem Type in einer
TTreeNode:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| void __fastcall TForm1::FormCreate(TObject * Sender) { struct TChannel Channel;
Initialization(); Channel.ID = 1; Channel.Codec = "CELP 5.1 Kbit"; Channel.ParentID = -1; Channel.SortOrder = 0; Channel.MaximumPlayers = 64; Channel.Name = "Channel Name"; Channel.Flags = new TStringList; Channel.Flags->Add("Registered"); Channel.Extension = "(R)"; Channel.Password = false; Channel.Topic = "Topic-Text";
TreeView1->Items->AddObject(NULL, Channel.Name, &Channel); } |
Wie bekomme ich die Daten von dieser Node jetzt per OnClick-Event in eine Variable?
Gruß
Moderiert von
Christian S.: Topic aus WinForms verschoben, passt auf Grund der VCL-Nutzung wohl doch besser hier.
BenBE - Di 21.07.09 11:39
Du suchst Dir den markierten Node (oder einen beliebigen anderen) z.B. mit TreeView1->Items[Index] bzw. TreeView1->SelectedItem. Beachte bei letzterem, dass SelectedItem auch NULL sein kann.
Im Knoten selber kanns tDu dann über Node->Data (o.s.ä.) den hinterlegten Record abfragen. Beachte den dafür nötigen Typecast.
R4id - Di 21.07.09 12:53
Ja, soweit bin ich auch gekommen, nur hab ich den Typecast nicht auf die reihe gekriegt...
[EDIT] Ich habs mit einer Klasse hinbekommen, ging relativ einfach, nur will es nicht bei einer Struktur?!
Code für die Klasse:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| void __fastcall TForm1::FormCreate(TObject *Sender) { ts2server* x1;
x1 = new ts2server;
x1->ID = 1337; x1->Name = "what the F...!";
x1->Node = TreeView1->Items->AddChildObject(NULL, x1->Name, Pointer(x1)); } void __fastcall TForm1::TreeView1Click(TObject *Sender) { ts2server* x2;
x2 = new ts2server(*(ts2server*)TreeView1->Selected->Data); ShowMessage(x2->Name); } |
Gruß
BenBE - Di 21.07.09 13:07
Normal eigentlich so:
C#-Quelltext
1:
| struct TChannel *ch = *((TChannel*)(node->Data)); |
Operatoren-Vorrang beachten.
Ferner zu beachten ist, dass Du keine lokale Variable als Datenbereich referenzieren darfst, da diese beim Verlassen des Gültigkeitsbereiches ungültig \ undefiniert wird. Von daher:
C#-Quelltext
1:
| struct TChannel *ch = getmem(sizeof(TChannel)); |
R4id - Di 21.07.09 13:35
Als Lokale Variable funktioniert es nicht, aber als Globale... *LOL*, naja thx, funktioniert =)
Gruß
BenBE - Di 21.07.09 13:43
Wie ich sagte: Als lokale Variable werden die Daten mit Verlassen der Routine ungültig. Du musst also mit getmem dir explizit Speicher holen für die Variable, da Du ansonsten bei einer globalen Variable, diese immer wieder überschreibst. Bei getmem nicht vergessen, den Speicher wieder mit FreeMem freizugeben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!