treeview mit data will nicht richtig :(
-
hallo
ich bin schon fast am verzeweifeln, mein treeview will die datas richtig machen.ich hab folgenden struct angelegt:
struct TData { char *cName; char *cSearch; int iAnz: };
dann habe ich ein button zum erstellen des nodes:
TTreeNode *NewNode; NewNode = FormMain->TreeView->Items->AddChild(FormMain->TreeView->Selected, FormMain->EditName->Text); TData *Data = new TData; Data->cName = FormMain->Edit1->Text.c_str(); Data->cSearch = FormMain->Edit2->Text.c_str(); Data->iAnz = StrToInt(FormMain->Edit3->Text); NewNode->Data = (void*) Data; FormMain->TreeView->Selected->Expand(true);
und damit lese ich die nodes aus:
TData *Data = (TData*)FormMain->TreeView->Selected->Data; FormMain->EditName->Text = FormMain->TreeView->Selected->Text; FormMain->Edit1->Text = Data->cName; FormMain->Edit2->Text = Data->cSearch; FormMain->Edit3->Text = IntToStr(Data->iAnz);
außerdem gibts beim ersten klick ne dicke fehlermeldung, was mit zugriffsverletztung. hat wohl was mit den zeigern zu tun. das auslesen klappt auch nicht so richtig. ich hab das gefühl, dass die zeiger dann irgendwie überschrieben werden ... keine ahnung, mit zeigern konnt ich noch nie so richtig
vielleicht hat ja jemand mitleid und hilft mir ein wenig, danke.
gruß Dominik Winter.
-
Hallo
benutze lieber
AddChildObject(TTreeNode* Node, const AnsiString S, void * Ptr);
der *Ptr ist der Data Pointer anstatt AddChild
-
Die Zeiger, die c_str() rausgibt, darfst du nicht speichern, weil sie ungültig werden können. Du musst die Strings kopieren.
-
hmm, ich habs jetzt mal so gemacht, und aufs wesentliche gekürzt. aber es geht leider immer noch nicht:
struct TData { String sTest; int iAnz; }; TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){} //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TTreeNode *NewNode; TData *Data = new TData; NewNode = Form1->TreeView->Items->AddChildObject(NewNode, Form1->EditName->Text, Data); Data->sTest = Form1->Edit1->Text; Data->iAnz = StrToInt(Form1->Edit2->Text); NewNode->Data = (void*) Data; Form1->TreeView->Selected->Expand(true); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { TData *Data = (TData*)Form1->TreeView->Selected->Data; Form1->EditName->Text = Form1->TreeView->Selected->Text; Form1->Edit1->Text = Data->sTest; Form1->Edit2->Text = IntToStr(Data->iAnz); } //---------------------------------------------------------------------------
-
Dominik Winter schrieb:
aber es geht leider immer noch nicht
Was genau? Kompilierfehler, Laufzeitfehler? Wenn ja, an welcher Stelle und
welche Fehlermeldung? Oder läuft das Programm durch, aber funktioniert nicht
so, wie Du es Dir vorgestellt hast?Ich denke mir, die nachfolgende Zeile kannst Du Dir auch sparen.
NewNode->Data = (void*) Data;
Gruß,
Alexander
-
upsi, hab noch ein fehler gemacht:
es müssteNewNode = Form1->TreeView->Items->AddChildObject(Form1->TreeView->Selected, Form1->EditName->Text, Data);
und nicht
NewNode = Form1->TreeView->Items->AddChildObject(NewNode, Form1->EditName->Text, Data);
naja, ich schreib jetzt alles noch mal hin, sonst wirds zu durcheinander (auch ohne das "newnode")
struct TData { String sTest; int iAnz; }; TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){} //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TData *Data = new TData; Form1->TreeView->Items->AddChildObject(Form1->TreeView->Selected, Form1->EditName->Text, Data); Data->sTest = Form1->Edit1->Text; Data->iAnz = StrToInt(Form1->Edit2->Text); Form1->TreeView->Selected->Expand(true); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { TData *Data = (TData*)Form1->TreeView->Selected->Data; Form1->EditName->Text = Form1->TreeView->Selected->Text; Form1->Edit1->Text = Data->sTest; Form1->Edit2->Text = IntToStr(Data->iAnz); } //---------------------------------------------------------------------------
so, und der fehler ist, wenn ich auf button1 klicke: zugriffsverletzung bei adresse 1413301E in modul 'vcl60.dpl'. lesen von adresse 00000024.
und dann springt der zu projekt1.cpp auf das "Application->ShowException(&exception);"gruß Dominik Winter
-
oh, ich merk grad, wenn ich
Form1->TreeView->Selected->Expand(true);
weglasse, kommt keine fehlermelung mehr