Datenexport von Dialogfenster in Dokumentenklasse



  • Hallo zusammen,

    Ich habe eine SDI Anwendung, welche die Dokumenten-Ansichtstruktur unterstützt, erstellt. Die Eingabe meiner Daten realisiere ich in einem eigenen Dialogfenster. Wie kriege ich nun die Daten aus der Klasse des Dialogfenster in die Dokumentenklasse zur weiteren Verarbeitung?

    Eure Hilfe würde mir sehr weiterhelfen, danke

    tschö



  • In Datenmembern zwischenspeichern und dann vom Doc aus abfragen und weiterverarbeiten. 🙂
    (Controlmember sind nach Rückkehr aus DoModal unbrauchbar, aber Werte funktionieren noch.)



  • Wie sehen denn solche Daten Member aus? Sind das einfach als public definierte Member-Variablen?



  • Zum Beispiel, ja. 🙂



  • Ob es Probleme gibt, wenn ich die Member Variable als CStringArray machen möchte, oder ist das vollkommen illegal?



  • Warum sollte das denn Probleme geben? Du musst nur eben von Hand reinschieben. 🙂

    Versuchs doch einfach mal, der PC wird schon nicht explodieren. 😉
    Illegal ist eigentlich nur das, wo du dann eh Compilermeldungen oder Laufzeitfehler bekommst.
    Alles andere ist maximal unschön, aber das findest du mit der Zeit raus. Wenn man von Anfang an alle Regeln einhalten will, dann ist man mehr mit Regeln lernen beschäftigt als mit den Grundlagen. 🙄

    Kennst du "Fluch der Karibik"?
    Das sind keine Regeln, eher Richtlinien. 😃



  • Den Film kenne ich, habe ihn aber noch nicht gesehen. Aber der Spruch ist gut.

    Ok, danke bis hierhin erstmal

    tschö



  • Jetzt habe ich in meiner Dialogfeldklasse alles so weit erledigt. Wie kann ich nun das CStringArray aus der Dokumentenklasse abfragen?

    Wenn ich über

    CDialogklasse.Wert
    

    gehe, dann sagt er ungültige Verwendung dieses Types als Ausdruck (CDialogklasse)

    cu



  • Zeig bitte mal eine komplette Zeile, wie du es versucht hast. 🙂



  • ich glaub ich hab es gerade hinbekommen

    aber trotzdem:

    CDialogklasse* pDatenInput;
    //jetzt der Zugriff
    int u = pDatenInput->Wert;
    

    Klappt eigentlich soweit. Ich kann es nur nicht überprüfen. In der Dokumentenklasse habe ich eine Memberfunktion geschrieben, in welcher die obigen Zeilen stehen. Wie kann ich nun überprüfen, ob er alles richtig macht? Beim Debugging kommt er ja nicht dahin, denn es muss ja sicherlich irgendein Ereignis ausgelöst werden, oder rechnet er pauschal los?



  • Von wo rufst du den Dialog denn auf? Aus dem Doc wäre optimal, alles andere kriegen wir auch hin. 😉

    Die Zeilen werden übrigens böse in die Hose gehen (Zugriff auf Zeiger ohne was dahinter).



  • Also erstmal werde ich meine letzte Aussage korrigieren

    int u = pDateninput->Wert.GetSize();
    

    da Wert in meinem Fall ein CStringArray ist.

    Ich habe ja mehrere Dokumente. Es wird dadurch vom Assistenten ein ChildFrm und ein MainFrm erstellt. In jedem Frame habe ich einen Gliederungspunkt geschaffen ( "Eingabedialog öffnen")

    In den MainFrm mache ich dann eine Funktion in der Art:

    void CMainFrame::OnEingabedlg()
    {
      CDateneingabe dlg;   //CDateneingabe ist die Dialogfeldklasse
      dlg.DoModal();
    }
    

    Auf diesem Dialog ist bis jetzt nur ein Button für Datei einlesen - was auch wunderbar funzt. Die Werte werden dann in eine öffentliche Membervariable vom Typ CStringArray geschrieben.
    Nun soll die weitere Verarbeitung in der Dokumentenklasse stattfinden(sollte ja eigentlich so sein, wegen einer besseren Strukturierung). Wie wird aber jetzt meine Funktion zur Berechnung in der Dokumentenklasse aufgerufen?

    cu



  • Ist das Dokument das aktive? Dann gibt es bei der SDI GetActiveDocument - für MDI musste leider selber gucken.

    Dann gibst du das Array einfach als Parameter der Berechnen-Funktion. 🙂



  • Also ich dachte das funktioniert so:
    Ich arbeite in meinem Dialogfeld, da werden dann meine Werte eingelesen. Wenn nun der Button OK gedrückt wird, ist ja wieder das zu Beginn geöffnete Dokument aktiv.

    Was meinst du mit

    estartu_de schrieb:

    Dann gibst du das Array einfach als Parameter der Berechnen-Funktion. 🙂

    ?

    Ich komme doch im Moment gar nicht bis zu dieser Funktion da sie nicht aufgerufen wird.



  • Naja, Variablenübergabe funktioniert im Prizip wie Staffellauf.

    Der Dialog hat was. Das kann er dem Mainfrage geben. Der kann das ans Doc geben.
    Direkt vom Dialog zum Doc geht nicht, weil die sich nicht kennen.

    Naja, wenn die Funktion nicht aufgerufen wird, dann ruf sie doch auf. 😃
    Oder geht das nicht? Dann gib das Array nur ans Doc und das speichert das dann zwischen für die spätere Verwendung, wenn dann die Funktion aufgerufen wird.



  • Dann muss ich aber in all diesen Klassen diese Membervariablen deklarieren, sonst sagt er "nichtdeklarierter Bezeichner" ?

    Ich habe in meinen Doc die Header Datei der Dialogfeldklasse eingebunden. Über die Zeilen die ich vorhin geschrieben habe, rufe ich dann diese Werte ab.

    Ich muss also um überhaupt rechnen zu können, in den Frame einen Punkt "Berechnungen" einbringen, der dann diese Funktion aufruft, die im Doc ist , und auf die Werte aus den Frame zugreift?



  • Ich fürchte, du hast mich nicht verstanden. 😞

    Lies bitte mal:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-103523.html



  • Also kurz nach mal skizziert:

    In meinen Frame hab rufe ich die Funktion "OnEingabedlg" auf. In dieser Dialogfeldklasse (CDateneingabe) werden die Ergebnisse in öffentlich Membervariablen gespeichert.
    Rufe ich nun in meinen Frame die nächste Funktion auf ("Berechnung"), dann verwendet diese einen Zeiger um auf die Membervariablen der anderen Klasse zuzugreifen. Ist das richtig?

    Wofür brauche ich dann übehaupt die Dokumentenklasse? Wenn ich z.B. in meine Klasse CChildFrm den Header der CDateneingabe.h mit einbinde müsste ich zugriff darauf haben. Da ist doch der Schritt über die Dokumentenklasse überflüssig, oder liege ich jetzt völlig daneben?



  • roeschti schrieb:

    Also kurz nach mal skizziert:

    In meinen Frame hab rufe ich die Funktion "OnEingabedlg" auf. In dieser Dialogfeldklasse (CDateneingabe) werden die Ergebnisse in öffentlich Membervariablen gespeichert.

    Soweit ist es okay. 🙂

    roeschti schrieb:

    Rufe ich nun in meinen Frame die nächste Funktion auf ("Berechnung"), dann verwendet diese einen Zeiger um auf die Membervariablen der anderen Klasse zuzugreifen. Ist das richtig?

    Jein. Du hast das hinter dem Link gelesen?
    Also, Du hast deinen Dialog, der irgendwo ein wenig Speicher belegt und da ist auch das gefüllte Array.
    Wenn du nun im Doc einfach einen Zeiger machst, dann zeigt der ja ins Nirvana, aber NICHT auf den Speicherplatz, wo der Dialog zu finden wäre. (Im Beispiel würdest du jetzt versuchen, mit dem Parkplatz loszufahren.)
    Du musst also das Array weitergeben über Instanzen, die sich kennen. (s.o.)

    Jetzt besser? 🙂



  • Und diese Instanz wird in dem Document erzeugt?
    Also in der Art:

    CDateneingabe Wert1, Wert2;
    

    Wenn ich dann aus dem ChildFrm zugreifen möchte mache ich

    Wert1.variable1     //variable1 ist eine öffentliche Membervariable der Klasse CDateneingabe
    

    vorrausgesetzt die Doc.h ist eingebunden?
    ??Jetzt besser?


Anmelden zum Antworten