Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Thunder

Frischling

  • »Thunder« ist der Autor dieses Themas

Beiträge: 15

Wohnort: PK

  • Private Nachricht senden

1

04.08.2006, 21:59

Vokabellernprogramm... mit Fehlern!

Ich habe das Listing 10.3 etwas verändert und wollte es eigentlich zu einem Latein-Vokabellernprogramm umschreiben. Ging auch so weit ganz gut, allerdings habe ich noch nicht sooo die Ahnung von C++ bin also noch ziemlich der Noob, wie man ja am Quellcode auch unschwer erkennen kann. Eigentlich wollte ich das Programm erst fertig schreiben, und dann den Code ordentlich schreiben. Naja, das Problem ist eigentlich folgendes: Ich drücke Tab um mir die erste/die nächste Vokabel anzusehen. Dann schreibe ich meine Vermutung auf, was insula denn eigentlich heißen könnte. Dann klicke ich auf übernehmen, um die Lösung zu sehen. So weit alles in Ordnung. Dann möchte ich die nächste Vokabel sehen und drücke wieder Tab, doch ab da an passiert nichts mehr. Warum, und wie kann ich das beheben?
PS: Bitte nichts gegen meinen Code sagen, ich weiß, dass er scheußlich ist...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
#include <windows.h>
#pragma comment (lib, "winmm.lib")

// Prototypen

//

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam);

HWND ErstelleHauptfenster (HINSTANCE hInst);
void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst);
int Vokabelauswahl;
int Berechnung1 (int &Vokabelauswahl);


// IDs der Child-Fenster

//

#define ID_STATICTEXT      4000
#define ID_EDITBOX         4001
#define ID_BTN_UEBERNEHMEN 4002
#define ID_BTN_BEENDEN     4003
#define ID_BTN_HILFE       4004
#define ID_BTN_NEXT        4005
#define ID_STATICTEXT2     4006



// Globale Variablen

// Don't do this at home!

//

HWND hText;        // Handle für den statischen Text

HWND hText2;       // Handle für den zweiten Text

HWND hEditBox;     // Handle für die Editbox

HWND hUebernehmen; // Handle für Button "Übernehmen"

HWND hBeenden;     // Handle für Button "Beenden"

HWND hHilfe;
HWND hNext;

// Hauptprogramm

//

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                    LPSTR lpcmdline, int ncmdshow)
{
  HWND hWnd;   // Fenster-Handle

  MSG message; // Nachricht


  // Hauptfenster erstellen

  hWnd = ErstelleHauptfenster (hInst);

  // Prüfen, ob alles glatt ging

  if (hWnd == NULL)
    return (0);

  // Alle Steuerelemente erstellen

  ErstelleSteuerelemente (hWnd, hInst);

  // Der "Herzschlag" des Programms

  // Hier werden alle Nachrichten abgeholt,

  // übersetzt und weitergeleitet

  //

  while (GetMessage (&message, NULL, 0, 0) )
  {
    TranslateMessage (&message);
    DispatchMessage  (&message);

  }

  // Programm beenden

  return (int)(message.wParam);

} // WinMain



// Erstelle Hauptfenster

//

// Hauptfenster erstellen und Handle zurückliefern

//

HWND ErstelleHauptfenster (HINSTANCE hInst)
{
  HWND        hWnd;        // Fenster-Handle

  WNDCLASSEX  windowclass; // Nachricht


  // Der Klassenname des Fensters ist frei wählbar

  const char szClassName[] = "Zweites Fenster";

  // Struktur mit gewünschten Eigenschaften füllen

  //


  // Größe der Struktur zwischenspeichern

  windowclass.cbSize = sizeof (WNDCLASSEX);

  // Fenster soll beim Verschieben neu gezeichnet werden

  windowclass.style = CS_HREDRAW | CS_VREDRAW;

  // Zeiger auf Callback-Funktion

  windowclass.lpfnWndProc = WindowProc;

  // Keine erweiterten Einstellungen

  windowclass.cbClsExtra = 0;
  windowclass.cbWndExtra = 0;

  // Instanz speichern

  windowclass.hInstance = hInst;

  // Icons und Cursor festlegen

  windowclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION);
  windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);

  // Hintergrundfarbe festlegen

  windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;

  // Ein Menü brauchen wir nicht

  windowclass.lpszMenuName = NULL;

  // Klassenname angeben

  windowclass.lpszClassName = szClassName;

  // Fensterklasse registrieren

  if (!RegisterClassEx (&windowclass) )
    return (NULL);

  // Das Fenster erzeugen

  hWnd = CreateWindowEx (NULL,
                         szClassName,
                         "Eine kleine Anwendung",
                         WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                         CW_USEDEFAULT, CW_USEDEFAULT,
                         300, 220,
                         NULL,
                         NULL,
                         hInst,
                         NULL);

  // Fensterhandle zurückgeben

  return (hWnd);

} // ErstelleHauptfenster



