Forum: PC-Programmierung DoModal()


von Pascal (Gast)


Lesenswert?

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?

von Pascal (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Pascal (Gast)


Lesenswert?

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]

von Karl H. (kbuchegg)


Lesenswert?

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();



von Pascal (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Pascal (Gast)


Lesenswert?

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?

von Pascal (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.