einem Form ein Objekt on reference übergeben



  • 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.


Anmelden zum Antworten