Lustiges Problem mit CEdit, CComboBox und UpdateData()...
-
In einem Bearbeitungssteuerelement (CEdit, wie ich meinem Compiler entlocken konnte) soll der Benutzer einen Namen (aus einer vorgefertigten Liste) reinschreiben können. Ist der Namen korrekt (er ist in der Liste verzeichnet), sollen andere Steuerelemente verfügbar gemacht werden, ist der Name Unsinn, soll alles gesperrt werden (bis auf das zu ändernde Steuerelement).
So weit, so gut. Es existiert ausserdem eine Combobox, in der man einen Datensatz auswählen kann (ingesamt 10). Wenn der Benutzer einen Datensatz AUSWÄHLT, läuft alles wie am Schnürchen, da der Benutzer keine Chance hat, das Steuerelement um einen fehlerhaften Eintrag zu erweitern und zum Absturz zu bringen. Wenn der Benutzer aber schneller mit der Tastatur als mit der Maus ist, möchte ich ihm die Möglichkeit geben, den Datensatz selbst einzutippen.
Wenn der Benutzer einen korrekten String eingegeben hat, wird die entsprechende Auswahl Mithilfe einer Control-Variable und der Funktion SetCurSel() bestätigt, danach sollen alle (einschliesslich des oben genannten Edit-Elements) aktiviert und mit Werten versehen werden. Ist die Eingabe jedoch nicht als gültiger Datensatz anzusehen, sollen alle Steuerelemente (einschliesslich des oben genannten Edit-Elements) deaktviert werden und (!) alle Werte sollen gelöscht werden (!).
Jetzt zum Problem und mehrere Varianten: Ich hatte ein CString-Objekt, dass mit dem Edit-Element verbunden ist. Wenn ich diesem Objekt den Wert L"" zuwies, blieb der alte Wert bestehen. Daraufhin habe ich UpdateData(FALSE) aufgerufen, welches den Inhalt des Edit-Elements gelöscht hat. Das hatte jedoch den Nachteil, dass meine Combobox ... ein ... etwas ... ... seltsames Verhalten an den Tag legte: Ich konnte den Text nicht mehr bearbeiten. Jedes mal, wenn ich einen Buchstaben löschen wollte, wurde (aufgrund von UpdateData(FALSE), soviel weiss ich jetzt), der alte String wiederhergestellt. Zuerst dachte ich, das hat was mit der TRUE-Version zu tun, aber Dank der Überwachung der Variablen weiss ich jetzt, das ist falsch.
Dann dachte ich: Versuchs mal mit Afghanistan, Bin Laden und der Taliban,aber meinen Computer zerbomben bring's auch nicht. Deshalb Control-Variable vom Typ CEdit erstellt, mit dem Steuerelement verbunden und verzweifelt: die Funktion Clear() scheint nicht zu funktionieren. Deshalb die Preisfrage: Kennt jemand einen Weg, dieses Steuerelement zu aktualisieren, ohne die anderen zu aktualisieren? Wichtig, ich will es nicht neu zeichnen (via OnPaint&Co), sondern die Werte aktualisieren, und zwar OHNE die anderen zu aktualisieren.
-
SetWindowText() istz dein Freund
m_MyEdit.SetWindowText(_T("")); //m_MyEdit is die Ctrl-Variable auf dein Edit //oder GetDlgItem(IDC_MYEDIT)->SetWindowText(_T(""));je nachdem was dir besser gefällt, GetWindowText holt dir den Text aus dem Steuerelement
-
Ahn' mal, du weisst das nicht, aber ich! Auf die Idee bin ich schon vorher gekommen. Daraufhin hat das Steuerelement auf "Nicht verfügbar" (gleichzusetzten mit GetDlgItem(IDC_MYEDIT)->EnableWindow(FALSE)) geschaltet. Dann habe ich es im Code nach der Anweisung wieder aktiviert. An das Ergebnis kann ich micht nicht mehr erinnern, aber es war nicht zufriedenstellend.
Entschuldigung für den Sarkasmus.
-
bist du dir sicher das dein Editctrl nich auf onchange reagiert und du dir selbst die beine weg haust. Denn das SetitemText() ein EnableWindow(FALSE) Effekt Auslösst is mir noch net passiert.
(na ja was im Westen nicht alles Passiert <- Sarkasmus)
-
Du könntest recht haben. Wenn das Editfeld mit einem falschen Wert gefüllt wird, soll alles andere BIS auf das Editfeld gesperrt werden. Wenn ein falscher Datensatz ausgewählt wurde, soll der Wert im Editfeld gelöscht werden, dadurch wird sowohl Combofeld (Datensatz wurde ausgewählt) als auch Editfeld (Eintrag wurde geändert) deaktiviert.
...aber bis jetzt war mir nicht bewusst, dass mein Programm so empfindlich reagiert. Wie dem auch sei, ich werde mal ein paar Tests durchführen. Erstmal Danke für die Geduld.
Jaja, hier geht echt die Post ab <-Sarkasmus