GetWindowText funktioniert beim 2. Knopfdruck nicht ! ???
-
noha_39 schrieb:
und es werden auch nicht mehr als 39 Zeichen reingeschrieben.
Doch. Deine Reset-Funktion beispielsweise schreibt 41 Zeichen in WortArt. Der letzte gültige Index ist WortArt[39], du greifst in deiner Schleife aber auf WortArt[40] zu, gleiches gilt für Stamm und Info. Das ist möglicherweise schon Speicher, der zum nachfolgenden Zeiger gehört. In dieser Funktion macht das vermutlich nichts, weil du die Zeiger danach setzt. Aber wenn du ähnlich kaputte Schleifen auch an anderer Stelle hast, kann das schon ordentlich in die Hose gehen.
Aber wie gesagt, die Zeiger brauchst du gar nicht.
-
Gut ich habe alles überprüft ,ich habe garkeine anderen Schleifen also auch keine "kaputten" damit wäre mein Problem also noch nicht gelöst trotzdem Danke schonmal für die Bemühungen (ich schäme mich schon für den Schleifenfehler)

-
Prüf doch mal mit dem Debugger, wohin lpWortArt an dieser Stelle wirklich zeigt. Oder gib einfach mal WortArt in der MessageBox aus, das funktioniert ohne irgendeinen Cast.
-
Das mit der MessageBox() habe ich ja gemacht und da zeigt die Message Box nichts an (hab auch die "eben neu erlernte" Schreibweise benutzt)
-
Hmm zeig mal bitte deinen kompletten Source ... da sind wahrscheinlich so einige Fehler drin. Damit du wenigstens ne anständige Basis hast um anzufangen.
-
Im Debug Modus scheint alles zu funktionieren! -> find das sehr komisch
da hab ich nur festgestellt das was anderes von mir falsch gemacht wurde (bin mir sehr sicher das das nichts damit zu tun hat)
-
Code sieht so aus (weis das das noch optimierungsbedürftig ist)
#include "stdafx.h" #include "Vokabler.h" #define ID_EDIT1 1 #define ID_EDIT2 2 #define ID_EDIT3 3 #define ID_EDIT4 4 static struct { TCHAR WortArt[40] ; LPTSTR lpWortArt ; TCHAR Lat[25] ; LPTSTR lpLat ; TCHAR Ger[100] ; LPTSTR lpGer ; TCHAR Info[1000] ; LPTSTR lpInfo ; TCHAR Genus[1] ; TCHAR Deklination[2] ; TCHAR Stamm[20] ; LPTSTR lpStamm ; }VOK; /* Declare Window procedure */ LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); VOID Reset() ; static TCHAR szAppName[] = TEXT ("Vokabler 3.0") ; // Anwendungsname // Main Funktion des Programms int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; /* This is the handle for our window */ MSG msg; /* Here messages to the application are saved */ WNDCLASS wndclass; /* Data structure for the windowclass */ /* The Window structure */ wndclass.hInstance = hInstance; wndclass.lpszClassName = szAppName; wndclass.lpfnWndProc = WndProc; /* This function is called by windows */ wndclass.style = CS_HREDRAW | CS_VREDRAW; /* Catch double-clicks */ wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.lpszMenuName = NULL; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); /* Register the window class, and if it fails quit the program */ if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("Dieses Programm erfordert Windows NT 5.0, Windows XP oder höher"), szAppName, MB_ICONERROR) ; return 0; } /* The class is registered, let's create the program*/ hwnd = CreateWindow (szAppName, /* Classname */ TEXT ("Übersetzer"), /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 900, /* The programs width */ 200, /* and height in pixels */ NULL, /* The window is a child-window to desktop */ NULL, /* No menu */ hInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&msg, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&msg); /* Send message to WindowProcedure */ DispatchMessage(&msg); } return msg.wParam; } VOID Reset() { int i; for( i=0 ; i<41 ; i++ ) { VOK.WortArt[i] = NULL ; } VOK.lpWortArt = VOK.WortArt ; for( i=0 ; i<21 ; i++ ) { VOK.Stamm[i] = NULL ; } VOK.lpStamm = VOK.Stamm ; for (i=0; i>1001 ; i++ ) { VOK.Info[i] = NULL ; } VOK.lpInfo = VOK.Info ; } // Window Prozedur LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { // Variablen für WM_PAINT HDC hdc; PAINTSTRUCT ps; RECT rect ; // Variablen für Steuerelemente static HWND hwndLAT, hwndGER, hwndWortArt, hwndInfo, hwndButton ; int i=0; switch (message) /* handle the messages */ { case WM_CREATE: hwndLAT= CreateWindow (TEXT ("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL , 100, 13, 200, 100, hwnd, (HMENU) ID_EDIT1,((LPCREATESTRUCT) lParam)-> hInstance, NULL) ; hwndGER= CreateWindow ( TEXT("edit"),NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL ,45,45,100,40,hwnd,(HMENU) ID_EDIT2,((LPCREATESTRUCT) lParam)-> hInstance, NULL) ; hwndWortArt= CreateWindow ( TEXT("edit"),NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL ,45,100,300,20,hwnd,(HMENU) ID_EDIT3,((LPCREATESTRUCT) lParam)-> hInstance, NULL) ; hwndInfo = CreateWindow ( TEXT("edit"),NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL ,45,100,300,20,hwnd,(HMENU) ID_EDIT4,((LPCREATESTRUCT) lParam)-> hInstance, NULL) ; hwndButton = CreateWindow ( TEXT("button"),TEXT("N E X T ->"), WS_CHILD | WS_VISIBLE ,45,45,100,40,hwnd,(HMENU) 1,((LPCREATESTRUCT) lParam)-> hInstance, NULL) ; Reset() ; return 0; case WM_SIZE: MoveWindow (hwndLAT, 45, 10, 200, 20 ,TRUE) ; MoveWindow (hwndGER, 45, 45, 200, 20 ,TRUE) ; MoveWindow (hwndWortArt, 45, 80, 200, 20 ,TRUE) ; MoveWindow (hwndInfo,45,115,500,20,TRUE ); MoveWindow (hwndButton,250,10,300,90, TRUE); return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rect); EndPaint(hwnd,&ps) ; return 0; case WM_COMMAND: switch(HIWORD(wParam)) { case BN_CLICKED: //Wenn auf Steuerelement geklickt wird GetWindowText(hwndWortArt,VOK.WortArt,40) ; GetWindowText(hwndLAT,VOK.Lat,25); GetWindowText(hwndGER,VOK.Ger,100); GetWindowText(hwndInfo,VOK.Info,1000); MessageBox(hwnd,VOK.WortArt,NULL,NULL); /* VOK.lpWortArt = VOK.WortArt ; VOK.lpLat = VOK.Lat ; VOK.lpGer = VOK.Ger ; VOK.lpInfo = VOK.Info; */ if( wcscmp(VOK.lpWortArt,TEXT("nomen"))==0 || wcscmp(VOK.lpWortArt,TEXT("Nomen"))==0 || wcscmp(VOK.lpWortArt,TEXT("NOMEN"))==0 ) { VOK.Genus[0] = VOK.Info[0] ; MessageBox(hwnd,LPTSTR(VOK.Genus),NULL,NULL); VOK.Deklination[0] = VOK.Info[2] ; VOK.Deklination[1] = VOK.Info[3] ; MessageBox(hwnd,LPTSTR(VOK.Deklination),NULL,NULL); for( i=5 ; i<1000 ; i++ ) { if( VOK.Info[i] == 0x0020 ) { break; } else { VOK.Stamm[i-5] = VOK.Info[i] ; } } MessageBox(hwnd,LPTSTR(VOK.Stamm),NULL,NULL); } if( wcscmp(VOK.lpWortArt,TEXT("adjektiv"))==0 || wcscmp(VOK.lpWortArt,TEXT("Adjektiv"))==0 || wcscmp(VOK.lpWortArt,TEXT("ADJEKTIV"))==0 ) { VOK.Deklination[0] = VOK.Info[0] ; VOK.Deklination[1] = VOK.Info[1] ; MessageBox(hwnd,LPTSTR(VOK.Deklination),NULL,NULL); for( i=3 ; i<1000 ; i++ ) { if( VOK.Info[i] == 0x0020 ) { break; } else { VOK.Stamm[i-3] = VOK.Info[i] ; } } MessageBox(hwnd,VOK.lpStamm,NULL,NULL); } Reset() ; SetFocus(hwnd); } return 0; case WM_KEYDOWN: switch(wParam) { case VK_F1: MessageBox(hwnd,VOK.lpStamm,NULL,NULL); } return 0; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }nach dem Vergleich ob nomen oder adjektiv stimmt in beiden was nicht [Denkfehler]
-
#include <windows.h> #include <tchar.h> struct Vokabulary { TCHAR szKindOf[128]; TCHAR szLatin[128]; TCHAR szGerman[128]; TCHAR szInformation[1024]; TCHAR szGender[2]; TCHAR szDeclension[2]; TCHAR szRoot[32]; Vokabulary() { memset(szKindOf, 0, sizeof(TCHAR) * 128); memset(szLatin, 0, sizeof(TCHAR) * 128); memset(szGerman, 0, sizeof(TCHAR) * 128); memset(szInformation, 0, sizeof(TCHAR) * 1024); memset(szGender, 0, sizeof(TCHAR) * 1); memset(szDeclension, 0, sizeof(TCHAR) * 2); memset(szRoot, 0, sizeof(TCHAR) * 32); } }; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); #define IDC_EDT_LATIN 120 #define IDC_EDT_GERMAN 121 #define IDC_EDT_KIND 122 #define IDC_EDT_INFO 123 #define IDC_BTN_NEXT 124 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR szCmdLine, int iCmdShow) { WNDCLASSEX wc; wc.cbSize = sizeof (WNDCLASSEX); wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.lpszClassName = _T("VokabularyWnd"); wc.lpfnWndProc = WndProc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm = wc.hIcon; wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.lpszMenuName = NULL; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); if (RegisterClassEx(&wc) == 0) { MessageBox (NULL, _T("Fehler beim registrieren der Fensterklasse!"), _T("Vokabler 0.1 Beta"), MB_OK | MB_ICONERROR); return 0; } HWND hWnd = CreateWindowEx(0, _T("VokabularyWnd"), _T("Vokabler 0.1 Beta"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 900, 200, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { MessageBox(NULL, _T("Fenster konnte nicht erstellt werden!"), _T("Vokabler 0.1 Beta"), MB_OK | MB_ICONERROR); return 0; } ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return static_cast<int>(msg.wParam); } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { HINSTANCE hInstance = ((LPCREATESTRUCT)lParam)->hInstance; CreateWindowEx(0, _T("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, 100, 13, 200, 100, hWnd, (HMENU)IDC_EDT_LATIN, hInstance, NULL); CreateWindowEx(0, _T("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, 45, 45, 100, 40, hWnd, (HMENU)IDC_EDT_GERMAN, hInstance, NULL); CreateWindowEx(0, _T("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, 45, 100, 300, 20, hWnd, (HMENU)IDC_EDT_KIND, hInstance, NULL); CreateWindowEx(0, _T("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, 45, 100, 300, 20, hWnd, (HMENU)IDC_EDT_INFO, hInstance, NULL); CreateWindowEx(0, _T("button"), _T("N E X T ->"), WS_CHILD | WS_VISIBLE, 45, 45, 100, 40, hWnd, (HMENU)IDC_BTN_NEXT, hInstance, NULL); } break; case WM_SIZE: { MoveWindow(GetDlgItem(hWnd, IDC_EDT_LATIN), 45, 10, 200, 20, TRUE); MoveWindow(GetDlgItem(hWnd, IDC_EDT_GERMAN), 45, 45, 200, 20, TRUE); MoveWindow(GetDlgItem(hWnd, IDC_EDT_KIND), 45, 80, 200, 20, TRUE); MoveWindow(GetDlgItem(hWnd, IDC_EDT_INFO), 45, 115, 500, 20, TRUE); MoveWindow(GetDlgItem(hWnd, IDC_BTN_NEXT), 250, 10, 300, 90, TRUE); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hDC = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); } break; case WM_COMMAND: { switch (HIWORD(wParam)) { case BN_CLICKED: { Vokabulary vok; GetWindowText(GetDlgItem(hWnd, IDC_EDT_KIND), vok.szKindOf, 128); GetWindowText(GetDlgItem(hWnd, IDC_EDT_LATIN), vok.szLatin, 128); GetWindowText(GetDlgItem(hWnd, IDC_EDT_GERMAN), vok.szGerman, 128); GetWindowText(GetDlgItem(hWnd, IDC_EDT_INFO), vok.szInformation, 1024); if (lstrcmp(vok.szKindOf, _T("nomen")) == 0 || lstrcmp(vok.szKindOf, _T("Nomen")) == 0 || lstrcmp(vok.szKindOf, _T("NOMEN")) == 0) { vok.szGender[0] = vok.szInformation[0]; vok.szGender[1] = '\0'; /* 0 */ MessageBox(hWnd, vok.szGender, _T("Vokabler 0.1 Beta"), MB_OK | MB_ICONINFORMATION); vok.szDeclension[0] = vok.szInformation[2]; vok.szDeclension[1] = vok.szInformation[3]; vok.szDeclension[2] = '\0'; MessageBox(hWnd, vok.szDeclension,_T("Vokabler 0.1 Beta"), MB_OK | MB_ICONINFORMATION); } } break; } } break; case WM_DESTROY: { PostQuitMessage(0); } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }Und da musst du mal gucken ... hab jetzt mal C (bis auf der Konstruktor der Struct) genommen. An sonnsten würde ich da mit anderen Sachen rangehen. Würde mir bsw. dann eine Funktion get_text schreiben die dir den Text(dynamische Länge) aus dem Control in nen std::basic_string<TCHAR> ließt, schreiben. Usw ... also da kann man einiges verschönern ... und das mit den zuweisen von bsw. vok.szGender[0] = vok.szInformation[0]; ist auch nicht das wahre ... würde ich auch anders machen.
-
noha_39 schrieb:
for( i=3 ; i<1000 ; i++ ) { if( VOK.Info[i] == 0x0020 ) { break; } else { VOK.Stamm[i-3] = VOK.Info[i] ; }Diese Kopierschleifen sind ein Problem. VOK.Stamm läuft über, wenn in WOK.Info nicht spätestens an 23. Stelle ein Leerzeichen steht. Ist überhaupt kein Leerzeichen drin, schreibst du fast 1000 Zeichen in ein 20-Zeichen-Array.
-
Vielen Dank für die Verschönerung+ Optimierungen und für den Hinweis auf das Problem mit der Schleife ( bin halt noch Anfänger und da übersieht man schnell was) Ich werd noch was rumexperimentieren aber es wird hoffentlich klappen