MultilineEditBox zeilenweise behandeln



  • merker schrieb:

    Allerdings gibt es ein Problem, falls die Zeichenkette zufällig 0x0100 Zeichen lang ist.

    Ist bei Verwendung von Multi-Byte natürlich korrekt, wenn das Low-Byte des Words 0 ist, funktioniert das nicht - bei Wide-Char allerdings kein Problem.

    Allerdings ist deine Lösung mit den int auch nicht ganz das 'saubere', wenn dynamische Allocierung von szBuffer verwendet wird.

    LPTSTR szBuffer = (LPTSTR)LocalAlloc(LPTR, (nLineLength + 1) * sizeof(TCHAR));
    

    Man weis ja nie, ob sich im Speicher hinter dem angelegten Puffer noch benötigte Daten befinden.
    Denke mal eine sauber Lösung wäre folgende:

    if(nLineLength)
    {
      *((LPWORD)szBuffer) = (WORD)nLineLength;
      SendMessage(hwe, EM_GETLINE, (WPARAM)i, (LPARAM)szBuffer);
    }
    *(szBuffer + nLineLength) = '\0';
    

    Einwände?



  • Schön übersichtlich die Lösung. Aber da könnte der Kompiler Ärger machen :
    Ein "lvalue" (hier : szBuffer) soll/kann/darf nicht gecastet werden.



  • Dieser Cast ist erlaubt.
    Der Zeiger auf die Adresse in die geschrieben werden soll, wird letztendlich das lvalue, nicht das Resultat aus dem Pointercast.
    'Aufgelöst' würde das so aussehen:

    LPDWORD lpdw = (LPWORD)szBuffer;
    *(lpdw) = (WORD)nLineLength;
    

    Nicht erlaubt wäre dieser Cast:

    ((WORD)*szBuffer) = (WORD)nLineLength;
    

Anmelden zum Antworten