verständnisproblem - Zeiger für Form übergeben



  • DerAltenburger schrieb:

    Fehler???

    Du hast gar keinen beschrieben/ genannt! 🕶

    jep, stimmt.. in der einfach heit des besipiels habe ich komplet vergessen das problem genau zu beschreiben

    DerAltenburger schrieb:

    Ich nehm mal an, der Zugriff auf Groupbox wird verweigert. 😕

    👍 genau dort liegt das Problem 🙂

    DerAltenburger schrieb:

    TForm * ist ein Zeiger auf eine LEERE Form!!!

    Du musst schon nen Zeiger auf DIE Form nehmen, in DER die GroupBox drin ist. 😉

    aber ich übergebe doch mit

    Test (Form1);
    

    einen Zeiger auf die "Form1".. oder nicht?
    Wie gesagt es ist mehr ein Verständnis Problem

    Thx
    BigNeal



  • void __fastcall TForm1::Test(TForm *Form)

    erwartet einen Zeiger vom Typ Form*, nicht Form1*!!! 🕶

    mach mal:

    void __fastcall TForm1::Test(TForm1 *Form)

    PS: Du must einen Zeiger der richtigen Komponente UND vom richtigen Typ uebergeben,
    Woher soll der Zeiger Form* von 'Innereien' aus Form1* wissen?



  • [cpp]void __fastcall TForm1::Test(TForm *Form)
    {
    Form->GroupBox1->Caption ="Hallo Welt";
    }
    //---------------------------------------------------------------------------[/cpp]

    Aber hier castest Du zu der Basisklasse TForm. Dort befinden sich keine Elemente auf die zugreifen kannst! Das ist die LEERE Form, die DerAltenburger meint. Du kannst nur noch auf die Eigenschaften und Methoden zugreifen, die sich direkt in TForm befinden. Ändere das TForm in TForm1 und schau was passiert.



  • 😃 ➡ 💡
    danke euch zwei.. ich glaube, da wirds mir langsam etwas klarer..
    Jetzt stellt sich mir aber wieder ein Problem..
    ich möchte die funktion aus verschiedenen "Forms" aufrufen können..
    ich wollte den Parameter als Parent wert benutzen.
    im Stil von:
    [cpp]void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Form2->Test(Form1) ;
    }
    void __fastcall TForm3::Button1Click(TObject *Sender)
    {
    Form2->Test(Form3->GroupBox1) ;
    }

    void __fastcall TForm2::Test(xxx *Parent)
    {
    TLabel *Titel = new TLabel;
    Titel->Parent = Parent
    }[/cpp]



  • Da muss die Form in allen Modulen BEKANNT sein!

    D.h.: Du musst die Headerdatei der Form in allen anderen includieren! Sonst ist der Typ (Form1) nicht bekannt.



  • jep, das habe ich vorher auch herausgefunden 😃
    es geht mir aber mehr um ein anderes Problem..
    [cpp]void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Form2->Test(Form1) ;
    }
    void __fastcall TForm2::Test(TForm1 *Form)
    {
    Form->GroupBox1->Caption = "Hallo Welt";
    }[/cpp]
    das klapt ja..
    [cpp]void __fastcall TForm3::Button1Click(TObject *Sender)
    {
    Form2->Test(Form3) ;
    }
    void __fastcall TForm2::Test(TForm3 *Form)
    {
    Form->GroupBox1->Caption = "Hallo Welt";
    }[/cpp]das ja auch... aber wie kann ich die Funktion Test(); so modifizieren, dass die Übergabeform egal ist.. d.h., dass bei der selben funktion Form1, oder Form 3 etc.. als parameter gebraucht werden kann?



  • Hallo,

    Da hast du mehrere Möglichkeiten. Du könntest den Parameter in Test den Typ TForm (oder vielleicht auch TWinControl )geben und dann in Test auf den jeweils richtigen Typ casten (dynamic_cast). Eine andere Variante wäre die Funktion als Template zu schreiben, so dass der jeweils korrekte Typ zur Compilezeit bestimmt werden kann.
    Wenn du allerdings nur ein Parent festlegen willst reicht auch TWinControl ohne internen Cast.

    ciao



  • 👍 hört sich gut an, und ich werde es auch gleich mal versuchen..

    aber mir schwirrt ne frage im kopf rum, die mir ärger ersparren könnte! darum stelle ich sie gleich mal.. 😃

    müssen die Formen (bei den beiden Varienten von Braunstein) die, auf die Funktion test() zugreifen schon in der Funktion bekannt sein?

    oder kann ich dan einfach mal mit der FormXY

    Form2->test(FormXY);
    

    aufrufen?



  • Der Typ der Form muss bei der Definition bekannt sein. Bei der Deklaration nicht unbedingt. Hier reicht auch eine Vorwärtsdeklaration.



  • ok, wie gesagt ich werde es noch testen..
    und das mit dem TWinControl für das Parent klappt auch super

    thx für die kleine Weiterbildung 👍

    BigNeal


Anmelden zum Antworten