Ich blick nicht mehr durch (VC++)

Hallo zusammen!

Langsam packt mich echt die Verzweiflung.
Ich habe nochmal ein ganz einfaches Grundgerüst mit dem Assistenten von VC++ 7.0 gemacht: MFC mit MDI und Doc-View. Dazu habe ich einen Dialog erstellt, eine Dialogklasse erzeugt und den Elementen Variablen zugeordnet. Nix dolles also.
Und jetzt bekomme ich (gleich mehrfach) folgende Fehlermeldungen:
e:…\Stammdaten_dlg.h(15): error C2065: ‚IDD_Stammdaten‘ : nichtdeklarierter Bezeichner
e:…\Stammdaten_dlg.h(15): error C2057: Konstanter Ausdruck erwartet
Die bemäkelte Stelle in Stammdaten_dlg.h habe ich markiert:

#pragma once

// CStammdaten\_dlg-Dialogfeld

class CStammdaten\_dlg : public CDialog
{
 DECLARE\_DYNAMIC(CStammdaten\_dlg)

public:
 CStammdaten\_dlg(CWnd\* pParent = NULL); // Standardkonstruktor
 virtual ~CStammdaten\_dlg();

// Dialogfelddaten
 enum {IDD = IDD\_Stammdaten}; // 

Was das "enum" an der Stelle soll, ist mir auch völlig unverständlich. Es scheint doch darum zu gehen, dass für "IDD" ein spezielles Ziel, hier IDD\_Stammdaten eingesetzt wird .Dafür hätte ich aber "const" oder "define" erwartet. Das führt aber auch nicht zum Erfolg. 
Wer kann mir erklären, was da passiert und vor allem, wie ich mein Programm ans Laufen bekomme??

Danke.
 Arndt

Hi Arndt,

ich arbeite zwar nicht mit der MFC, sondern mit wxWindows, aber in diesem speziellen Fall werde ich dir doch weiterhelfen können.

enum {IDD = IDD_Stammdaten};

Dieses unbenannte enum dient eigentlich dazu, mehreren ein deutigen Konstanten fortlaufende IDs zuzuweisen.

So wäre z.B. folgendes möglich:
#define IDa 1000
#define IDb 1001
#define IDc 1002

Da dies, wie man leicht sieht, ziemlich umständlich sein kann, ist es besser, eine unbenannte enum zu verwenden. Diese zählt dann automatisch hoch: (in diesem Fall ab der angegebenen 1000)

enum
{
IDa = 1000,
IDb,
IDc,

};

Soviel zu enum.
In deinem Fall weist du der Konstanten IDD den Wert der Konstante IDD_Stammdaten zu.
Wenn diese IDD_Stammdaten also nirgends definiert wurde, so erscheint die von dir gezeigte Fehlermeldung.
Probiere einfach mal, dass du IDD = 66666 verwendest.
Geht es dann?

Prinzip verstanden?

Caio, Bill

Hi Bill!

enum {IDD = IDD_Stammdaten};

Dieses unbenannte enum dient eigentlich dazu, mehreren ein
deutigen Konstanten fortlaufende IDs zuzuweisen.

So wäre z.B. folgendes möglich:
#define IDa 1000
#define IDb 1001
#define IDc 1002

Da dies, wie man leicht sieht, ziemlich umständlich sein kann,
ist es besser, eine unbenannte enum zu verwenden. Diese zählt
dann automatisch hoch: (in diesem Fall ab der angegebenen
1000)

enum
{
IDa = 1000,
IDb,
IDc,

};

Soviel zu enum.
In deinem Fall weist du der Konstanten IDD den Wert der
Konstante IDD_Stammdaten zu.

Was hier ziemlich blödsinnig ist, da keine weiteren Konstanten definiert werden.

Wenn diese IDD_Stammdaten also nirgends definiert wurde, so
erscheint die von dir gezeigte Fehlermeldung.

Tja, da fragt sich, wo die denn definiert werden sollte …

Probiere einfach mal, dass du IDD = 66666 verwendest.
Geht es dann?

Ich habe aus anderen Gründen ein neues Gerüst erstellt. Das Problem ist also erstmal erledigt.

Prinzip verstanden?

Jo. Danke!

Gruß
Arndt

Hallo!

Du hast warscheinlich die ID von dem Dialog von ‚IDD_Stammdaten‘ nachträglich (nachdem du die Klasse vom Assistenten erstellen hast lassen) in eine andere geändert, was dazu führt, dass das Präprozessor-define nicht mehr auflösbar ist.
Lösung: nach ENUM die richtige ID eintragen und auch den Konstruktor bzw. CDialog::Create(IDD::xxx) nicht vergessen!

Gruß Pauli!

Hi Pauli!

Du hast warscheinlich die ID von dem Dialog von
‚IDD_Stammdaten‘ nachträglich (nachdem du die Klasse vom
Assistenten erstellen hast lassen) in eine andere geändert,
was dazu führt, dass das Präprozessor-define nicht mehr
auflösbar ist.

Umgekehrt. Die Dinger heißen ja erstmal IDD_DIALOG1 oder so, das hab ich dann in den Eigenschaften geändert. Natürlich geh ich davon aus, dass allen entsprechend angepasst wird. Nunja …

Lösung: nach ENUM die richtige ID eintragen und auch den
Konstruktor bzw. CDialog::Create(IDD::xxx) nicht vergessen!

Ich werds mir merken.
Vielen Dank!

Gruß
Arndt

Nachtrag
Die ID IDD_DIALOG1 wird von Hause aus vergeben, du solltest diese ID also ändern BEVOR du vom ClassWizard ein Klasse erstellen läst, sonst besagtes Problem (und Händisches nachmurxen notwendig)

Gruß Pauli!

1 Like