wxTextCtrl und (lost) Focus



  • Hallo zusammen!

    Ich schreibe an einem Programm welches das 'LogFile.txt' eines Servers auswerten soll. Das Logfile wird nach Schlüsselworten durchsucht und alle Zeilen welche eines dieser Schlüsselworte enthalten werden in einem Textfeld (wxTextCtrl, multiline, readonly) angezeigt.
    Nun möchte ich gerne dass, wenn der User eine dieser Zeilen in diesem TextCtrl anklickt und anschliessend z.B einen Button klickt (das TextCtrl also den Focus verliert) diese Zeile aus dem TextCtrl ausgelesen wird.
    Es geht also darum den Event 'TextCtrl loses focus' abzufangen und (z.B. mit GetInsertionPoint() ) die Position der Zeile zu erhalten in der der Cursor war.
    Ist das prinzipiell möglich und wie könnte ich das umsetzen?
    Ich verwende CodeBlocks10.05 und wxWidgets2.8.

    LG Alberich



  • Es gibt den "wxEVT_KILL_FOCUS"-Event (EVT_KILL_FOCUS als Eventtable-Makro), dass gesendet wird, wenn das wxTextCtrl den Fokus verliert.
    Aber wieso benutzt du nicht einfach eine wxListBox? Die ist wie geschaffen fuer dein Problem und wuerde einige Dinge vereinfachen. Beispielsweise koennte der Benutzer direkt auf einen Eintrag doppelklicken und muesste nicht den Umweg ueber den Button gehen. Die Benutzung eines wxTextCtrl fuer deinen Fall scheint mir eher etwas strange...



  • Danke für den Hinweis, werd mich mit dem Eventhandling wohl noch ein bischen auseinandersetzen müssen. 🙂
    Der Grund warum ich ein TextControl verwende ist die Möglichkeit den darzustellenden Text wenn angebracht farbig zu unterlegen, die Schriftfarbe je nach Zeileninhalt zu ändern sowie markierten Text in die Zwischenablage kopieren zu können. Das alles geht (soweit mir bekannt) leider nicht mit einer ListBox.



  • Alberich schrieb:

    Danke für den Hinweis, werd mich mit dem Eventhandling wohl noch ein bischen auseinandersetzen müssen. 🙂

    Das ist eigentlich ganz einfach. Ich wuerde das so machen:
    - von wxTextCtrl ableiten
    - in der abgeleiteten Klasse eine Funktion "void OnKillFocus(wxFocusEvent&)", eine long-Variable "m_LastPosition" und eine Funktion "long GetLastPosition()" deklarieren
    - im EventTable EVT_KILL_FOCUS(MyTextCtrl::OnKillFocus) hinzufuegen
    - in der Definition der OnKillFocus-Funktion die m_LastPosition Variable setzen: "m_LastPosition = GetInsertationPoint()"
    - die Funktion GetLastPosition muss dann nur noch die long-Variable zurueckgeben

    Alberich schrieb:

    Der Grund warum ich ein TextControl verwende ist die Möglichkeit den darzustellenden Text wenn angebracht farbig zu unterlegen, die Schriftfarbe je nach Zeileninhalt zu ändern sowie markierten Text in die Zwischenablage kopieren zu können. Das alles geht (soweit mir bekannt) leider nicht mit einer ListBox.

    Mit einer einfachen ListBox nicht, aber mit einer ListCtrl ist alles genannte moeglich (bei Fragen zu "wie" kannste gern fragen)
    Mit einer ListCtrl hast du diverse Vorteile:
    - Dein User kann Eintraege im "klassischen Stil" auswaehlen (eine wxTextCtrl dagegen ist fuer so einen Fall eher weniger empfehlenswert, weil es einfach nicht ueblich ist Eintraege durch eine wxTextCtrl auszuwaehlen. Das koennte sich fuer den User "fremd" anfuehlen. Andererseits kenn ich dein Programm natuerlich nicht und moechte dir auch nichts einreden. Ist nur ein gutgemeinter Ratschlag)
    - Dein User kann auf Eintraege rechtsklicken. Dann kannst du ein Popup-Menue einblenden und ihm zusaetzliche Funktionen anbieten, wie auch das, was mit dem Button machen wolltest. Du kannst auch Doppelklicks, und Mittelklicks implementieren
    - Du koenntest dem User erlauben einzelne Eintraege zu loeschen, zu sortieren (z.B. nach dem Alphabet) und zu verschieben wie es ihm passt.
    - wxListCtrl unterstuetzt Spalten, d.h. du koenntest z.B. das Schluesselwort in der ersten Spalte zeigen und die Zeile in der zweiten Spalte
    - Die Eintraege koennen w
    - uvm



  • Wow, danke für die ausführlichen Tips!
    Ich werds sofort ausprobieren und schauen ob ich 'OnLostFocus' hinbekomme. 🙂
    Die Möglichkeiten einer ListCtrl hab ich mir noch gar nicht so genau angeschaut, was du da aufzählst klingt aber sehr vielversprechend. Naja, ich bin halt neu bei wxWidgets und hab eigentlich noch gar keinen Überblick was die Bibliothek so alles bietet. Werd mir dann mal die class reference der ListCtrl vornehmen und ein bischen schmökern. 🙂
    Das Programm selbst schreibe ich eigentlich mehr aus Spaß und um auf diesem Wege wxWidgets kennenzulernen, deshalb bin ich für jeden Ratschlag und Hinweis dankbar.
    Vielen Dank für die Hilfe!


Anmelden zum Antworten