Wie Text aus einem Textfeld holen?



  • ja aber so bekomme ich nur den text vom haupfenster, aber ich wollte ja den text der im editfeld drinne steht



  • Du schickst einfach eine WM_GETTEXT Nachricht and das entsprechende edit handle.

    Wenn ich mich nicht irre müsste das eigentlich so funktionieren:

    int len = SendMessage( handle, WM_GETTEXTLENGTH, 0, 0);
    char buffer[len+1];
    SendMessage( handle, WM_GETTEXT, buffer, (long)&buffer);
    

    mfg Nanobot



  • Guten Abend und fröhliche Weihnachten.

    Du kannst, je nach Wunsch, integer oder char aus der Editbox auslesen.
    Für eine Zahl benötigst du:
    GetDlgItemInt(HWND, int, BOOL *, BOOL);
    1. Parameter erwartet den Handle zu dem Fenster oder Dialog in dem das Editfenster erschaffen wird.
    2. Parameter erwartet die ID des Editfensters
    3. Parameter erwartet den Namen einer Variabel, die speichern soll, ob der Aktion erfolgreich war oder nicht, wobei als Angabe NULL nichts diesbezüglich gespeichert wird.
    4. Parameter erwartet TRUE oder FALSE. Wenn er FALSE ist, ist der Wert vorzeichenlos. Bei TRUE kann auch ein Minus-Wert eingelesen werden.

    Für Zeichen benötigst du:
    GetDlgItemText(HWND, int, LPTSTR, int);
    1. Parameter s.o.
    2. Parameter s.o.
    3. Parameter erwartet den Namen der Variabel, die den Text speichern soll.
    4. Parameter erwartet eine Zahl, die festlegt wie viele Zeichen maximal eingelesen werden sollen.

    Mit weihnachtlichen Grüßen
    Moadeh :xmas1:



  • Anmerkung: Das "char wert[L1];" bzw. das "char buffer[len+1];" wird nicht funktionieren; statische C-Strings benötigen (logischerweise) immer eine konstante Größe.

    Frohe Weihnachten & n guten Rutsch an alle! :xmas1:



  • @Moadeh könntest du vieleicht für einen Text ein Beispiel anbringen

    ich habe zurzeit das hier.

    char* text[1024];
          GetDlgItemText(hwnd,EDITFIELD,text,1024);
          MessageBox(hwnd,text,"Test",NULL);
    

    natürlich noch das ganze andere zeug was man braucht, wie wm_command und so... aber ich hab jetzt nur die stelle rausgefiltert wo das einlesen passieren sollte

    danke im voraus



  • char text[1024];
    GetDlgItemText(hwnd,EDITFIELD,text,1024);
    MessageBox(hwnd,text,"Test",MB_OK);
    

    So müsste der Codeabschnitt, ohne jegliche Fehlermeldung oder Warnung beim compilieren, funktionieren , unter der Vorraussetzung, dass hwnd ein gültiger Handle zum Parent ist und EDITFIELD eine gültige, bekannte ID zu einem editfenster.

    Mich warnt mein Compiler bei dem 4.Parameter von Messagebox. Da es scheinbar allerdings egal ist(zumindest vom Äußerlichen), ob man den auf NULL setzt oder MB_OK einfügt, würde ich MB_OK einfügen, damit man nicht auf Stunden diese Warnung mit sich trägt.

    Ansonsten gibt es ja auch immer genug Beispiele in der msdn.

    Edit1: Und du solltest die maximale Größe beim Einlese um 1 höher als den Array machen. Sonst wird er immer nur maximal 1023 Zeichen einlesen können. Spielt bei 1024 Zeichen noch nicht so eine Große Rolle, aber wenn du später mal mit kleineren Arrays arbeitest, errinner dich bitte daran.

    Mit freundlichen Grüßen
    Moadeh :xmas1:



  • ahh super danke, du hast mir sehr gut weitergeholfen, konntest das gut erklären, danke



  • Hm die Sache ist so aber weder Zeichensatz unabhängig noch dynamisch (heißt: Ist der Text länger als 1024 Zeichen, so wird dann abgeschnitten. Außerdem wird *immer* 1024 Bytes reserviert, auch wenn beispielsweise nur 10 Bytes benötigt werden.)

    Besser wäre es so:

    // Anzahl der Zeichen ermitteln:
    LRESULT lrCount = SendMessage(GetDlgItem(hDlgParent, EBX_EDITBOX_ID), WM_GETTEXTLENGTH, 0, 0);
    // Dynamischen Speicher anfordern (inkl. Null-Terminierung, deswegen Inkrementierung):
    TCHAR* pszBuf = new TCHAR[++lrCount];
    // Text ermitteln
    SendMessage(GetDlgItem(hDlgParent, EBX_EDITBOX_ID), WM_GETTEXT, lrCount, reinterpret_cast<LPARAM>(pszBuf));
    // Anzeigen:
    MessageBox(hDlg, pszBuf, TEXT("Inhalt des Editfelds:"), 0);
    // Nach Verwendung das Freigeben des Speichers nicht vergessen:
    delete [] pszBuf;
    


  • ich hab da mal noch eine frage und wie kann man, nach dem der button gedrückt wurde, das er das editfeld zurücksetzt und mit dem alten wert, also wieder etwas reinschreibt was vorher auch drinne stand. zum beispiel stand am anfang "Editfeld" drinne und nach dem drücken des buttons steht irgednwas drinne was man reingeschrieben hat und DANN soll der alte text wieder drinne stehen



  • SetDlgItemInt(HWND, int, UINT, BOOL)
    

    Parameter sind wie sein Gegenstück GetDlgItemInt. UINT erwartet nur den Integer der den Wert enthält, der eingesetzt werden soll.

    SetDlgItemText(HWND, int, LPCTSTR)
    

    Der 3. Parameter erwartet einfach nur ein Pointer zu einem (null-terminierten) string.

    Mit freundlichen Grüßen
    Moadeh :xmas1:


Anmelden zum Antworten