Nicht noch ein Editfeldproblem!
-
Hi Memberz.
Der Titel sagt alles: Ich habe ein Problem mit Editfeldern. Ich lese das Editfeld aus, wandle es in einen Integer um, und führe dann Berechnungen aus. Anschließend konvertiere ich den Integer über sprintf wieder zum char-Array://Editfelder auslesen, und in chars old_lp1 und damage_lp1 speichern GetWindowText (hStartPoints1, old_lp1, 25); GetWindowText (hLifePoints1, damage_lp1, 25); //old_lp1 und damage_lp1 in Integer lp11 und lp22 konvertieren lp11 = atoi (old_lp1); lp12 = atoi (damage_lp1); //lp12 von lp11 subtrahieren lp1 = lp11 - lp12; //lp1 in den char new_lp1 wandeln sprintf (new_lp1, "%i", lp1); //Inhalt vom Editfeld hStartPoints1 durch new_lp1 ersetzen SetWindowText (hStartPoints1, new_lp1);Allerdings passiert aber nichts im Editfeld, also die Zahl bleibt die drinstand. Ich habe den char-Array über ne MessageBox ausgeben lassen. Die Ausgabe lautete 0. Das kann aber nicht sein, da 12 - 3 = 9 und nicht 0 ist. Weiß jemand was ich falsch mache?
Mfg Ominion
-
Wie sind die ganzen Variablen denn deklariert, sind die Rückgabewerte der Funktionen i.O., i.e. sind die Handles alle gültig etc.
-
Die Variablen sind so deklariert:
char old_lp1[10]; char damage_lp1[10]; char new_lp1[10]; int lp1; int lp11; int lp12;Die Handles sind gültig, und das ganze steckt in keiner Funktion, sondern in einer WM_COMMAND-Message.
Mfg Ominion
-
Wieso gibst du 25 bei GetWindowText für die Buffergrösse an?
-
Na weil der Text maximal 10 Stellen hat, dachte ich mir, wenn ich die Buffergröße auf 25 stelle, könnte der Text rein theoretisch damit auskommen, da der Puffer sogar 25 Zeichen annehmen müsste.
Mfg Ominion
-
dachte ich mir,
Da dran scheitern viele!
-
~o_
na du solltest schon schauen dass "der Buffer" genauso groß ist wie der String der den Text aufnehmen soll.
[cpp] int GetWindowText( HWND hWnd, // handle of window or control with text LPTSTR lpString, // address of buffer for text int nMaxCount // maximum number of characters to copy } CHAR lpString[10]; nMaxCount = lstrlen(lpString); GetWindowText(hwnd, lpString, nMaxCount); // alternativ GetWindowText(hwnd, lpString, 10); // :o) [/cpp]
-
int nMaxCount // maximum number of characters to copyDas heißt, dass nicht angegeben werden soll wieviele chars es genau sind, sondern wieviele es maximal sind. Also ist es egal ob ich mehr angebe als benötigt werden.
Habs trotzdem mal probiert. Hat auch nichts gebracht.
Mfg Ominion
-
Ominion schrieb:
Das heißt, dass nicht angegeben werden soll wieviele chars es genau sind, sondern wieviele es maximal sind.
du gibst an wieviel chars maximal in dein array kopiert werden können.
Ominion schrieb:
Also ist es egal ob ich mehr angebe als benötigt werden.
du solltest auf keinen fall mehr angeben als dein char array gross ist
-
Wenn das so gemeint ist. Das Problem ist leider aber immer noch nicht gelöst. Ich habe das jetzt zwar so gemacht wie _o~ geschrieben hat, hat aber trotzdem nich funktioniert. Woran liegt das?
Mfg Ominion
-
Ominion schrieb:
Woran liegt das?
der codeabschnitt schein korrekt zu sein. bemühe doch mal deinen debugger
-
Ominion schrieb:
int nMaxCount // maximum number of characters to copyDas heißt, dass nicht angegeben werden soll wieviele chars es genau sind, sondern wieviele es maximal sind. Also ist es egal ob ich mehr angebe als benötigt werden.
quatsch. theoretisch kann windows an der addresse des buffers 25 bytes auf 0 setzen oder sonst irgendwelchen quatsch machen. das bort sich dann schön in eine anderen sachen auf dem stack.
debugger ist etwas übertrieben für so ein problem. lass dir doch erstmal die einzelnen strings nach GetWindowText ausgeben und guck wo was nicht geht. oder poste mehr code.
-
fsdfsd schrieb:
debugger ist etwas übertrieben für so ein problem.

-
Also was er damit sagen will weiß ich nicht.
Mfg Ominion
-
Wie im ersten Beitrag gesagt: Wenn ich den Text ausgeben lasse, kommt immer 0, egal welche Zahlen ich eingebe.
Das kommt beim Debuggen raus:--------------------Konfiguration: main - Win32 Debug-------------------- Kompilierung läuft... Fehler beim Start cl.exe main.exe - 1 Fehler, 0 Warnung(en)Mfg Ominion
-
Also diese Fehlermeldung kommt nur, wenn ich mein Programm in MVC++ 6.0 kompiliere bzw. debugge. Wenn ich das aber im Borland Compiler 5.5 kompiliere, wird das Programm zwar erstellt, aber dann besteht wieder das Problem mit dem Eintragen bzw. auslesen.
Mfg Ominion
-
einfach dem Ratschlag des Vorredners folgen und ma den kompletten code Deiner Routine posten. Ist ja nix triviales was du da friemelst und Dein Fehler wird dann wohl sofort gefunden.
~o_
-
Also WinMain poste ich jetzt mal nicht, da dort nichts besonderes drin ist. Hier ist die CALLBACK-Prozedur:
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hStartPoints1; HWND hStartPoints2; HWND hLifePoints1; HWND hLifePoints2; HWND hCalc1; HWND hCalc2; char old_lp1[10]; char old_lp2[10]; char damage_lp1[10]; char damage_lp2[10]; char new_lp1[10]; char new_lp2[10]; int lp1; int lp2; int lp11; int lp12; int lp21; int lp22; int length11; int length12; int length21; int length22; PAINTSTRUCT ps; HDC hdc; HGDIOBJ OldObj; switch (message) { case WM_CREATE: hStartPoints1 = CreateWindow ("Edit", NULL, WS_CHILD | WS_VISIBLE, 70, 30, 100, 17, hWnd, (HMENU)1, g_hInst, NULL); hStartPoints2 = CreateWindow ("Edit", NULL, WS_CHILD | WS_VISIBLE, 200, 30, 100, 17, hWnd, (HMENU)2, g_hInst, NULL); hLifePoints1 = CreateWindow ("Edit", NULL, WS_CHILD | WS_VISIBLE, 70, 55, 100, 17, hWnd, (HMENU)3, g_hInst, NULL); hLifePoints2 = CreateWindow ("Edit", NULL, WS_CHILD | WS_VISIBLE, 200, 55, 100, 17, hWnd, (HMENU)4, g_hInst, NULL); hCalc1 = CreateWindow ("Button", "Berechnen", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 70, 80, 100, 20, hWnd, (HMENU)5, g_hInst, NULL); hCalc2 = CreateWindow ("Button", "Berechnen", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 200, 80, 100, 20, hWnd, (HMENU)6, g_hInst, NULL); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 5: length11 = lstrlen (old_lp1); length12 = lstrlen (damage_lp1); GetWindowText (hStartPoints1, old_lp1, length11); GetWindowText (hLifePoints1, damage_lp1, length12); lp11 = atoi (old_lp1); lp12 = atoi (damage_lp1); lp1 = lp11 - lp12; sprintf (new_lp1, "%i", lp1); SetWindowText (hStartPoints1, new_lp1); return 0; case 6: length21 = lstrlen (old_lp2); length22 = lstrlen (damage_lp2); GetWindowText (hStartPoints2, old_lp2,length21); GetWindowText (hLifePoints2, damage_lp2, length22); lp21 = atoi (old_lp2); lp22 = atoi (damage_lp2); lp2 = lp21 - lp22; sprintf (new_lp2, "%i", lp2); SetWindowText (hStartPoints2, new_lp2); return 0; } return 0; case WM_PAINT: hdc = BeginPaint (hWnd, &ps); OldObj = SelectObject (hdc, GetStockObject (DEFAULT_GUI_FONT)); SetBkMode (hdc, TRANSPARENT); TextOut (hdc, 10, 30, "Life Points", strlen ("Life Points")); TextOut (hdc, 10, 55, "Schaden", strlen ("Schaden")); TextOut (hdc, 100, 10, "Spieler 1", strlen ("Spieler 1")); TextOut (hdc, 230, 10, "Spieler 2", strlen ("Spieler 2")); TextOut (hdc, 10, 105, "© Software Meadow", strlen ("© Software Meadow")); DeleteObject (SelectObject (hdc, OldObj)); EndPaint (hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hWnd, message, wParam, lParam); }Mfg Ominion
-
Das sollte sizeof sein und nicht lstrlen :
length11 = lstrlen (old_lp1); length12 = lstrlen (damage_lp1);
-
ausserdemsind die ganzwen window handle doch ned static dann kann es ja ned funzen. mach die mal static.
-
Danke jetzt klappts! Ich werde mir jetzt einen Zettel an meinen Screen heften, dass ich static nicht vergessen soll, wenn ich Variablen verändere

lstrlen geht nicht. Dadurch wurde das Ergbenis immer auf 0 gesetzt. Aber mit sizeof hats geklappt.Mfg Ominion