// ErstelleSteuerelemente

//

// Alle Steuerelemente erstellen

//

void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst)
{
  // Statischen Text als Child-Fenster erstellen

  //

  hText = CreateWindow ("STATIC",
                        "Beispielvokabel",
                        WS_VISIBLE | WS_CHILD | ES_CENTER,
                        0, 0,
                        300, 20,
                        hWnd,
                        (HMENU)ID_STATICTEXT,
                        hInst,
                        NULL);

  hText2 = CreateWindow ("STATIC",
                        "Richtig ist: ",
                        WS_VISIBLE | WS_CHILD | ES_CENTER,
                        0, 40,
                        300, 30,
                        hWnd,
                        (HMENU)ID_STATICTEXT2,
                        hInst,
                        NULL);


  // Editbox als Child-Fenster erstellen

  //

  hEditBox = CreateWindow ("EDIT",
                           "Bitte Text eingeben",
                           WS_VISIBLE | WS_CHILD | WS_BORDER | ES_CENTER,
                           0, 20,
                           300, 20,
                           hWnd,
                           (HMENU)ID_EDITBOX,
                           hInst,
                           NULL);

  // "Übernehmen"-Button als Child-Fenster erstellen

  //

  hUebernehmen = CreateWindow ("BUTTON",
                           "Übernehmen",
                           BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                           20, 80,
                           95, 40,
                           hWnd,
                           (HMENU)ID_BTN_UEBERNEHMEN,
                           hInst,
                           NULL);

  // "Beenden"-Button als Child-Fenster erstellen

  //

  hBeenden = CreateWindow ("BUTTON",
                           "Beenden",
                           BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                           175, 80,
                           95, 40,
                           hWnd,
                           (HMENU)ID_BTN_BEENDEN,
                           hInst,
                           NULL);


    hHilfe = CreateWindow ("BUTTON",
                           "Hilfe",
                           BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                           175, 135,
                           95, 40,
                           hWnd,
                           (HMENU)ID_BTN_HILFE,
                           hInst,
                           NULL);


    hNext = CreateWindow ("BUTTON",
                           "Next",
                           BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                           20, 135,
                           95, 40,
                           hWnd,
                           (HMENU)ID_BTN_NEXT,
                           hInst,
                           NULL);

} // ErstelleSteuerelemente



// Callback-Funktion zur Nachrichtenverarbeitung

//

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
  // Messages auswerten

  switch (message)
  {
  case WM_KEYDOWN:
      {
          switch (wParam)
          {
          case VK_TAB:
            {
            Berechnung1 (Vokabelauswahl);
            return (0);
            }
          }
      }






    // Fenster schließen? (Auch Alt-F4)

    case WM_DESTROY:
    {
      // Nachricht zum Beenden schicken

      PostQuitMessage (0);
      return (0);

    }
    
            switch (wParam)
            {
                case VK_ESCAPE:
                {
                    PostQuitMessage (0);
                    return (0);
                }
            }break;



    // Ab hier die Nachrichten unserer Child-Fenster bearbeiten

    case WM_COMMAND:
    {       

      switch (wParam)
      {
        case ID_BTN_UEBERNEHMEN:
        {
          if (Vokabelauswahl == 1)
          {SetWindowText (hText2, "Richtig ist: Insel");}
          else if (Vokabelauswahl == 2)
          {SetWindowText (hText2, "Richtig ist: Herr");}
          

          return (0);


        }



        case ID_BTN_NEXT:
        {
            Berechnung1 (Vokabelauswahl);
            return (0);
        }



        case ID_BTN_HILFE:
        {
            int Resultat;
            Resultat = MessageBox (hWnd, "Hier kommt dann die Hilfe hin...",
                                   "Hilfe",
                                   MB_OK | MB_ICONINFORMATION);
            return (0);
        }




        case ID_BTN_BEENDEN:
        {
          int Resultat;

          // Messagebox für Sicherheitsabfrage

          Resultat = MessageBox (hWnd, "Wirklich beenden?",
                                 "Programm beenden",
                                 MB_YESNO | MB_ICONQUESTION);

          if (Resultat == IDYES)
          {
            PostQuitMessage (0);
            return (0);

          }

          return (0);

        }
      } break;
    } break;
  }

  // Die Nachricht wurde nicht von uns verarbeitet, also

  // von Windows verarbeiten lassen

  return (DefWindowProc (hWnd, message, wParam, lParam) );

} // WindowProc










