Autor |
Beitrag |
R4id
      
Beiträge: 28
Win XP Home, Win XP Prof.
D7 Prof., D2006 Arch., BCB2006 Arch.
|
Verfasst: Mo 20.07.09 19:43
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
R4id 
      
Beiträge: 28
Win XP Home, Win XP Prof.
D7 Prof., D2006 Arch., BCB2006 Arch.
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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)); |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
R4id 
      
Beiträge: 28
Win XP Home, Win XP Prof.
D7 Prof., D2006 Arch., BCB2006 Arch.
|
Verfasst: Di 21.07.09 13:35
Als Lokale Variable funktioniert es nicht, aber als Globale... *LOL*, naja thx, funktioniert =)
Gruß
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|