DoModal()

Gast #503521
Hallo
ich versuche gerade mich in MFC einzulesen. Als Beipiel untenstehendes 
Programm. Wenn ichs ausführen will, kommt der Fehler
'DoModal' ist kein Element von 'CBrunoApp'
1
#include "Bruno.h"
2

3
CBrunoApp anApp;
4

5
BOOL CBrunoApp::InitInstance()
6
{
7
  CBrunoApp dlg;
8
  dlg.DoModal();
9
  return FALSE;
10
}
11

12
CBrunoDlg::CBrunoDlg(CWnd* pParent) : CDialog(IDD_DIALOG, pParent)
13
{
14
  m_dNetto=0.0;
15
  m_dBrutto=0.0;
16
}
17

18
void CBrunoDlg::DoDataExchange(CDataExchange* pDX)
19
{
20
  CDialog::DoDataExchange(pDX);
21
  DDX_Text(pDX, IDC_NETTO,m_dNetto);
22
  DDX_Text(pDX, IDC_BRUTTO,m_dBrutto);
23
}
24

25
BEGIN_MESSAGE_MAP(CBrunoDlg,CDialog)
26
  ON_BN_CLICKED(IDOK, OnBerechnen)
27
END_MESSAGE_MAP()
28

29
void CBrunoDlg::OnBerechnen()
30
{
31
  UpdateData(TRUE);
32
  m_dBrutto = 1.16*m_dNetto;
33
  UpdateData(FALSE);
34
}

Nach meinem Gegoogeltem habe ich noch die Möglichkeit
1
BOOL CBrunoApp::InitInstance()
2
{
3
  CBrunoApp dlg;
4
  dlg.DoModal();
5
  return FALSE;
6
}

und jetzt kommt die Frage:
Warum?
Persönliche Seite #503528
Ersetze
1
BOOL CBrunoApp::InitInstance()
2
{
3
  CBrunoApp* dlg;
4
  dlg->DoModal();
5
  return FALSE;
6
}

durch
1
BOOL CBrunoApp::InitInstance()
2
{
3
  CBrunoDlg* dlg;  // <<<--- !!
4
  dlg->DoModal();
5
  return FALSE;
6
}

Im übrigen ist die Chance, daß Dir geholfen wird, ungleich größer, wenn 
Du auch die zu Deinen Klassen gehörenden Deklarationen hier postest - 
sprich: Deine Headerdateien.
Gast #503555
Danke, der Fehler ist weg. Aber das Dialogfenster wird nicht angezeigt.


[C]
#include <afxwin.h>
#include "resource.h"

class CBrunoApp:public CWinApp
{
public:
  BOOL InitInstance();
};

class CBrunoDlg:public CDialog
{
public:
  CBrunoDlg(CWnd* pParent = NULL);

  // *** Dialogfenster Bruno.rc Behandlung ***

  void DoDataExchange(CDataExchange* pDX);
  void OnBerechnen();
private:
  double m_dNetto;
  double m_dBrutto;
  DECLARE_MESSAGE_MAP()

  // *****************************************
};
[C]
#503610
Und jetzt tauscht du noch
1
BOOL CBrunoApp::InitInstance()
2
{
3
  CBrunoDlg* dlg;  // <<<--- !!
4
  dlg->DoModal();
5
  return FALSE;
6
}

durch
1
BOOL CBrunoApp::InitInstance()
2
{
3
  CBrunoDlg dlg;
4
  dlg.DoModal();
5
  return FALSE;
6
}

Also den Stern weg.
Du brauchst ja ein CBrunoDlg Objekt und keinen Pointer
drauf. Ein Pointer ist nur ein Verweis auf ein mögliches
Objekt. Aber dann muss es auch ein Objekt geben und der
Pointer muss drauf zeigen.
Du hast aber noch kein CBrunoDlg Objekt. Also musst du
eines anlegen.

   CBrunoDlg dlg;

jetzt gibt es ein Objekt vom Typ CBrunoDlg und das Objekt
heist dlg.

Und dann gibt es die Anweisung an dieses Dialog-Objekt:
Zeig dich mal und lass die Dialogbearbeitung laufen:

  dlg.DoModal();


Gast #503661
Ohne Zeiger hab ichs auch probiert in InitInstance(). Sieh ganz oben. 
Das mit der Endung Dlg hab ich ja geändert. Es wird nichts angezeigt.
Na ja aller Anfang ist sehr schwer
#503706
> Sieh ganz oben.

Nein hast du nicht.

Du musst sorgfältiger arbeiten.
Du hast angefangen mit:
1
BOOL CBrunoApp::InitInstance()
2
{
3
  CBrunoApp dlg;
4
  dlg.DoModal();

Du legst ein CBrunoApp Objekt an namens dlg.
Du brauchst aber kein CBrunoApp Objekt. Du
brauchst ein CBrunoDlg Objekt!

CBrunoApp     repräsentiert die komplette Applikation
CBrunoDlg     repräsentiert einen Dialog in einer Applikation

> Das mit der Endung Dlg hab ich ja geändert.

Du hast nicht nur die Endung 'Dlg' geändert, du hast (wenn
du dem Vorschlag gefolgt bist) im gleichen Atemzug auch
aus dem Objekt einen Pointer gemacht.

> Na ja aller Anfang ist sehr schwer
Ist er nicht. Gerade mit der MFC sind solche Dinge ziemlich
einfach. Wenn du gegen die original WinAPI programmierst,
ja das ist schwer. Aber die MFC versteckt schon sehr viel
an Komplexität.
Gast #504268
1
CBrunoApp anApp;
2

3
BOOL CBrunoApp::InitInstance()
4
{
5
  CBrunoDlg  dlg; // Ich brauche ein CBrunoDlg Objekt
6
  dlg.DoModal(); // Ich starte es Modal,
7
  return FALSE;  // beende nach öffnen des Dialog
8
}
9

10
...
nix passiert. Gibts da noch irgendwelche Einstellungen, an denen ich 
stellen muss?
Gast #504437
Hat sich erledigt, war von den Dateien falsch angelegt. Ich habs stumpf 
nach dem Skript probiert. Jetzt halt mit dem Wizard.
Ist ja auch viel einfacher ... warum es nicht funktioniert, weiß ich 
damit aber immer noch nicht

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.