Output in Textfeld ausgeben



  • Hallo Zusammen,
    wer kann mir ein bisschen helfen? Hatte bis jetzt noch nicht mit der WinApi gearbeitet.
    Jetzt möchte ich ein Fenster erstellen dass einen Button mit der Aufschrift "Start" hat,
    und ein Textfeld.
    Wenn man nun auf den Start-Button klickt soll der Output einer for-Schleife (siehe Bei-
    spiel), zeilenweise in dem Textfeld ausgeben werden. Die Anzahl der Zeilen die max. im
    Textfeld ausgegeben werden können soll auf 30 Zeilen begrenzt werden. D.h. bei der 31.
    Zeile verschwindet die erste Zeile, bei der 32 Zeile verschwindet die zweite Zeile usw.
    Das Textfeld soll dazu ein Autoscroll haben. Schön wäre es wenn ich mit dem Button den
    Output anhalten und fortsetzen könnte 🙂

    ...
    for(int i=1; i<=100;i++)
    {
     schreibe Ergebnis von i in Textfeld..und mache Zeilenumbruch
    }
    

    Wer kann mir da ein bisschen weiter helfen? Soll ich ein Editfeld dafür hernehmen?
    Und wie bekomme ich den Output aus der For-Schleife in das Feld..Übrigens der Output
    ist ein string dessen Inhalt sich innerhalb der for-Schleife immer ändert. Ich habe
    nur zur vereinfachten Darstellung dieses Beispiel so gewählt. Vielleicht hat ja schon
    jemand ein Snippet in der Art parat und könnt es mal posten? Wäre echt nett!!!! Also
    zumindest bin ich jetzt soweit dass ich ein Hauptfenster, Buttons, Editorfelder erstellen
    kann. Also ein paar Grundlagen habe ich mir mit Online-Tutorials am Wochenende schon
    mal erarbeitet.

    Gruss und danke im voraus, rommi



  • Wenn du schon immer ganze Zeilen setzen willst, dann nimm vielleicht lieber eine ListBox statt eines Edits. Mit InsertColumn und InsertItem kannst du Elemente hinzufügen. Deine Strings solltest du vielleicht in einem std::vector oder so halten.


  • Mod

    Mit EM_SETSEL und EM_REPLACESEL kann man Text relativ unproblematisch hinzufügen.



  • Etwas ausführlicher. Ich hab ein Hauptprogramm (hab ich noch als Konsolen-Programm
    erstellt) in dem verschiedene Sachen abgefragt und verarbeitet werden. Das Haupt-
    programm läuft permanent durch. Die Ergebnisse des Hauptprogramms möchte ich jetzt
    in einem Fenster ausgeben können und nicht mehr auf dem Konsolen-Fenster. Es wird
    permanant (while-Schlife im Hauptprogramm) ein Ergebnis erzeugt der dann im Fenster
    (Textfeld) erscheinen soll. Ohne hier jetzt den ganzen Code zu posten hab ich mal
    den Ablauf exemplarisch dargestellt:

    main....
    {
    	//==== Verschiedene Abfragen (Input)
    	... Inhalt von Datei-A
    	... Systemszustand
    	... etc.
    
    	//==== Verarbeitung der Abfragen/Input
    	while()
    	{
    	    ... Sleep(1000)
    	    ... weitere Abfragen
    	    ... Verarbeitung
    
    	    for(...)
    	    {
    	      ... Verarbeitung
    	      ... Ergebnis (Output) ausgeben
    	    }
    
    	}
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	//==== switch-case-Anweisungen
    	...
    	...
    	case WM_CREATE : .. erstell Text-Feld und Start-Button etc.
    	... gib das Ergebnis vom Hauptprogramm im Text-Feld aus
    }
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
    {
    
    	//==== Erstell das Hauptfenster etc.
    	...
    
    	//==== Message-Loop
    	...
    }
    

    Meine Frage ist jetzt, wie krieg ich es hin dass das Ergebnis vom Hauptprogramm
    im Textfeld (Edit-Feld oder was immer) erscheint. Dabei soll nach der 30igsten
    Zeile die erste Zeile immer gelöscht werden wenn eine neue Zeile hinzukommt. Somit
    werden nie mehr als 30 Zeilen angezeigt.

    Auf jeden Fall erstmal vielen Dank für eure Antworten!! liebe grüsse, rommi



  • Strukturiere dein Programm besser um. Mach ein neues Win32-Projekt (WinAPI-Projekt) auf, platziere ein paar Controls für Eingabe/Verarbeitung/Ausgabe (z.B. Edit Controls/Button Control/Static Controls), und pack deine Verarbeitung in den Event-Handler eines Buttons.



  • Hi,
    ich bin ziemlich neu in der WinApi unterwegs, aber ich glaube nen Tipp kann ich dir geben:
    Soll der Benutzer deine Zeilen auswählen können, bist du denke ich mal, mit einer ListBox gut beraten.
    Sollen die Zeilen lediglich angezeigt und ersetzt werden, würde ich ein RichEditControl nehmen. Das erledigt automatisch Zeilenumbrüche bei sich ändernder Fenstergröße, etc..

    Je nachdem für welches Steuerelement du dich entscheidest, kannst du zum Hinzüfugen deiner Zeilen Nachrichten vom Typ LB_ADDSTRING (ListBox), EM_SETSEL, EM_REPLACESEL (RichEditControl) verschicken.

    Deinem Aufbau entnehme ich, das du um einen Thread für dein main-Programm nicht drum herum kommst, wenn das Windows-Fenster auf Bewegungen, etc. reagieren soll.

    Gruß,
    w.s.



  • Hallo Zusammen, danke erstmal für die Antworten!!

    @_matze
    für den Fenster-Teil hab ich ja schon ein Win32-Api-Projekt erstellt.
    Und weiss auch schon wie man das Hauptfenster, Buttons, Editor-Felder
    erstellt. Jetzt will ich eben den Hauptprogramm-Code, den ich mal ge-
    schrieben habe, in den Code vom Api-Projekt so einfügen dass eben der
    Output, der da erzeugt wird, in einem Api-Fenster erscheint. Wenn ich
    dich jetzt richtig verstanden habe soll ich jetzt den Verarbeitungs-Teil
    des Hauptprogramms als Funktion schreiben und diese Funktion dann in der
    WinProc-Funktion über einen Button-Event-Handler aufrufen?? Oder wie
    hast du das gemeint?

    @winapi scientist
    das mit dem RichEditControl könnte was für mich sein. Das schau ich mir
    heut abend mal genauer an. Dat Api-Fenster bzw. das Textfeld soll auf den
    Output bezogen funktionieren wie ne DOS-BOX. Ne Dos-Box gibt je nach Ein-
    stellung ne gewisse Anzahl von Zeilen aus, hat Autoscroll, man kann Text
    markieren und man kann das Programm sogar mit der Pause-Taste anhalten und
    fortsetzen.. Na, ja das mit der Pause-Taste muss jetzt nicht gleich sein 😉
    Vorteil eines Api-Fensters ist halt dass ich dort auch gleich ein Menü
    (Datei öffen, abspeicher, etc. etc.) mit dazu basteln und verschiedene nützliche
    Controls (Buttons, Checkboxes, Radiobuttons etc. im das Fenster einbinden kann.
    Is schon ne feine Sache so n Fensterchen :-))

    Auf jeden Fall danke, muss jetzt auf erstmal auf Schicht..
    gruss, rommi


Anmelden zum Antworten