Comroader Geschrieben 17. Februar 2002 Teilen Geschrieben 17. Februar 2002 Hey, Kennt Ihr eine Möglichkeit eine Member-Variable von einem Dialog zu füllen, wenn man in einem anderen ist, ohne den Dialog vorher mit DoModal oder ShowWindow aufzurufen. Thanks. Microsoft is good, but we are better. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 17. Februar 2002 Teilen Geschrieben 17. Februar 2002 Du kannst auf die Member einer Dialogklasse wie bei jeder anderen zugreifen, auch ohne dass DoModal oder ShowWindow aufgerufen wurde. Beispiel: CMyDlg mydlg; mydlg.m_nCounter = 0; if( IDOK == mydlg.DoModal() ) ... Besondere Member wie zum Beispiel m_hWnd oder Steuerelement-Variablen können allerdings Probleme bereiten, weil sie auf Objekte verweisen, die erst mit DoModal erzeugt werden. Was genau versuchst Du denn? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Comroader Geschrieben 18. Februar 2002 Autor Teilen Geschrieben 18. Februar 2002 Ich versuche ein Edit-Feld und dessen Member-Variable zu füllen, um später darauf zugreifen zu können. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Februar 2002 Teilen Geschrieben 18. Februar 2002 Wenn die Member-Variable des Edit-Felds ein CString ist, dann kannst Du dem schon vor DoModal/ShowWindow einen Wert zuweisen. Wenn es ein CEdit ist, dann geht das nicht, weil das Fenster des Edit-Felds noch nicht erzeugt wurde. Wenn Du z.B. die Sichtbarkeit oder das Read-Only-Flag setzen willst, dann musst Du der Dialogklasse mit dem Steuerelement jeweils einen BOOL-Member verpassen, den Du nach dem Erzeugen des Dialogs setzen kannst, und in der OnInitDialog abfragst: CMyDlg dlg; dlg.m_fShowEditField = TRUE; dlg.m_fAllowInput = TRUE; dlg.DoModal(); ... BOOL CMyDlg::OnInitDialog() { ... GetDlgItem( IDC_EDIT )->ShowWindow( m_fShowEdit ? SW_SHOW : SW_HIDE ); GetDlgItem( IDC_EDIT )->EnableWindow( m_fAllowInput ); ... } Aber was anderes: Das ist ja nun nicht Deine erste Zwei-Dialoge-Frage Kann es sein, dass da ein grundsätzliches Problem besteht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Comroader Geschrieben 18. Februar 2002 Autor Teilen Geschrieben 18. Februar 2002 Stimmt. Ich hab da wirklich noch einige Probleme, da ich noch nicht sehr lange mit der MFC arbeite. Vielleicht kannst du noch einmal allgemein erklären wie die Kommunikation zwischen zwei Dialogen funktioniert. Danke. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Februar 2002 Teilen Geschrieben 18. Februar 2002 Also, ich nehme mal an: - Du hast zwei Dialoge, wobei wahrscheinlich der eine den anderen erzeugt. - Du musst zwischen den beiden Dialogen Daten austauschen oder synchronisieren Dann würde ich folgendes vorschlagen: Verpass jeder der beiden Klassen eine statische Funktion, die einen Zeiger auf eine Instanz der Dialogklasse zurückgibt. Dazu braucht jede Klasse zusätzlich noch einen statischen Member-Zeiger auf die eigene Klasse: class CDlg1 : public CDialog { public: static CDlg1* GetActiveDlg(); ... protected: static CDlg1* m_pActiveDlg; ... } Die statische Variable m_pActiveDlg gibt es genau einmal, egal wieviele Instanzen von CDlg1 Du erzeugst. Es gibt sie auch, wenn noch gar keine Instanz erzeugt ist. Du musst die Variable in der Quellcodedatei der Dialogklasse initialisieren, am besten gleich nach den #includes CDlg* CDlg::m_pActiveDlg = NULL; Jetzt musst Du nur noch dafür sorgen, dass die statische Variable mit Werten versorgt wird, wenn ein Dialog erzeugt wird. In der OnInitDialog: m_pActiveDlg = this; Du musst natürlich auch sicherstellen, dass nach dem Beenden des Dialogs der statische Zeiger wieder zurückgesetzt wird, damit kein Zeiger auf eine nicht mehr existierende Instanz zurückgegeben wird. Dazu könntest Du OnClose überladen, oder den Destruktor verwenden (unsicher): In OnClose oder im Destruktor m_pActiveDlg = NULL; Die statische Funktion GetActiveDlg sieht so aus: CDlg1* CDlg1::GetActiveDlg() { return m_pActiveDlg; } Das gleiche machst Du für die andere Klasse. Dann kannst Du jederzeit prüfen, ob der andere Dialog gerade aktiv ist, und auf die Member zugreifen: CDlg2::DoSomething() { CDlg1* pOtherDlg = CDlg1::GetActiveDlg(); if( !pOtherDlg ) return; // kein anderer Dialog da! pOtherDlg->m_strEditField = "foo"; pOtherDlg->m_ctlPushButton.EnableWindow( FALSE ); } Das ganze ist zwar immer noch nicht ganz sicher, aber für den Anfang sollte es reichen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Comroader Geschrieben 18. Februar 2002 Autor Teilen Geschrieben 18. Februar 2002 Welchen Typ hat die Funktion CDlg1* CDlg1::GetActiveDlg() { return m_pActiveDlg; } Bei static kommt die Meldung: error C2724: 'GetActiveDlg' : 'static' sollte nicht fuer Member-Funktionen verwendet werden Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Februar 2002 Teilen Geschrieben 18. Februar 2002 Die Funktion ist static, der Typ ist CDlg1*, also Zeiger auf die Dialogklasse. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Comroader Geschrieben 18. Februar 2002 Autor Teilen Geschrieben 18. Februar 2002 Bei static kommt die Meldung: error C2724: 'GetActiveDlg' : 'static' sollte nicht fuer Member-Funktionen verwendet werden Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Comroader Geschrieben 18. Februar 2002 Autor Teilen Geschrieben 18. Februar 2002 Wenn ich nicht static sondern den Typ CDlg1* verwende kommt die Meldung: error LNK2001: Nichtaufgeloestes externes Symbol "protected: static class CExcelProper * CExcelProper::m_pActiveDlg" (?m_pActiveDlg@CExcelProper@@1PAV1@A) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Februar 2002 Teilen Geschrieben 18. Februar 2002 "static" hat nichts mit dem Typ zu tun, sondern bedeutet nur, dass sich alle Instanzen der Klasse eine Variable teilen. Die beiden Angaben schließen sich nicht gegenseitig aus. Wie genau lautet bei Dir die Deklaration sowohl der statischen Funktion als auch der statischen Variablen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Comroader Geschrieben 18. Februar 2002 Autor Teilen Geschrieben 18. Februar 2002 Die Deklaration lautet: public: static CExcelProper* GetActiveDlg(); protected: static CExcelProper* m_pActiveDlg; in meiner Klasse CExcelProper. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Februar 2002 Teilen Geschrieben 18. Februar 2002 Die Deklarationen sind richtig. Hast Du die statische Variable am Anfang der cpp-Datei initialisiert? Wenn nicht, würde das nämlich den Linker-Fehler erklären. Irgendwo in der Quellcodedatei für CExcelProper (außerhalb der Funktionsimplementierungen) muss stehen: #include "ExcelProper.h" ... CExcelProper* CExcelProper::m_pActiveDlg = NULL; // <-- WICHTIG, Initialisierung der statischen Variablen ... CEcxelProper::CExcelProper() { ... // Ctor } ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Comroader Geschrieben 18. Februar 2002 Autor Teilen Geschrieben 18. Februar 2002 Ja. Geht trotzdem nicht !!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Februar 2002 Teilen Geschrieben 18. Februar 2002 Ach ja, in der Implementierung der Funktion GetActiveDlg (in der cpp-Datei) darf nicht static stehen, nur in der h-Datei, sonst kommt dieser C2724-Fehler. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Comroader Geschrieben 18. Februar 2002 Autor Teilen Geschrieben 18. Februar 2002 Jetzt funzts komischerweise, obwohl ich nichts geändert habe. Nochmals Danke !!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.