einem Form ein Objekt on reference übergeben
-
Hallo zusammen,
der Titel sag schon alles. Ich habe in einem Form a ein Form b mit
Application->CreateForm(__classid(Tb), &b); erzeugt. In Form a habe ich auch ein neues Objekt angelegt: z.B. myObj. Wie muss ich nun meine Form b.cpp und Form b.h erweitern damit ich auch das Objekt myObj in Form b verändern kann?lg,
blitzgeist
-
du kannst z.B. den Konstruktor des FormB anpassen, im Header
__fastcall TFormB(TComponent* Owner, TObject *myObj); TObject *FmyObj;
in der CPP
__fastcall TFormB::TFormB(TComponent* Owner, TObject *myObj) { FmyObj = myObj; } //oder __fastcall TFormB::TFormB(TComponent* Owner, TObject *myObj) : TForm(Owner), FmyObj(myObj) { }
und bei der Erstellung in FormA
Tb *b = new Tb(this,myObj);
-
Danke für deine schnelle Antwort, probiere es gleich aus...
-
Es klappt alles bis auf die Erstellung in Form A. Ich benutze ja dazu den Befehl
Application->CreateForm(__classid(Tb), &b);Doch wie gebe ich meinem Form b die Refernz meines Objekts vo n b mit?
-
Hallo
blitzgeist schrieb:
Es klappt alles bis auf die Erstellung in Form A. Ich benutze ja dazu den Befehl
Application->CreateForm(__classid(Tb), &b);Dieser Aufruf ist eher VCL-Intern für automatisch generierte Forms.
Da du dynamische Forms mit angepasstem Konstruktor hast must du die von Linnea gezeigte Variante mit new nehmen, dort kannst du deinen modifizierten Konstruktor benutzen.bis bald
akari
-
Okay, dann werde ich es mit dieser Variante realisieren. Danke.
-
Ach ja nochwas zu
Tb *b = new Tb(this,myObj);
On reference muss es doch heißen:
Tb *b = new Tb(this, &myObj);
Oder?
Und warum wird noch ein this-Zeiger übergeben?Und noch eine Frage:
Wenn ich nun mein Form mitTb *b = new Tb(this,myObj);
anlege und dann die Methode
void __fastcall Tb::ButtonFertigClick(TObject *Sender) { a->Top = b->Top; }
aufrufe, stüzt das Programm ab, wieso passiert das?
-
Hallo
Ach ja nochwas zu...
On reference muss es doch heißen:Linnea geht davon aus das du das Objekt auf dem Heap angelegt hast und als Pointer übergeben willst. Dann muß kein & da rein.
Da wir nicht wissen was MyObj für einen Typ hat und wie der Zusammenhang zum Form und Gültigkeit aussieht, können wir dazu nicht viel sagen.Und warum wird noch ein this-Zeiger übergeben?
this ist in diesem Fall der Owner des neuen Forms. Du kannst auch NULL stattdessen übergeben, bist dann aber selber für das Löschen des Forms zuständig.
Und noch eine Frage:
Wenn ich nun mein Form mit
...
aufrufe, stüzt das Programm ab, wieso passiert das?Ausgehend von dem gezeigten Code gehe ich davon aus das du an den Konstruktor des Forms mit dem & die Adresse eines lokalen Objekts übergibst, das beim Aufruf von ButtonFertig gar nicht mehr existiert. Ich empfehle die Grundlagen zum Thema Speicherverwaltung, Gültigkeit und OOP durchzuarbeiten.
bis bald
akari
-
Hallo akari,
meine Konstruktorimplementierung sieht wie folgt aus:
__fastcall Tb::Tb(TComponent* Owner, Obj* myObj): TForm(Owner) { myFObj = myObj; }
und in der b.h wie Linnea es gezeigt hat. Wenn ich nun einen Button anklicke gibt es doch noch mein Form b, also muss doch b->Top = xxx; funktionieren.
.
.
.
.
.
Habe den Denkfehler gefunden. Ich darf nichtvoid __fastcall Tb::ButtonFertigClick(TObject *Sender) { a->Top = b->Top; }
schreiben, sondern
void __fastcall Tb::ButtonFertigClick(TObject *Sender) { a->Top = this->Top; }
-
Ja, das macht Sinn, aber hast Du auch schon herausgefunden, warum das so ist?
Das this kannst Du übrigens auch getrost weglassen.
-
@ Joe_M.,
this ist ein Zeiger auf sich selbst, also auf das Objekt selbst. Also this->Top entspricht b->Top. This kann ich auch weglassen, jedoch mit this wird es deutlicher den Quellcode zu lesen. Somit wird vedeutlicht, dass ich eine Eigenschaft von b damit meine. Ist doch eher eine Geschmackssache, denke ich.
-
Ich meinte eigentlich eher, warum b->Top nicht funktioniert.
-
Hehe, achso. Weil es b nicht in b gibt, sondern nur die Eigenschaften von b.
-
Hi blitzgeist,
Mach mal ein neues Projekt auf und schreib z.B. in ein ButtonClick Event Form1->Top=0 oder so. Wieso funktioniert es da und bei b nicht?
mfg
cb
-
weil das Objekt Form1 mit extern deklariert wurde?
-
(Form) a und (Form) b sind globale Variablen, denen in der Projektname.cpp, mittels CreateForm(), eine Instanz zugewiesen wird. Da aber b hier mit new erzeugt wird, kannst Du nicht mehr über 'b' darauf zugreifen, sondern nur noch über den Pointer, den Du beim new erhalten hast.
-
Okay, das vertieft mein Wissen bezüglich OOP, wieder um einen winzigen Prozentanteil Danke an alle für die Beitäge.