Zugriff auf Methoden andere Klassen



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


Anmelden zum Antworten