int Berechnung1 (int &Vokabelauswahl)
{
    srand (timeGetTime ());
    Vokabelauswahl = (rand ()%2 )+1;      //hier die Anzahl der Vokabeln






    if (Vokabelauswahl == 1)
    {
        SetWindowText (hText, "insula f.");
        SetWindowText (hEditBox, "");
        SetWindowText (hText2, "Richtig ist: ");
    }

    else if (Vokabelauswahl == 2)
    {
        SetWindowText (hText, "dominus m.");
        SetWindowText (hEditBox, "");
        SetWindowText (hText2, "Richtig ist: ");
    }

    return (0);

}

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

05.08.2006, 08:02

Passiert gar nichts, oder wird wieder "insula" vorgeschlagen?

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Anonymous

unregistriert

3

05.08.2006, 11:21

Dir sollte klar sein, das bei deinem Code öfters die gleiche Variable kommen
wird...

Zitat

PS: Bitte nichts gegen meinen Code sagen, ich weiß, dass er scheußlich ist...


Wenn wir nix sagen sollen, können wir dir auch nicht helfen deinen Stil
zu verbessern und der Stil bleibt dann normalerweise so "scheußlich".

EDIT: Habs mal kompiliert. Funzt doch, wenn du öfters auf Next klickst...
Wie gesagt, liegt an deiner Zufallszahl. Aber dein Programm ist sowieso
noch ziemlich verbuggt...

Thunder

Frischling

  • »Thunder« ist der Autor dieses Themas

Beiträge: 15

Wohnort: PK

  • Private Nachricht senden

4

07.08.2006, 14:57

Jaja, es funzt auch, kein Thema. Aber das Problem ist, dass ich nicht klicken möchte, sondern das Programm NUR mit der Tastatur bedienen möchte, heißt also, dass ich die nächste Vokabel mit der Tab taste aufrufen möchte und das klappt nur, wenn ich zuvor nicht auf Next geklickt habe.

Ach na gut, dann erzählt mir doch mal, was für Bugs das Programm hat und wie ich das verbessern kann. Aber kommt mir bitte nicht mit solchen über-profi-Funktionen, so weit bin ich ja dann doch noch nicht...

Ach, und das mehrmals Insula kommt liegt einfach daran, dass ja erst zwei Vokabeln vorhanden sind. Aber das wird dann erweitert, wenn das eigentliche Programm erst mal fertig ist.

Anonymous

unregistriert

5

07.08.2006, 19:39

Allein die Vokabeln könntest du viel komfortabler in eine Textdatei schreiben.
Wozu Prototypen? Ordne deine Funktionen doch einfach! Globale Variablen
sind auch nicht so der Hit...

Das erstmal ganz grob und das wichtigste... Wenn dein Programm
fertig ist, könntest du es ja im Projekte Forum posten als Open-Source, da
wirst du sicherlich ein paar Verbesserungsvorschläge erhalten ;)

So wie es jetzt ist KANN man es machen und da der Code noch sehr kurz ist
kann man jetzt auch noch nicht soviel zu sagen.

6

07.08.2006, 20:12

Gegen Funktionsprototypen kannst de nix sagen... Wenn man das ganze übersichtlich aufbaut sind die eher vorteilhaft.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Anonymous

unregistriert

7

07.08.2006, 20:26

Ich finde Prototypen unsinnig, wozu Prototypen, wenn mans gleich ordnen
kann?

8

07.08.2006, 21:14

Tja.. was du nicht alles empfindest... es kann auch zur übersichtlichkeit beitragen. Bei mir bsw. ist der Einstiegspunkt auch immer das 1. was da steht... und keine andere Funktion (also keine definition... die declaration ist natürlich vor der main ;)).

Ist aber sicherlich Ansichtssache... kannst de ihm aber nicht als schlechten Codestyle anrechnen...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Anonymous

unregistriert

9

07.08.2006, 21:57

Ich sag ja gar nicht, dass es schlechter Stil ist, es ist nur meiner Meinung
nach unsinnig. :)

Thunder

Frischling

  • »Thunder« ist der Autor dieses Themas

Beiträge: 15

Wohnort: PK

  • Private Nachricht senden

10

11.08.2006, 21:00

Nagut, aber der Style ist ja auch gar nich das eigentliche Problem an der Sache. So langsam verzweifle ich noch an dem Programm...
Ich will doch nur, dass man mit der Tab-Taste die nächste Vokabel sieht, auch wenn man vorher auf "Next" geklickt hat! Warum funzt dat denn nich?

Werbeanzeige