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
    #endif
    

    Hat 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 pszBuffer
    

    verwenden 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 anzeigen
    

    Die 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.


Anmelden zum Antworten