ListBox befüllen und Löschen
-
Hallo,
habe hier folgendes PRogramm, es erzeugt mir 3 Buttons (Ok, Cancel, Löschen)
eine ListBox
und zwei Editfelder.wenn ich jetzt in die 2 Editfelder etwas eintrage möchte ich das die beiden eingetragenen Texte/Zahlen per Klick auf den Button "Ok" in die ListBox eingefügt werden.
Habe das schon per Stringfunktionen versucht in dem ich die Beiden Strings zusammenfüge und dann in die Listbox schreibe, funktioniert aber nicht.
Bisher wird ja nur das Element aus dem ersten Editfeld in die Box geschrieben.2tens, möchte ich per Druck auf "Löschen" dass die Listbox geleert wird. Dafür hab ich bisher aber noch gar keinen Ansatz.
Hier mal der Code
/*----------------------------------------------------------------------- MenuDemo.C hat ein kleines Menü und demonstriert verschiedene Controls / Ressourcen -----------------------------------------------------------------------*/ #include <windows.h> #include "resource.h" // wird vom Menue-Editor erzeugt #include <string.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //Deklaration der Windows-Nachrichten-Prozedur int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("MenuDemo") ; // Name der Anwendung HWND hwnd ; // Window handle MSG msg ; // MSG Nachrichten Struktur WNDCLASS wndclass ; // WNDCLASS Struktur //Anwendungsbereich (client area) wndclass.style = CS_HREDRAW | CS_VREDRAW ; // Neuzeichnen des Fensters wndclass.lpfnWndProc = WndProc ; // Nachrichtenverarbeitung CALLBACK WndProc wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; // Cursor wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; // Hintergrund wndclass.lpszMenuName = szAppName ; // Menue Name der Anwendung wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // Name der Fensterklasse TEXT ("Windows-Programm"), // Fenstertitel WS_OVERLAPPEDWINDOW, // Fensterstil - Art des Fensters CW_USEDEFAULT, // X-Position des Fensters CW_USEDEFAULT, // Y-Position des Fensters CW_USEDEFAULT, // Fensterbreite CW_USEDEFAULT, // Fensterhöhe NULL, // übergeordnetes Fenster NULL, // Menü hInstance, // Programm-Kopiezähler (Programm-ID) NULL) ; // zusätzliche Parameter ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) // Nachrichten-Schleife { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } // Windows-Nachrichten-Prozedur LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static TCHAR szAppName[] = TEXT ("MenuDemo") ; // Name der Anwendung HDC hdc ; PAINTSTRUCT ps ; RECT rect ; int iLength; int iLength2; int x; void * pszBuffer; // Zeiger auf Begrüßungstext void * pszBuffer2; static HWND hwndButton1, hwndButton2, hwndButton3, hwndEdit1, hwndEdit2, hwndText1, hwndText2, hwndList; switch (message) { case WM_CREATE: //Auf Reihenfolge achten!!! hwndButton1 = CreateWindow ( TEXT("button"), TEXT("OK"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 490, 400, 100, 40, hwnd, (HMENU)1,((LPCREATESTRUCT) lParam)->hInstance, NULL); hwndButton2 = CreateWindow ( TEXT("button"), TEXT("Cancel"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 600, 400, 100, 40, hwnd, (HMENU)2,((LPCREATESTRUCT) lParam)->hInstance, NULL); hwndButton3 = CreateWindow ( TEXT("button"), TEXT("Loeschen"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 710, 400, 100, 40, hwnd, (HMENU)3,((LPCREATESTRUCT) lParam)->hInstance, NULL); hwndEdit1 = CreateWindow ( TEXT("edit"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER, 300, 150, 180, 20, hwnd, (HMENU)4, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); hwndEdit2 = CreateWindow ( TEXT("edit"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER, 300, 180, 180, 20, hwnd, (HMENU)5, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); hwndText1 = CreateWindow ( TEXT("static"), TEXT("Hallo..."), WS_CHILD , 240, 250, 200, 20, hwnd, (HMENU)6, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); // ohne WS_VISIBLE, also nicht sichtbar hwndText2 = CreateWindow ( TEXT("static"), TEXT(""), WS_CHILD , 300, 250, 200, 20, hwnd, (HMENU)7, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); // ohne WS_VISIBLE, also nicht sichtbar hwndList = CreateWindow ( TEXT("listbox"), TEXT(""), WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_MULTIPLESEL , 520, 150, 180, 200, hwnd, (HMENU)8, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); return 0 ; case WM_COMMAND: switch(LOWORD(wParam)) // Behandlung des Menues { case ID_DATEI_BEENDEN: SendMessage (hwnd, WM_CLOSE, 0, 0) ; return 0; } switch(LOWORD(wParam)) // Behandlung der Buttons { case 1: // Zeilenlänge der Eingabe ermitteln iLength = SendMessage(hwndEdit1, EM_LINELENGTH, 0, 0); iLength2 = SendMessage(hwndEdit2, EM_LINELENGTH, 0, 0); x = iLength + iLength2; // Speicher mit entsprechender Länge pszBuffer = malloc(x); pszBuffer2 = malloc(iLength2); // Text mit EM_GETLINE nach pszBuffer auslesen // (LPARAM) (LPCSTR) pszBuffer; = address of buffer for line SendMessage(hwndEdit1, EM_GETLINE, 0, (LPARAM) (LPCSTR) pszBuffer); SendMessage(hwndEdit2, EM_GETLINE, 0, (LPARAM) (LPCSTR) pszBuffer2); // Begrüßungstext ausgeben und anzeigen SetWindowText(hwndText2, (LPCSTR) pszBuffer); // auf const char string zu casten ShowWindow(hwndText1, SW_SHOWNORMAL); // jetzt Text1 anzeigen ShowWindow(hwndText2, SW_SHOWNORMAL); // jetzt Text2 anzeigen // Anzeige in Listbox SendMessage(hwndList, LB_ADDSTRING, 0, (LONG) (LPCSTR) pszBuffer); break; case 2: MessageBox(hwnd,TEXT("Der Button Cancel wurde gedrückt"), szAppName, MB_ICONERROR); break; case 3: MessageBox(hwnd,TEXT("Der Button Loschen wurde gedrueckt"), TEXT("Message"), MB_OK); break; } return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; TextOut (hdc, 240, 152, TEXT("Name"), 4); // device context, x, y, string, string-Länge TextOut (hdc, 240, 182, TEXT("Matr. - Nr."), 4); // device context, x, y, string, string-Länge EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }hier noch die resource.h
//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by MenuDemo.rc // #define ID_HILFE_ABOUT 40003 #define ID_DATEI_NEU 40004 #define ID_DATEI_BEENDEN 40005 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40006 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endifHat mir jemand vielleicht en kleinen Tip der mir auf die Sprünge hilft?
Gruß maze
-
Warum verwendest Du als "pxzBuffer(2) ein "void*"????
Das deuetet sehr nach Fehler hin! Auch ist casten eigentlich immer schlecht (vor allem, wenn es nicht nötig ist!!!).Also
TCHAR pszBufferverwenden und bei EM_GETLINE *nicht* nach LPTSTR casten!!!!!!
Auch anstelle "malloc" bitte "new" verwenden!!!pszBuffer = new TCHAR[len+1];Dein Problem ist:
Du hast ein Unicode-Programm, verwendest aber ANSI-Strings... das kann nicht gut gehen... deshlab konsequent TCHAR und konsorten verwenden!!!
-
Naja das Programm war so vorgegeben, wir sollen nur ein paar änderungen machen.
New geht nicht da wir c verwenden müssen.
-
Trotzdem musst Du TCHAR verwenden und dann halt
pszBuffer = malloc(sizeof(TCHAR)*len));
-
hmm das löst ja aber nicht mein eigentliches Problem
-
Warum nicht?
Dein problem liegt in den Folgenden Zeilen begraben:// Zeilenlänge der Eingabe ermitteln iLength = SendMessage(hwndEdit1, EM_LINELENGTH, 0, 0); iLength2 = SendMessage(hwndEdit2, EM_LINELENGTH, 0, 0); x = iLength + iLength2; // Speicher mit entsprechender Länge pszBuffer = malloc(x); pszBuffer2 = malloc(iLength2); // Text mit EM_GETLINE nach pszBuffer auslesen // (LPARAM) (LPCSTR) pszBuffer; = address of buffer for line SendMessage(hwndEdit1, EM_GETLINE, 0, (LPARAM) (LPCSTR) pszBuffer); SendMessage(hwndEdit2, EM_GETLINE, 0, (LPARAM) (LPCSTR) pszBuffer2); // Begrüßungstext ausgeben und anzeigen SetWindowText(hwndText2, (LPCSTR) pszBuffer); // auf const char string zu casten ShowWindow(hwndText1, SW_SHOWNORMAL); // jetzt Text1 anzeigen ShowWindow(hwndText2, SW_SHOWNORMAL); // jetzt Text2 anzeigen // Anzeige in Listbox SendMessage(hwndList, LB_ADDSTRING, 0, (LONG) (LPCSTR) pszBuffer);Und hier ist ein Hauptproblem das verwenden von "char" anstelle von TCHAR".
Auch fehlt natürlich das "zusammenfügen" der Strings (siehe _tcscat).
-
... switch(LOWORD(wParam)) // Behandlung der Buttons { case 1: // Zeilenlänge der Eingabe ermitteln iLength = SendMessage(hwndEdit1, EM_LINELENGTH, 0, 0); iLength2 = SendMessage(hwndEdit2, EM_LINELENGTH, 0, 0); x = iLength + iLength2; // Speicher mit entsprechender Länge pszBuffer = malloc(iLength); pszBuffer2 = malloc(iLength2); // Text mit EM_GETLINE nach pszBuffer auslesen // (LPARAM) (LPCSTR) pszBuffer; = address of buffer for line SendMessage(hwndEdit1, EM_GETLINE, 0, (LPARAM) (LPCSTR) pszBuffer); SendMessage(hwndEdit2, EM_GETLINE, 0, (LPARAM) (LPCSTR) pszBuffer); _tcscat(pszBuffer, pszBuffer2); // Begrüßungstext ausgeben und anzeigen SetWindowText(hwndText2, (LPCSTR) pszBuffer); // auf const char string zu casten ShowWindow(hwndText1, SW_SHOWNORMAL); // jetzt Text1 anzeigen ShowWindow(hwndText2, SW_SHOWNORMAL); // jetzt Text2 anzeigen // Anzeige in Listbox SendMessage(hwndList, LB_ADDSTRING, 0, (LONG) (LPCSTR) pszBuffer); break; ...Habs jetzt mal so versucht
Oben das auch so geändert
TCHAR * pszBuffer; // Zeiger auf Begrüßungstext TCHAR * pszBuffer2;Wenn ich jetzt nichts in die Felder schreibe und dann auf Ok gehe schreibt er mir irgendwelche Zeichen rein.
Wenn ich im ersten was drin hab und das zweite leer ist kommen auch nur irgendwelche Zeichen.
Wenn ich dann im ersten was stehen habe und ins zweite was schreibe übernimmt er das zweite in die Listbox und hängt noch komisches Zeugs an.
jetzt steh ich total aufem Schlauch, hab mich schon vergoogelt an der _tcscat funktion, finde da allerdings keine richtige erklärung. Auch die Visual Studio hilfe sagt nichts.
SetWindowText(hwndText2, (LPCSTR) pszBuffer); // auf const char string zu casten ShowWindow(hwndText1, SW_SHOWNORMAL); // jetzt Text1 anzeigen ShowWindow(hwndText2, SW_SHOWNORMAL); // jetzt Text2 anzeigenDie 3 Zeilen kann ich trotz Kommentar nicht nachvollziehen was sie machen.
Oh man dachte nicht das dass so kompliziert wird

-
Sagmal, hast Du Dir überhaupt durchgelesen, was Jochen oben gepostet hat ?

Jochen Kalmbach schrieb:
Trotzdem musst Du TCHAR verwenden und dann halt
pszBuffer = malloc(sizeof(TCHAR)*len));EDIT: Auch wenn das Dein Problem warscheinlich noch nciht lösen wird...
-
Des Weiteren verwendest Du die Nachricht EM_GETLINE falsch, denn:
MSDN zu EM_GETLINE schrieb:
Before sending the message, set the first word of this buffer to the size, in TCHARs, of the buffer.
Außerdem würde ich Dir empfehlen die Verwendung von EM_LINELENGTH zu prüfen..., glaube da ist auch irgendwas falsch. Ich würde Dir auch gerne sagen was, nur irgendwie steige ich durch Deinen Quellcode nicht durch, sorry-
.
-
joar ist ja net mein quellcode. den gabs zur aufgabenstellung dazu...wir sollen nur einige funktionen ergänzen bzw ändern/erweitern.