www.mikrocontroller.net

Forum: PC-Programmierung DoModal()


Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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'
#include "Bruno.h"

CBrunoApp anApp;

BOOL CBrunoApp::InitInstance()
{
  CBrunoApp dlg;
  dlg.DoModal();
  return FALSE;
}

CBrunoDlg::CBrunoDlg(CWnd* pParent) : CDialog(IDD_DIALOG, pParent)
{
  m_dNetto=0.0;
  m_dBrutto=0.0;
}

void CBrunoDlg::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  DDX_Text(pDX, IDC_NETTO,m_dNetto);
  DDX_Text(pDX, IDC_BRUTTO,m_dBrutto);
}

BEGIN_MESSAGE_MAP(CBrunoDlg,CDialog)
  ON_BN_CLICKED(IDOK, OnBerechnen)
END_MESSAGE_MAP()

void CBrunoDlg::OnBerechnen()
{
  UpdateData(TRUE);
  m_dBrutto = 1.16*m_dNetto;
  UpdateData(FALSE);
}

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

und jetzt kommt die Frage:
Warum?

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BOOL CBrunoApp::InitInstance()
{
  CBrunoApp* dlg;
  dlg->DoModal();
  return FALSE;
}

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ersetze
BOOL CBrunoApp::InitInstance()
{
  CBrunoApp* dlg;
  dlg->DoModal();
  return FALSE;
}

durch
BOOL CBrunoApp::InitInstance()
{
  CBrunoDlg* dlg;  // <<<--- !!
  dlg->DoModal();
  return FALSE;
}

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.

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und jetzt tauscht du noch
BOOL CBrunoApp::InitInstance()
{
  CBrunoDlg* dlg;  // <<<--- !!
  dlg->DoModal();
  return FALSE;
}

durch
BOOL CBrunoApp::InitInstance()
{
  CBrunoDlg dlg;
  dlg.DoModal();
  return FALSE;
}

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



Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sieh ganz oben.

Nein hast du nicht.

Du musst sorgfältiger arbeiten.
Du hast angefangen mit:
BOOL CBrunoApp::InitInstance()
{
  CBrunoApp dlg;
  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.

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CBrunoApp anApp;

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

...
nix passiert. Gibts da noch irgendwelche Einstellungen, an denen ich 
stellen muss?

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.