Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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?

Ich versuche ein Edit-Feld und dessen Member-Variable zu füllen, um später darauf zugreifen zu können.

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?

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.

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.

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

Bei static kommt die Meldung:

error C2724: 'GetActiveDlg' : 'static' sollte nicht fuer Member-Funktionen verwendet werden

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)

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

Die Deklaration lautet:

public:

static CExcelProper* GetActiveDlg();

protected:

static CExcelProper* m_pActiveDlg;

in meiner Klasse CExcelProper.

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

}

...

Ja. Geht trotzdem nicht !!!

Jetzt funzts komischerweise, obwohl ich nichts geändert habe.;)

Nochmals Danke !!!:D

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.