Textlänge des Editfeldes geht nicht



  • Hi

    stehe gerade auf dem Schlauch und finde das Problem nicht

    ich habe ein Editfeld mit Winapi erzeugt

    hwndEdit2 = CreateWindow ("EDIT","",
                              WS_CHILD | WS_VISIBLE | WS_BORDER,
                              100, 80, 100, 25, hwnd, NULL,
                              hInstance, NULL) ;
    

    das funktioniert

    allerdings habe ich jetzt einen Button, wenn der geklickt wird und mindestens 1 Zeichen im Editfeld ist (soll nicht leer sein) soll ein Thread gestartet werden

    zur Überprüfung habe ich ein Beep befehl
    aber ich höre keinen Ton (Thread geht auch nicht), egal ob da Zeichne drin sind oder nicht
    ich habe auch schon 2 verschiedene Funktionen getestet um an die Textlänge zu kommen

    case ID_ButtonStart:
                        //iLength=GetWindowTextLength(hwndEdit2);
                        int iLength = SendMessage(hwndEdit2,WM_GETTEXTLENGTH,0,0) + 1;
                        if(iLength > 1)
                        {
                            Beep(100,100);
                            _beginthread(Server,0,NULL);
                        }
                        return 0;
    

    Danke



  • Geht's mit dem Edit_GetTextLength Macro? Wenn nicht, dann liegt dein Fehler woanders (vorher), wenn doch, dann machst du was falsch bei SendMessage().



  • SendMessage(...) sendet nur eine Nachricht an die CALLBACK-Funktion, mehr nicht. Dort musst Du im entsprechenden case-Zweig die Textlänge abfragen und zurückgeben. Das return von SendMessage ist dafür ungeeignet, das besetzt Windows selbst.



  • berniebutt schrieb:

    SendMessage(...) sendet nur eine Nachricht an die CALLBACK-Funktion, mehr nicht. Dort musst Du im entsprechenden case-Zweig die Textlänge abfragen und zurückgeben. Das return von SendMessage ist dafür ungeeignet, das besetzt Windows selbst.

    Öhm, das ist quatsch^^. Also ein kleiner Teil davon stimmt ("SendMessage(...) sendet nur eine Nachricht an die CALLBACK-Funktion, mehr nicht."), aber das "nur" darin ist eigentlich auch schon falsch 😃 .

    Dein Code ist sozusagen (fast) richtig, allerdings versteh ich nicht, warum Du zum Return-Wert von SendMessage noch 1 addierst?! Das verfälscht doch die folgende Abfrage: Ist auch nur ein Zeichen in Deinem Edit-Control, erhälst Du als Return-Wert 1.
    Die Addition von 1 ist nur bei Speicher-Allokation notwendig, da Du die Null-Terminierung berücksichtigen musst. Aber das ist ja hier nicht von Belang.

    Ist hwndEdit2 überhaupt noch gültig ( ➡ static, global)?



  • ja hwndEdit2 ist noch gültig, sonst hätte er ja auch gemschimpft 😉

    stimmt die 1 habe ich aus einem forum kopiert (für die Terminierung)
    ich habe es vorher nur mit GetWindowTextLength(hwndEdit2); probiert und das ging ja nicht, also habe ich google benutzt und nach personen gesucht, die sowas auch gmeacht haben und dann das sendmessage mit der 1 gefunden und kopiert

    aber war ja auch ohne erfolg

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HWND hwndButtonStart,hwndButton1,hwndEdit, hwndEdit2;
        HDC hdc;
        RECT rect;
        PAINTSTRUCT ps;
    
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
            {
            hwndButtonStart = CreateWindow( "button",
                                       "starten",
                                       WS_CHILD | WS_VISIBLE,
                                       100,120,100,50,
                                       hwnd, (HMENU)ID_ButtonStart, hInstance, NULL) ;
            hwndButton1 = CreateWindow( TEXT("button"),
                                        "suchen",
                                        WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                                        100, 200, 100, 50,
                                        hwnd, (HMENU)ID_ButtonSuchen, hInstance,NULL);
    
              hwndEdit = CreateWindow ("EDIT","",
                                         WS_CHILD | WS_VISIBLE | WS_BORDER |ES_MULTILINE ,
                                         50, 300, 200, 150, hwnd, NULL,
                                         hInstance, NULL) ;
    
                hwndEdit2 = CreateWindow ("EDIT","",
                                         WS_CHILD | WS_VISIBLE | WS_BORDER,
                                         100, 80, 100, 25, hwnd, NULL,
                                         hInstance, NULL) ;
    
            return 0;
            }
    
            case WM_PAINT:
                InvalidateRect(hwnd, &rect, TRUE);
                hdc = BeginPaint (hwnd, &ps) ;
    
                TextOut (hdc, 10, 80, "Server Name", lstrlen ("Server Name")) ;
    
                EndPaint (hwnd, &ps) ;
                return 0 ;
    
            case WM_COMMAND:
    
                switch(wParam)
                {
                case ID_ButtonStart:
                        //iLength=GetWindowTextLength(hwndEdit2);
                        int iLength = SendMessage(hwndEdit2,WM_GETTEXTLENGTH,0,0) + 1;
                        if(iLength > 1)
                        {
                            Beep(100,100);
                            _beginthread(Server,0,NULL);
                        }
                        return 0;
                case ID_ButtonSuchen:
                        Beep(100,100);
                        return 0;
                }
                return 0;
    
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    *spontane idee*
    kann es daran liegen, dass mein editfeld kein ereignis zurück gibt

    hwndEdit2 = CreateWindow ("EDIT","",
                               WS_CHILD | WS_VISIBLE | WS_BORDER,
                               100, 80, 100, 25, hwnd, NULL, //<----- hier (NULL)
                               hInstance, NULL) ;
    

    Danke



  • helpme schrieb:

    ja hwndEdit2 ist noch gültig, sonst hätte er ja auch gemschimpft 😉

    Eher nicht. hwndEdit2 wird zwar in WM_CREATE erstellt, beim nächsten Aufruf der Fensterprozedur ist die Variable aber wieder uninitialisiert. Beim Aufruf von WM_GETTEXTLENGTH ist hwndEdit2 undefiniert, iLength ist damit immer 0.

    Du solltest den beiden Editierfeldern eine ID verpassen (wie bei den Schaltflächen) und das Fensterhandle dann über GetDlgItem(hwnd, ID_Edit2) ermitteln.



  • Oder einfach:

    static HWND hwndButtonStart,hwndButton1,hwndEdit, hwndEdit2;
    

    Aber den Fenstern eine ID geben, solltest du auch.^^



  • Also meckern wird er bestimmt nicht^^. Ich fragte ja bereits nach static bzw. globalen Variablen. Ist irgendwie der Standardfehler.


Log in to reply