(erledigt) Stringinhalt einer Textbox in eine Variable laden



  • Ich habe in meinem Programm einige befüllbare Textfelder eingebaut, die folgendermassen aussehen:

    CreateWindow(TEXT("edit"), TEXT("                             *********"),
                      WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,
                      110, 140, 300, 20,
                      hwnd, (HMENU) 1, NULL, NULL
                      );
    
    .....
    
            CreateWindow(TEXT("edit"), TEXT("                             *  **  **"),
                      WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,
                      110, 240, 300, 20,
                      hwnd, (HMENU) 1, NULL, NULL
                      );
    

    Leider weiß ich nicht, wie ich nun z.B. den Text im Textfeld des zweiten Textfeldes erkennen und auslesen kann.

    Da ich heute erst (wenn ich die zwei Tage, die ich VERSEHENTLICH mit C++/CLI verschwendet habe, abziehe) mit der C Programmierung angefangen habe, wüsste ich gerne, wo ich eine möglichst vollständige Bibliothek finde, mit der ich mir solche Fragen in Zukunft selbst beantworten kann.

    Verwendeter Compiler: DevCpp 4.9.9.2 von Bloodshed





  • Keks für Belli!

    Nette Tabelle zum learn-it-yarself, danke 😃
    Sobald ich die Antwort finde poste ich sie, der Vollständigkeit halber.



  • Noch ne Tabelle zum selberlernen:

    http://www.c-plusplus.net/forum/200753

    Damit man nicht laufend deine Posts in andere Foren verschieben muss 😉



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also, ich versuche gerade das Problem der edit-Funktion folgendermaßen anzugehen:

    Um meinen Text hinterher zu "haben", brauche ich natürlich eine als string deklarierte Variable:

    #include <string>
    using namespace std;
    
    string meinText;
    

    Meinen Textboxen habe ich nun Namen gegeben, indem ich ihnen eine "Variable" (ist hier glaub ich das falsche Wort) folgendermassen zugewiesen habe:

    textBox1 = CreateWindow(TEXT("edit"), TEXT("                             *  **  **"),
                      WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,
                      110, 240, 300, 20,
                      hwnd, (HMENU) 1, NULL, NULL
                      );
    
    .....
    
                   textBox2 = CreateWindow(TEXT("edit"), TEXT(""),
                      WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,
                      110, 40, 300, 20,
                      hwnd, (HMENU) 1, NULL, NULL
                      );
    

    Dank der Tabelle fand ich die Funktion Edit_GetText, allerdings ohne Anwenderbeispiel. Ich weiß also nicht, wie sie korrekt angewandt wird.
    Es muss wohl irgendwie so ähnlich gehen wie

    // ACHTUNG, FALSCHE ANWENDUNG DER FUNKTION
    meinText = Edit_GetText(textBox1);
    

    zumindest sagt man mir, Edit_GetText sei undeklariert. Bitte keine Haue, wahrscheinlich seh ich nach ner Stunde rumprobieren und In-Der-Tabelle-edit-Funktionen-durchlesen einfach den Wald vor lauter Bäumen nicht mehr ...

    @ pumukel

    Danke für s moven meines Threads, hatte des "WinAPI" net gesehn und dachte deshalb ich wär in C++ richtig

    EDIT

    Also, habe nun nach 2 Stunden rumsucherei folgendes Ergebnis, wie die Funktion Edit_GetText zum Auslesen des Fensterinhalts verwandt wird:

    Edit_GetText (hwnd, meinText, 20);
    

    "meinText" ist ne als string deklarierte Variable, und in der textbox die ich auslesen will steht auch ne string. Nun bekomme ich beim Anwenden der Funktion aber folgende Fehlermeldung:
    can not convert ´std:string´ to char
    Was habe ich falsch verstanden / gemacht?



  • 1. Lern deinen Compiler kennen und lerne zu wissen, wann er welchen Error ausspuckt, obwohl dieser in diesem Fall selbsterklärend ist.
    2. würd ich, wenn ich mit C anfange, nicht unbedingt direkt bei der WINAPI einsteigen... obwohl sie die Schwachstellen dieser Sprache immer und immer wieder nur allzu gut aufzeigt^^
    3. ist die WINAPI C only. std::string gehört zur C++ Standartbibliothek.
    4. ist std::string wohl anscheinend nicht dasselbe wie char*. Benutz doch ein Char-Array.
    5. kann man mit nichts weiter als einer Bibliothek - wie vollständig sie auch sein mag - nur sehr sehr schwer eine (Programmier)sprache lernen 😉
    Da kannst du auch gleich versuchen fließend Französisch nur mit dem Französisch-Wörterbuch zu lernen 😉
    Du kannst übrigens auch einfach

    GetWindowText(hDeinEdit, ZielString, GetWindowTextLength(hDeinEdit));
    

    benutzen. Kommt auf genau dasselbe raus.



  • Keks @ matrix, aber ich habs heut selbst rausgefunden wie ich dran vorbeikommen konnte: Anstelle wchar_t einfach char benutzen beim initialisieren:

    char texttest[256];
                    SendMessage(textBox1, WM_GETTEXT, 256, (LPARAM)texttest);
                    MessageBox(hwnd, texttest, "Edit - Feld", MB_OK);
    

    und schwupps, char nach char geht viiiel einfacher als wchar_t nach char ... naja, wenn man nachts um elfe sich mal hinsetzt kanns ja halt echt schwer werden ^^ jetz noch fix versuchen, die andere textbox anzusteuern:

    if (lParam == (LPARAM)h5Button)
             {
                    char texttest[256];
                    SendMessage(textBox1, WM_GETTEXT, 256, (LPARAM)texttest);
                    MessageBox(hwnd, texttest, "Edit - Feld", MB_OK);                        // _wfopen()
                    break;                                                               // Yes, use std::wstring instead of std::string, L"Text" instead of "Text", and wchar_t instead of char
             }
             if (lParam == (LPARAM)h6Button)
             {
                    char texttest[256];
                    SendMessage(textBox2, WM_GETTEXT, 256, (LPARAM)texttest);
                    MessageBox(hwnd, texttest, "Edit - Feld", MB_OK);                        // _wfopen()
                    break;                                                               // Yes, use std::wstring instead of std::string, L"Text" instead of "Text", and wchar_t instead of char
             }          
             return 0;
    

    taddaaa, funzt!
    Türlich ergeben sich hieraus andere Fragestellungen, aber das ist eine andere Geschichte und soll ein anderes Mal erzählt werden.

    P.S. Wie markiere ich dieses Thema als "gelöst" ?


  • Mod

    Und warum verwendest Du nicht die ienfacheren Funktionen Get/SetWindowText, Get/SetDlgItemText?



  • @Martin

    Weil, laut

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms633546(v=vs.85).aspx

    Changes the text of the specified window's title bar (if it has one). If the specified window is a control, the text of the control is changed. However, SetWindowText cannot change the text of a control in another application.
    *Quote aus der oben angegebenen Internetadresse*
    , also wie ich des verstehe, der Text des Titlebars geändert wird. Ausserdem bin ich erst seit 3 Tagen dran, C und ++ zu lernen, da kann ich noch nicht ganz jede Funktion auswendig, sorry ... Ich benutze halt, was ich im Internet an Hilfsmitteln finde, z.B. http://www.proggen.org/doku.php?id=c:start Inwiefern sind die von Dir genannten Funktionen "einfacher" ?


  • Mod

    Dann sollte Dir aber auch klar sein. Das innerhalb der gleichen Anwendung, das überhaupt keine Rolle spielt... 😉 Das steht da doch.

    a control in another application

    Und schon gar kein Unterschied für Edit-Controls und Static-Control vorhanden ist.

    Grundsätzlich sollte man immer zu Set/Get Funktionen greifen oder eben den Dialog Funktionen bei Child Controls.


Anmelden zum Antworten