EventHandler für wxListBox
-
Hallo, ich bin neu hier und hoffe dass mir jemand helfen kann. Ich schreibe derzeit mein erstes Programm mit wxWidgets.
Folgendes:
Ich habe ein wxListBoxCtrl und möchte nun etwas tun, wenn der User einen anderen Eintrag im Control selektiert. Da ich den wxFormbuilder nutze, habe ich ein Event bei OnListbox eingetragen. Funktioniert auch. Aber meine Funktion wird erst aufgerufen, NACHDEM ein neuer Eintrag selektiert wurde. Ich muss aber zuerst den alten Stand sichern. Also habe ich ein weiteres Event beim Mausklick installiert (OnLeftDown). Diese Funktion wird anscheinend zum richtigen Zeitpunkt aufgerufen. ABER: Nun wird nichts mehr selektiert. Irgendwie muss ich wohl den Defaulthandler für dieses Event aufrufen, nachdem mein Code ausgeführt wurde. Aber wie hessit der, bzw. wie mache ich das ?
Oder kann ich das Event OnListbox aufrufen BEVOR eine neue Selektion durchgeführt wird ?
-
Wenn das erste mal etwas selektiert wird, dann speicher doch diesen Wert in einer Variablen.
Oder was spricht da dagegen?
rya.
-
Es ist so: Ich habe eine Listbox und ein Textctrl. Je nachdem welcher Eintrag in der Listbox selektiert wird, erscheint im Texstcontrol ein dazu passender Text, welcher jedoch vom Anwender geändert werden kann.
Wird nun ein neuer Eintrag in der Listbox ausgewählt, muss ich zuerst den eventuell geändert Text retten, bevor ich den neuen anzeigen kann. Icfh könnte mir zwar auch den Ursprungstext in einer Variablen sichern, aber halt nicht den vom Anwender geänderten Text.
-
Thule schrieb:
Ich könnte mir zwar auch den Ursprungstext in einer Variablen sichern, aber halt nicht den vom Anwender geänderten Text.
Warum?
rya.
-
benachrichtigt werden muss BEVOR der Anwender einen anderen Eintrag auswählt
Das genau ist ja mein Problem
-
Thule schrieb:
benachrichtigt werden muss BEVOR der Anwender einen anderen Eintrag auswählt
Das genau ist ja mein ProblemJa aber Du als Programmierer bestimmst doch wann etwas geändert wird. Warum speicherst Du den Wert nicht wenn Du den noch brauchst?
rya.
-
der Anwender kann doch in einem Textcontrol jederzeit den Wert ändern, so soll es ja auch sein. Und um diesen Text zu sichern, muß ich doch wissen wann der Anwender umschaltet (durch die Listbox) auf einen anderen Text.
Also nochmal:
Es gibt verschiedene Texte, die jederzeit vom Anwender geändert werden können. Zu jedem Text gehört eine Überschrift.
In der Listbox werden alle vorhandenen Überschriften dargestellt.
Wenn nun der Anwender einen anderen Eintrag in der Listbox auswählt, dann muß natürlich der dazugehörige Text angezeigt werden. Aber da ja der alte Text möglicherweise geändert wurde (vom Anwender), muß ich diesen sichern.
Dazu muß ich aber wissen WANN der User umschaltet. Dies tue ich, indem ich das Event OnLeftDown (Maustaste) der Listbox abfange. Aber nachdem mein Code zum Sichern des Textes ausgeführt wurde, muß ich ja den alten Handler aufrufen (sozusagen den Defaulthandler der Listbox für das OnLeftDown-Event) damit eine Selektion in der Listbox auch ausgeführt wird. Deshalb will ich wissen wie man das macht.
Bisher ist es so, dass mein Code zum Sichern des Textes zwar ausgeführt wird,aber der neu gewählte Eintrag in der Listbox nicht selektiert wird. Daran ist definitiv mein Code schuld, denn wenn ich meine Funktion wieder rausnehme, dann klappt es wieder.
Alles klar jetzt ?
-
Nimm eine wxEditableListbox. Die nutzt ein wxListCtrl und wirft auch deren Events.
http://docs.wxwidgets.org/trunk/classwx_editable_list_box.html
http://docs.wxwidgets.org/trunk/classwx_list_ctrl.html# EVT_BEGIN_LABEL_EDIT(id, func):
Begin editing a label. This can be prevented by calling Veto().
# EVT_LIST_END_LABEL_EDIT(id, func):
Finish editing a label. This can be prevented by calling Veto().Wäre eventuell komfortabler?
rya.
-
Hallo
Da ich denke mein Thema passt zu diesem Thread stelle ich hier mal meine frage.
Ich versuche das \wxWidgets2.8\samples\listctrl projekt zu kopieren.
Mein Projekt erstelle ich mit dem "wxWidgets Application Wizard" aus dem wxPack.
Es werden die Standart Einstellungen des Wizard benutzt, also es wird mit wxFormbuilder gearbeitet.Ich erstelle ein Frame mit Panel und füge eine wxListctrl hinzu.
Die wxListCtrl ist als wxLC_REPORT eingestellt hat drei Spalten und zwei Zeile.
Jetzt will ich eine Zelle (so wie im Samples\listctrl) anklicken(maus) und den Inhalt editieren.Hab wie im Sample alle eventHandle hinzu gefügt. Kann aber die Zelle so nicht öffnen.
void list6Panel::OnSelected(wxListEvent& event1) { // LogEvent(event, _T("OnSelected")); // if ( GetWindowStyle() & wxLC_REPORT ) { wxListItem info; info.m_itemId = event1.m_itemIndex; info.m_col = 1; info.m_mask = wxLIST_MASK_TEXT; if ( m_imageList->GetItem(info) ) { wxLogMessage(wxT("Value of the 2nd field of the SSelected item: %s"), info.m_text.c_str()); } else { wxFAIL_MSG(wxT("wxListCtrl::GetItem() failed")); } } } void list6Panel::OnFocused(wxListEvent& event1) { //wxMessageBox( wxT("OnFocused: %s"), event1.m_item.m_text.c_str()); event1.Skip(); } void list6Panel::OnBeginLabelEdit(wxListEvent& event1) { // wxLogMessage( wxT("OnBeginLabelEdit: %s"), event1.m_item.m_text.c_str()); }
was mache ich falsch?
Gruß Califax
-
Hallo
Hab das Problem gefunden.
Ich hatte das wxListCtrl/ Style wxLC_EDIT_LABELS Bit (in wxFormbuilder) nicht eingeschalten.
Jetzt kann ich schon mal die erste Zelle(Spalte 1) mit der Mouse und Keys bearbeiten.
Und nun muß ich noch einen Weg finden wie ich auf die Zelle der anderen Spalten zugreifen kann damit ich auch diese Zellen bei laufende Programm bearbeiten kann.Gruß Califax
-
Hallo
Sagt mal, wie kann man auf die Spalten ID zugreifen .
die Zeilen ID kann man ja mitint row = event1.GetItem();
abfragen.
Aber bei der Spalten abfrage kommt nur Null.int col = event1.GetColumn();
Hat einer eine Idee?
Oder geht das mit wxListCtrl überhaupt oder sollte man lieber mit wxGrid arbeiten?Gruß Califax