Zum Inhalt springen

Member-Variable füllen ohne Dialog anzuzeigen


Comroader

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

}

...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...