EditBox auslesen

  • C++

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Michael K..

    EditBox auslesen

    Hallo Leute,

    ich würde gerne eine EditBox auslesen. Aber das funktioniert irgendwie nicht so ganz. Ich habe bei Google schon gesucht aber immer sehe ich dann diesen Code:

    C-Quellcode

    1. char string;
    2. GetDlgItem(TextBox1, string);

    Dann will ich soll "string" in einer MessageBox gezeigt werden, aber die ist dann leer. Was mache ich da falsch? "TextBox1" ist übrigens die HWND EditBox. (TextBox1 = CreateWindow("", ...))

    MfG
    @programmer71: Wenn du dir nicht sicher bist, besser keine Ratschläge geben: string ist eine Klasse welche(ja ich gebe dir recht) in C++ einem char* vorgezogen werden sollte. Nur laufen die Win-APIs auf Basis von C und somit gibt es keine strings. Und mal eben irgendwo nen string anstatt nem char* übergeben geht garantiert in die Hose. Bin auch nicht der C++ Profi aber man kann nicht einfach alles kreuz und quer verwenden wie es einem passt.
    @Michael K.: Bevor man nicht eine Dokumentation lesen kann sollte man auf keinen Fall versuchen sich mit WinAPI rumschlagen. Und das erst recht wenn man nicht versteht was ein Datentyp ist Oo. Ich kann keine Maschine bauen wenn ich nicht den unterschied zwischen Holz und Stahl kenne.

    Habs nicht probiert. Müsste aber so funktionieren(wenn ich msdn richtig gelesen hab):

    C-Quellcode

    1. int strlen = SendMessage(hTextBox, WM_GETTEXTLENGTH, 0, 0) + 1; //+ 1 da char '\0' terminiert wird
    2. char* pstr = new char[strlen]; 'dyn speicher anfordern
    3. SendMessage(hTextBox, WM_GETTEXT, (WPARAM)strlen, (LPARAM)pstr); //text holen
    4. //... mach irgendwas
    5. delete[] pstr; //WICHTIG: Speicher wieder freigeben


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „thefiloe“ ()

    Ähm naja bei WinApi ist es üblich,dass man einen char pointerbenutzt(C-String. WinApi ist ja in C geschrieben),ansonsten wenn du den string typ benutzt,musst du die c_str() Methode darauf anwenden um es in einen C String zu konvertieren.Zudem nimmt die GetDlgItem als zweites Parameter einen int,keinen string. Den Text aus ner Textbox bekomste soweit ich weiß mit SendMessage mit dem Parameter WM_GETTEXT.

    Edit:// TheFileIo war schneller.
    Nochmal. Bitte benutze Google. a) wirst du keine CString Klasse finden, da es das einfach noch nicht gibt. Du findest höchstens eine Struktur und die findest du nicht. b) C-String ist wie der Name schon sagt ein String in der Programmiersprache C. Und ein String besteht aus einzelnen chars. Folglich ist ein C-String ein char-Array. In der Praxis ist es jedoch meistens ein char* welcher quasi auf nen char-Array zeigt, da du dadurch den C-String dynamisch groß machen kannst. In C machste das mit malloc und in C++ mit new char[größe]. Aber ACHTUNG: Wenn der Compiler nicht weiß wie groß, dass das Teil zur Laufzeit ist, kann er das Teil auch nicht automatisch freigeben. Das ist dein Job. In C mit der free Funktion und in C++ mit delete -> siehe mein Beispiel.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Da brauchste keinen Header für einbinden.
    Ein C String siehst du doch in TheFileoes Beispie

    Quellcode

    1. char* pstr

    Was du vielleicht meinst ist der in C++ übliche string Datentyp,den findest du im Header string(nicht string.h).

    Quellcode

    1. #include <string>
    2. std::string str;
    Schade, mir bleibt doch noch ein Problem. Ich will halt ein wenig C++ lernen und habe mir daher vorgenommen einen kleinen Taschrechner zu erstellen. Er soll so etwas wie 1+1 ausrechnen. Hier der Code:

    C-Quellcode

    1. int strlen = SendMessage(TextBox1, WM_GETTEXTLENGTH, 0, 0) + 1;
    2. char* pstr = new char[strlen];
    3. SendMessage(TextBox1, WM_GETTEXT, (WPARAM)strlen, (LPARAM)pstr);
    4. int strlen1 = SendMessage(TextBox2, WM_GETTEXTLENGTH, 0, 0) + 1;
    5. char* pstr1 = new char[strlen1];
    6. SendMessage(TextBox1, WM_GETTEXT, (WPARAM)strlen1, (LPARAM)pstr1);
    7. int osidfjosidfj;
    8. osidfjosidfj = (int) pstr + (int) pstr1;
    9. //SetDlgItemText(hwnd, ID_TEXTBOX2, pstr); //Text schreiben
    10. SetDlgItemText(hwnd, ID_LABEL1, (const char*)osidfjosidfj); //Text schreiben
    11. delete pstr;
    12. break;


    Das funktioniert nicht so ganz. Der Label, den ich erstellt habe gibt gar nichts aus. Was ist da falsch (ich weiß, dass da eine ganze Menge falsch ist) :D
    C++ wird eh "laufend" erweitert. Nur das ist halt kein .NET. So komfortabel wie in C# wirst du das niemals haben. Du hast halt nur einen Bruchteil der Klassen und CString gehört halt nicht dazu. Deshalb gibt es ja auch Frameworks welche darauf aufbauen und gewisse Dinge erleichtern.

    EDIT: Das was du da lernst hat leider recht wenig mit C++ zu tun. Bin überzeugt, dass du noch keine einzige Klasse erstellt hast. Lieg ich damit richtig?
    Und wie kommst du darauf, dass du einen char* einfach in einen int casten kannst? Weißt du überhaupt was ein pointer ist? char* ist eine Adresse auf einen Speicherplatz welcher dann EIN char beinhaltet. Um den ganzen Text zu bekommen brauchst du eben strlen. Soviel zu pointer. Wenn du char* in einen int castest bekommst du eine Adresse auf eine Speicherplatz im RAM.
    stackoverflow.com/questions/4442658/c-parse-int-from-string

    Dazu kommt noch, dass du anschließend wieder nen int einfach in nen pointer castest. Das heißt, dass dann Windows irgendwo im Speicher nen Text sucht wo keiner ist oder eventuell schon was anderes ist und dann wunderst du dich wieso am anderen Ende deiner Anwendung sich auf einmal die Werte verändern.

    Zudem habe ich oben extra hingeschrieben ACHTUNG:
    Aber du hast natürlich nicht zugehört sondern kopierst irgend nen Scheiß zusammen.
    char* pstr1 = new char[strlen1];


    NIEMAND GIBT DEN SPEICHER FREI! DAS HEISST -> VERSCHWENDETER SPEICHER. FREIGEBEN!

    Mein Rat:
    Lass den ganzen Quatsch. Lern wie C++ funktioniert. Das freigeben von Speicher gehört zu den very, very, very, very basics. Jedes Programm verwendet Speicher und wenn du den nicht freigeben kannst, bekommst nen Problem. C++ ist auch eine Sprache die nicht so einfach wie VB von der Hand geht. Fehler sind hier schwerer zu finden und können sich auch wirklich für deine Anwendung dramatisch auswirken. Und das erst recht wenn du irgendwo im Speicher rumpfuscht und keine Ahnung hast was du machst. Da kommt nix raus.

    Und wenn du C++ wirklich soweit verstanden hast, wenn du auch weißt wie man OOP in C++ ordentlich verwendet usw. DANN und erst DANN kannst du nen GUI Framework verwenden wie z.B. wxWidgets, Qt,...


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „thefiloe“ ()

    @thefiloe::
    OMG, da erwartet mich noch etwas. Also ich möchte ja jetzt voll anfange C++ zu lernen. Aber wo soll man da anfangen? Bloß keine Konsole, bitte nicht. Von dem Ding will ich weg. Kennst du rrgendein Buch, ein gutes Tutorial?