Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Ctrl-Backspace&Delete


motion - Di 16.12.08 22:46
Titel: Ctrl-Backspace&Delete
Ich einer eigenen Ableitung der TEDIT Kompontente möchte ich Ctrl+Tasten-Funktionen nachbilden.
Standardmäßig arbeiten diese Ctrl-Funktionen immer wortweise.
Ctrl+Cursor left/right funktioniert ja schon direkt mit TEDIT.
Aber Ctrl+Backspace und Ctrl+Delete haut nicht hin.

Ctrl+BackSpace soll das Wort links des Cursors löschen. Tatsächlich wird nur ein senkrechter Strich in den Text eingefügt (Code:127). Das kriege ich auch nicht unterdrückt, selbst wenn ich im Keydown und Keypressed dieses filtere.

Ctrl+Delete soll das Wort recht des Cursors löschen. Tatsächlich wird aber der ganze Rest des Textes gelöscht.

Hat jemand ein funktionierendes Code-Fragment, welches die gewünschten Funktionen realisiert?


jaenicke - Di 16.12.08 23:02

Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TfrmMain.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  tmp: String;
begin
  if (Key = VK_DELETE) and (ssCtrl in Shift) then
  begin
    tmp := Edit1.Text;
    if PosEx(' ', Edit1.Text, Edit1.SelStart + 1) > 0 then
      Delete(tmp, Edit1.SelStart + 1, PosEx(' ', Edit1.Text, Edit1.SelStart + 1) - Edit1.SelStart)
    else
      tmp := Copy(tmp, 1, Edit1.SelStart);
    Edit1.Text := tmp;
    Key := 0;
  end;
end;
Das müsste halt noch etwas verfeinert werden, es funktioniert schon mal denke ich, akzeptiert aber nur mit Leerzeichen als Trennzeichen.


motion - Di 16.12.08 23:36

Schon sehr gut!
Einige Kleinigkeiten habe ich noch nachgebessert (Cursor-Position erhalten und das inherited bei nicht betroffenen Tastencodes).

Hier mein aktuelles Code-Snippet basierend auf Deinem, ERWEITERT um die Ctrl-Backspace Funktion. Abgesehen davon, das die Löschfunktion momentan noch die selbe vom Ctrl-Del ist (das muss ich noch ändern), sieht man hier das Problem mit dem eingefügten Sonderzeichen.
Eine Idee wie das man unterdrücken kann?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
procedure TTest5.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var tmp:string;
var save_SelStart:Word;
begin
  if (Key = VK_DELETE) and (ssCtrl in Shift) then
  begin
    save_SelStart:=edit1.SelStart;
    edit1.SelLength:=0;
    tmp := Edit1.Text;
    if PosEx(' ', Edit1.Text, Edit1.SelStart + 1) > 0 then
      Delete(tmp, Edit1.SelStart + 1, PosEx(' ', Edit1.Text, Edit1.SelStart + 1) - Edit1.SelStart)
    else
      tmp := Copy(tmp, 1, Edit1.SelStart);
    Edit1.Text := tmp;
    Key := 0;
    edit1.Selstart:=save_Selstart;
  end
else
  if (Key = VK_back) and (ssCtrl in Shift) then
  begin
    save_SelStart:=edit1.SelStart;
    edit1.SelLength:=0;
    tmp := Edit1.Text;
    if PosEx(' ', Edit1.Text, Edit1.SelStart + 1) > 0 then
      Delete(tmp, Edit1.SelStart + 1, PosEx(' ', Edit1.Text, Edit1.SelStart + 1) - Edit1.SelStart)
    else
      tmp := Copy(tmp, 1, Edit1.SelStart);
    Edit1.Text := tmp;
    Key := 0;
    edit1.Selstart:=save_Selstart;
  end
else inherited;
end;


jaenicke - Di 16.12.08 23:48

user profile iconmotion hat folgendes geschrieben Zum zitierten Posting springen:
Eine Idee wie das man unterdrücken kann?
Ich würde es in OnKeyPress so versuchen:

Delphi-Quelltext
1:
2:
  if (Key = #127then
    Key := #0;
Vielleicht geht das.


motion - Di 16.12.08 23:51

Genau! Die einfachste Lösung ist die Beste!
Ich habe immer auf #8 gefiltert und das klappte natürlich nicht.
Okay .. dann habe ich jetzt alles und kann die Komponenten anpassen.
Danke für die schnelle und kompetente Hilfe.