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 mit

    Tb *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 nicht

    void __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.


Log in to reply