TEdit-Feld UNDO Problem
-
Hallo Ihr Menschen,
ich lösche den Text eines TEdit-Felds per Button, das Problem was nun dabei auftritt ist das die Veränderung überhaupt nicht vom UNDO-PUFFER bemerkt wird, denn ich kann den gelöschten Text nicht wieder zurückholen.
Kann man den UNDO-Puffer seperat ansprechen ? oder etwas auslösen sodaß der UNDO-PUFFER beschrieben wird ?
-
kann man das irgendwie besser lösen ?
void __fastcall TDialog_Update::SpeedButton_Clear1Click(TObject *Sender) { //um den UNDO Puffer zu füllen //sodaß Rückgängig möglich ist //total behämmert LabelEdit_FilePath->SetFocus(); LabelEdit_FilePath->SelectAll(); LabelEdit_FilePath->ClearSelection(); }
-
Hast du schon einfach Clear() ausprobiert?
-
@Th69
habe diese beiden Möglichkeiten ausprobiertLabelEdit_FilePath->Clear(); LabelEdit_FilePath->Text = "";
klar gibt noch mehr Möglichketien den Text zu löschen, kommt aufs selbe raus, der Undo-Puffer wird nicht beschrieben, auch dann nicht wenn ich einfach einen neuen Text reinsetze
LabelEdit_FilePath->Text = "ABCDE";
auch in dem Fall geht die UNDO-Funktion nicht, die Änderung bleibt vom Puffer unerkannt sozusagen.
Das was aber geht ist mit Tastendruck-Simulation
//Zeichen Senden (KEY-PRESS) LabelEdit_Parameter->Clear(); SendMessage(LabelEdit_Parameter->Handle, WM_CHAR, (TCHAR) 'T', 0); SendMessage(LabelEdit_Parameter->Handle, WM_CHAR, (TCHAR) 'E', 0); SendMessage(LabelEdit_Parameter->Handle, WM_CHAR, (TCHAR) 'S', 0); SendMessage(LabelEdit_Parameter->Handle, WM_CHAR, (TCHAR) 'T', 0);
Nicht schön aber Undo geht.
-
Es scheint wirklich nur über die
Selection
zu gehen, so daß der Undo-Buffer gesetzt wird.
Dies entsprichtEM_REPLACESEL
und wird in Edit Control Default Message Processing auch so beschrieben, währendWM_SETTEXT
(=Text
) den Undo-Buffer löscht.Ich erinnere mich gerade, daß ich auch in C# (WinForms) für ein privates Tool die Methode TextBox.Paste(string) nutzen mußte, damit der Undo-Buffer gesetzt bleibt (sowohl das VCL-TEdit-Control als auch die WinForms TextBox verwenden intern das WinAPI Edit Control).
-
@Th69
so hab mir das mal reingezogen und es funktioniert wunderbar, auch bleiben die BUFFER-Informationen für das jeweilige EditFeld vorhanden wenn man mehrere Edit-Felder hat und den Fokus wechselt. Geht aber nur solange das Edit-Feld nicht leer ist.const TCHAR *str = TEXT("T.E.S.T"); SendMessage(LabelEdit_Parameter->Handle, EM_SETSEL, WPARAM(0), LPARAM(-1) ); SendMessage(LabelEdit_Parameter->Handle, EM_REPLACESEL, WPARAM(TRUE), LPARAM(str));
-
Du mußt aber nicht direkt die WinAPI-Funktionen benutzen.
So sollte es mittels der passenden VCL-Funktionen gehen:LabelEdit_Parameter->SelectAll(); LabelEdit_Parameter->SetSel = str; // bzw. SetSelTextBuf(str)
-
@Th69 damit geht es nicht, jedenfalls bei mir nicht.
-
Was mir noch aufgefallen ist, verlässt der Fokus ein leeres Edit-Feld, verfällt der Undo-Puffer, ist scheinbar ein Standardverhalten.
-
OK, hast recht - da scheint bei
SelSel
intern wohlFALSE
alswParam
übergeben zu werden, so daß der Vorgang nicht rückgängig gemacht werden kann: EM_REPLACESEL.
Dann bleibt wirklich nur der explizite Aufruf vonSendMessage
mitWPARAM(TRUE)
.