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 ausprobiert

    LabelEdit_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 entspricht EM_REPLACESEL und wird in Edit Control Default Message Processing auch so beschrieben, während WM_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 wohl FALSE als wParam übergeben zu werden, so daß der Vorgang nicht rückgängig gemacht werden kann: EM_REPLACESEL.
    Dann bleibt wirklich nur der explizite Aufruf von SendMessage mit WPARAM(TRUE).


Anmelden zum Antworten