Zugriff auf Methoden andere Klassen



  • Hallo,

    ich habe in einer Anwendung ein Hauptformular und ein Dialgfenster und würde gerne vom Dialogfenster aus auf eine public Methode des Hauptfensters zugreifen.

    Habe versucht beim Aufruf des Dialogs einen Verweis auf das Hauptfenster mittels

    DialogMethode(this);
    

    zu übergeben.

    Allerdings funktioniert der Aufruf innerhalb des Dialogs nicht.

    DialogMethode(Object^ main){
    main->HaupfensterMethode();
    }
    

    Als Fehlermeldung kommt

    "HaupfensterMethode" ist kein Element von System::Object



  • Warum ist die Signatur von DialogMethode(..) mit einem System::Object als Argument?
    Warum nicht gleich den korrekten Typ?

    Simon



  • Was gebe ich da am besten an für den this Zeiger?



  • Ja halt den konkreten Typen oder wenn Du magst ein Interface.

    Z.B. Form1, da ich annehme dass dein this da gerade eine Form1 oder ähnlich ist.

    Simon



  • Ok, vielleicht ein Anfänger Fehler, aber wenn ich schreibe:

    DialogMethode(Form1^ main){
    main->Form1Methode();
    }
    

    muss ich ja den Header von Form1 inkludieren, sprich im Header von Dialog.h da die DialogMethode im Dialog-Header deklariert wird.

    Wenn ich das mache und in der Form1.cpp den Header vom Dialog inkludiere, bekomme ich die Fehlermeldung

    Dialog nicht deklariert



  • Moin,

    class Dialog
    {
        public:
            DialogMethode(Form ^form);
    };
    
    #include "Form1.h"
    
    // ...
    
    Dialog::DialogMethode(Form ^form)
    {
        Form ^f1 = dynamic_cast<Form1^>(form);
        if (!f1) return; // nullptr;
        // ...
    }
    

    hand, mogel



  • Alle klar funktioniert. Vielen Dank.



  • Ich bräuchte das Handle zu Form1 auch in einer anderen Methode des Dialogs.

    Dialog.h

    ...
    Form^ fMain;
    ...
    

    Dialog.cpp

    ...
    DialogMethode1(Form ^main){
    fMain = main;
    Form1^ f = dynamic_cast<Form1>(main);
    ...}
    
    DialogMethode2(){
    Form1^ f = dynamic_cast<Form1>(fMain);
    f->Form1Methode;
    ...
    }
    

    Wenn ich jetzt versuche mit der DialogMethode2 auf die Form1Methode zugreifen will kommt die Fehlermaeldung, dass die Elemente von Form1 nicht initialisiert sind, also scheint es nicht die richtige Referenz zu sein, oder?



  • Der Typ im cast ist falsch: Du musst Form1**^** schreiben..

    Ausserdem wäre ein Interface, bzw. den konkreten Typen zu übergeben besser als zu casten. Includere die nötigen Header in den CPPs und benutze Vorwärtsdeklaration in den Header.

    Edit:
    Ausserdem könntest Du schon im Konstruktor vom Dialog die korrekte Referenz übergeben und speichern.

    Simon



  • Sorry, Tippfehler. Im Orginal habe ich das ^-Zeichen drin und trotzdem kommt der Fehler.



  • theta schrieb:

    Vorwärtsdeklaration in den Header.

    ach ja ... das gibts ja auch noch



  • Hier mal ein Mini- Beispiel:

    Main.cpp

    #include "stdafx.h"
    #include "MyForm.h"
    #include "MyDialog.h"
    
    int main(array<System::String ^> ^args)
    {
        MyForm myForm;
        myForm.test();
    
        return 0;
    }
    

    MyForm.h

    #pragma once
    
    ref class MyForm
    {
    public:
        MyForm();
    
        void test();
        void theFormMethod();
    };
    

    MyForm.cpp

    #include "stdafx.h"
    #include "MyForm.h"
    #include "MyDialog.h"
    
    MyForm::MyForm()
    {
    }
    
    void MyForm::test()
    {
        MyDialog^ dialog = gcnew MyDialog(this);
        dialog->aDialogMethod();
        dialog->anotherDialogMethod();
    }
    
    void MyForm::theFormMethod()
    {
        System::Diagnostics::Debug::WriteLine(L"MyForm::theFormMethod()");
    }
    

    MyDialog.h

    #pragma once
    
    ref class MyForm;
    
    ref class MyDialog
    {
    public:
        MyDialog(MyForm^ myForm);
    
        void aDialogMethod();
        void anotherDialogMethod();
    
    private:
        MyForm^ _myForm;
    };
    

    MyDialog.cpp

    #include "stdafx.h"
    #include "MyDialog.h"
    #include "MyForm.h"
    
    MyDialog::MyDialog(MyForm^ myForm)
    : _myForm(myForm)
    {
    }
    
    void MyDialog::aDialogMethod()
    {
        _myForm->theFormMethod();
    }
    
    void MyDialog::anotherDialogMethod()
    {
        _myForm->theFormMethod();
    }
    

    Simon



  • Super, jetzt funktioniert es. Vielen Dank!


Log in to reply