Nichtmodaler Dialog soll Funktion aufrufen



  • Im obigen Buch, wurde erwähnt, anstelle des nichmodalen Dialogs, CFormView zu
    verwenden. Aber wie ?


  • Mod

    MFC-Arbeiter schrieb:

    Im obigen Buch, wurde erwähnt, anstelle des nichmodalen Dialogs, CFormView zu
    verwenden. Aber wie ?

    Sag doch erstmal was DU willst. Hast Du denn ein Dokument. Hast Dui überhaupt eine Doc/View Struktur?
    Wenn nein: Für ein CFormView brauchst Du Frame, Document, und View...

    Das Buch mag Recht haben wenn es sich um eine komplette Anwednung handelt. Aber wenn es um so etwas wie ein Suchfenster geht, dass immer da sein sol, oder ein Fenster für Properties oder so, müsstest Du evtrl. auch an ein dockable Window denken.

    Also sag uns was Du willst und stelle Deine Frage bitte präziser!



  • Martin, Du hast wohl recht. Um einen nichtmodalen Dialog zu erstellen, muss man
    wohl die Lösung mit SendMessage verwenden. Ich dachte, einen nichtmodalen Dialog einfacher mit CFormView bauen zu können, aber das geht wohl nicht.


  • Mod

    Man muss kein SendMessage verwenden. Du kannst ja an den Dialog jeden beliebigen Zeiger einer anderen Klasse mitgeben.



  • Martin,
    Um eine Funktion von CMeinView in MeinDialog.cpp aufzurufen braucht es folgendes:

    CMeinView* vi;
    vi->FunktionVonMeinView();

    Dazu muss CMeinView in MeinDialog eingebunden werden:
    Es wird also CDialog in MeinView, und CMeinView in MeinDialog eingebunden.
    Ich habe es nochmals versucht:
    Habe ein neues Projekte angelegt, mit einem Dialogfeld und einer CDialog-Klasse
    versehen, und die Verweise wie oben eingerichtet. Ausserdem kein Code hinzu-
    gefügt. Es kam wieder der Compilerfehler:
    "Es fehlt ';' vor ''"
    bei: CMeinDoc
    GetDocument() const;
    Keine Ahnung wie das zu verstehen ist !

    Wenn man dem Konstruktor von CMeinDialog "this" übergibt, so denke ich geht
    folgendes nicht:
    CMeinView* vi;
    CView* vi2; // Wenn man CMeinView nicht einbinden kann.
    vi2 = vi;
    vi2->FunktionVonMeinView(); // Weil in CView es keine Funktion:
    FunktionVonMeinView gibt !

    Wahrscheinlich hat das Buch, wo die Lösung mit SendMessage beschrieben ist,
    doch recht, sonst ginge das sehr einfach !
    Was meinst Du Martin ?



  • Das Grundprinzip von MFC-Zeiger hast Du ausprobiert?


  • Mod

    Ich weiß immer noch nicht was Du eigentlich vorhast, aber ich kann Dir sagen:

    Einen View in einen Dialog einbinden geht nicht. So scheinen mir Deine Versuche.

    Wenn Du einen simplen nicht modalen Dialog der einen Zeiger auf den View mitbekommt, dann kannst Du einfach über den Zeiger des Views die Funktion aufrufen. Wo ist das Problem?



  • Den Zeiger übergibt man dem Dialog Konstruktor:
    In der Prozedur-Schnittstelle gibt es ein Parameter namens "parent".
    Dieser enthält den Zeiger. Den muss ich um ihn später zu verwenden einer
    Variablen vom Typ CView oder CMeinView zuweisen. Und dann sollte man die
    Funktion aufrufen können. Oben habe ich beschrieben, dass man CMeinView
    nicht einbinden kann, oder es ist mir nicht gelungen. Wie soll ich die Funktion
    aufrufen können ? vi->Funktion(); Aber woher bekomme ich vi ? CView nicht und
    CMeinView nicht ...


  • Mod

    Bau einen eigene Membervariable in dem CDialog ein. Und setze die. Dann kannst Du innerhalb des DIaloges darauf zugreifen. Wo ist das Problem?

    Das Parent würde ich nicht verwenden.
    Wenn Du Das Parent verwendest kannst Du einen Down cats machen mit GetParent

    STATIC_DOWNCAST(CMyView,GetParent())->MeineFunktion();



  • Hast Du vielleicht ein Problem mit der Vorwärtsdeklaration?

    Hier etwas Pseudocode:

    In MyDialog.h
    Vor der Klassendeklaration von CMyDialog: Class CMyView; //Vorwärtsdeklaration
    Dann als Member der Dialogklasse z.B. CMyView *m_pMyView;

    In MyView.cpp

    CMyDialog dlg;
    dlg.m_pMyView = this;
    dlg.DoModal();
    

    In Dialog.cpp

    #include "myView.h"
    //...
    m_pMyView->Func(); nutzen
    


  • Martin, welchen Typ soll die Membervariable haben, und worauf soll ich sie
    setzen ?



  • Vorwärtsdeklarationen habe ich schon eingesetzt. Kann mir jemand erklären,
    was es sich mit der Fehlermeldung, ( wie oben beschrieben ) auf sich hat ?


  • Mod

    Meine Güte.
    Lerne mal etwas Basics.

    Natürlich auf den Klassentyp, dessen Funktion Du ausführen willst.

    Ehrliche Frage: Hast Du irgendeinen Plan den Du verfolgst?



  • So nun aber zum Schluss:
    STATIC_DOWNCAST geht nicht weil der Bezeichner CMyView nicht sichtbar ist.
    Wollte ich ihn einbinden: #include "MyView.h" mit oder ohne Vorwärtsdeklaration,
    kommt die Fehlermeldung " ... ';' vor '*' ... " wie oben beschrieben.
    Probier es halt mal selber aus:

    1. Ein neues Projekt anlegen.
    2. Eine Dialogfeldvorlage, und eine CDialog-Klasse anlegen.
    3. Beidseitiges include, mit oder ohne Vorwärtsdeklaration.
    4. Compilieren.
      Eine Sache von zwei Minuten.
      Ansonsten würde ich sagen, lassen wir das Thema ruhen.
      Ich verfolge keine bösartige Absicht.
      Trotzdem Danke für die Mühe !


  • Ersetze bitte CMyView durch CMeinView, wie ich es oben gehandhabt habe. Wollte ich
    eine Variable vom Typ CMeinView anlegen, um die Funktion aufzurufen, muss ich erst mal MeinView.h includieren. Das geht nicht !!! Basics ! Was solls ...


  • Mod

    Du kannst in einem Dialog-Projekt keine Views verwenden, weil Du keine Du kein Document hast.

    STATIC_DOWNCAST geht nur mit der Kenntnis der gesamten Klasse, eine Forward Deklaration nützt hier gar nichts.

    Wenn Du schreiben würdest was, wo für eine Fehlermeldung ist, oder Du einfach Dein Sample Projekt hochstellst, dann kann man Dir auch besser helfen.

    Ja es sind solch einfache Basics, dass Sie mit etwas mehr Grundlagenkenntnis eben keine Probleme wären.



  • So jetzt hab ich eine Lösung gefunden, mit viel Glück.
    Fügt einfach in MeinView.h eine Vorwärzdeklaration: class CMeinDoc ein,
    dann kommt die Fehlermeldung nicht mehr. Warum weiss ich nicht.
    An den gegenseitigen Vorwärzdeklarationen hat es nciht gelegen.
    Es geht dann so:

    Einbindung von CMeinView mit Vorwärzdeklaration in MeinDialog.
    In MeinDialog.h eine Variable CMeinView* vi ein.
    In MeinDialog.cpp beim Konstruktor: vi = (CMeinView*)pParent;
    Und später: vi->Funktion();

    Das wars ! Ohne SendMessage !
    Hoffentlich habt Ihr euch nicht zusehr geärgert !
    Tschüüüsss ...



  • Na ja da bin ich mal gespannt, denn wenn du eine Funktion im View aufrufen willst dann ist es entweder eine zeichnende Funktion oder du hast ein Design-Fehler in deinem Programm, beides wird dir früher oder später auf die Füsse fallen


Anmelden zum Antworten