Autor Beitrag
motion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Di 16.12.08 22:46 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 16.12.08 23:02 
Beispiel:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: 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?
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
  if (Key = #127then
    Key := #0;
Vielleicht geht das.
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: 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.