Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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?

Geschrieben

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?

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

Geschrieben

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)

Geschrieben

"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?

Geschrieben

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

}

...

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...