Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [strg] + [backspace] (TEdit) (https://www.delphipraxis.net/144452-%5Bstrg%5D-%5Bbackspace%5D-tedit.html)

thepaine91 8. Dez 2009 08:35


[strg] + [backspace] (TEdit)
 
HI und Guten Morgen. :P

(Delphi 6 Enterprise)
Mein Problem:
Wenn man in einem TEdit [strg] + [backspace] drückt kommt dort ja so ein nerviges Sonderzeichen anstelle der gewohnten Funktion.
(Wie es z.B. auch in einem TRichedit gemacht wird.)

Meine Lösung:
Delphi-Quellcode:
procedure TForm1.appmessage(var Msg: TMsg; var Handled: Boolean);
var i: integer;
begin
    if msg.message = wm_keyup then
      if msg.wParam = 17 then
        strg_pressed := false;

    if msg.message = wm_KeyDown then
    begin
      if msg.wParam = 17 then
        strg_pressed := true;

      if (strg_pressed) and (msg.wparam = 8) then
      begin
        if Form1.Active then
        begin
          Input.Text := copy(Input.Text, 1, Backstepposition(Input.Text));
          input.SelStart := length(input.Text);
        end else
        begin
          i := 0;
          while i < length(Whisperforms) do
            if Whisperforms[i].Formular.Active then
            begin
              Whisperforms[i].Formular.Inputw.Text := copy(Whisperforms[i].Formular.Inputw.Text, 1,
                Backstepposition(Whisperforms[i].Formular.Inputw.Text));
              Whisperforms[i].Formular.Inputw.SelStart := length(Whisperforms[i].Formular.Inputw.Text);
              i := length(WhisperForms);
            end;
        end;
        Handled := true;
      end;
    end;
end;

function TForm1.BackstepPosition(StepText: string): integer;
var i: integer;
begin
  i := length(steptext) -1;
  result := 0;
  while i > -1 do
  begin
    if StepText[i] = ' ' then
    begin
      Result := i - 1;
      i := 0;
    end;
    dec(i);
  end;
end;
Und letzendlich meine Frage: :P

Da ich mit der Lösung nicht wirklich zu frieden bin, kennt ihr eine efektivere / bessere Variante?
Voraussetzung ist es ein TEdit zu verwenden.

mfg nic

Sherlock 8. Dez 2009 09:45

Re: [strg] + [backspace] (TEdit)
 
Abgesehen davon, daß Du das ziemlich sicher und einfach im Delphi-Referenz durchsuchenOnKeyDown des TEdits machen kannst, was stört Dich an Deiner irgendwie verwirrend komplexen Lösung?

Sherlock

thepaine91 8. Dez 2009 09:52

Re: [strg] + [backspace] (TEdit)
 
Wenn es so einfach im KeyDown gehen würde hätte ich es gemacht. ;)
Das dachte ich anfangs nämlich auch. Unterschätze mich bitte nicht.

Aber vielleicht hast du ja wirklich eine Lösung die ich übersehen habe. Wenn ja gib mir doch Bitte mal ein Codebeispiel.
Ich sag einfach mal das Stichwort: "OnKeyPress"

DeddyH 8. Dez 2009 10:14

Re: [strg] + [backspace] (TEdit)
 
Vielleicht hab ich zu simpel gedacht, aber wie wäre es so?
Delphi-Quellcode:
procedure TDeinForm.DeinEditKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #127 then
    Key := #8;
end;

thepaine91 8. Dez 2009 10:43

Re: [strg] + [backspace] (TEdit)
 
:wall:
Ich glaub ich setze mich in die nächste Ecke und komm nie wieder da Raus....

Ich hatte für alle Keypress events die Werte in ein Richedit schreiben lassen auch für strg+backspace da kam aber nie die
127... weshalb weis ich atm auch noch nicht.

trotz allem ist es ein wenig zu einfach gedacht.
Ich will ja eben bei dieser Tastenkombination nicht ein Zeichen sondern ein Wort löschen dafür brauche ich dann doch noch das meiste meines aktuellen Quellcodes. Für aussenstehende wird er im Keypress allerdings einfacher zu verstehen sein. Davon gehe ich zumindest aus.

Naja Danke auf jeden fall. ;)

( Wie kamst du auf die 127 ) ?

DeddyH 8. Dez 2009 10:49

Re: [strg] + [backspace] (TEdit)
 
Zitat:

Zitat von thepaine91
( Wie kamst du auf die 127 ) ?

Nachdem ich bei STRG-BACKSPACE nie beim Breakpoint (if Key = #8) ankam, hab ich mir mal den Keywert in einem Label ausgeben lassen :zwinker:

[edit] Neue Idee:
Delphi-Quellcode:
procedure TDeinForm.DeinEditKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #127 then
    begin
      (Sender as TEdit).Perform(WM_KEYDOWN,VK_CONTROL,0);
      (Sender as TEdit).Perform(WM_KEYDOWN,VK_SHIFT,0);
      (Sender as TEdit).Perform(WM_KEYDOWN,VK_LEFT,0);
      (Sender as TEdit).Perform(WM_KEYDOWN,VK_DELETE,0);
      (Sender as TEdit).Perform(WM_KEYUP,VK_CONTROL,0);
      (Sender as TEdit).Perform(WM_KEYUP,VK_SHIFT,0);
      (Sender as TEdit).Perform(WM_KEYUP,VK_LEFT,0);
      (Sender as TEdit).Perform(WM_KEYUP,VK_DELETE,0);
      Key := #8;
    end;
end;
[/edit]

[edit2] OK, vergessen wir die Idee, da wird zuviel gelöscht [/edit2]

Sherlock 8. Dez 2009 10:57

Re: [strg] + [backspace] (TEdit)
 
Na also jetzt leg mal alles zusammen (also Deinen Code und Deddys, und meine Idee) Und korrigiere eine Kleinigkeit (in Deddys Code nicht mir #8 sondern mit #0 ersetzen). Und schon gibt es das gewünschte Ergebnis:

Delphi-Quellcode:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_BACK) and (shift = [ssctrl] )then
  begin
    TEdit(Sender).Text := Copy(TEdit(Sender).Text, 1, BackstepPosition(TEdit(Sender).Text));
    TEdit(Sender).SelStart := Length(TEdit(Sender).Text);
  end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if Key = #127 then
    Key := #0;
end;
:D

Sieht einfach aus :cheers:

Edit: alternativ kannst Du auch die Ersetzung durch #8 lassen, musst dann aber im KeyDown noch ein beliebiges Zeichen dem Edit-Text hinzufügen, das dann im KeyPress gelöscht wird ;)

Sherlock

DeddyH 8. Dez 2009 12:04

Re: [strg] + [backspace] (TEdit)
 
Ich hab noch einmal nachgesehen, wie sich ein RichEdit verhält und bin nun hier angekommen:
Delphi-Quellcode:
function TForm1.LastWordPos(const Src: string; Start: integer): integer;
var i: integer;
begin
  Result := 0;
  if Length(Src) > 0 then
    begin
      if Start > Length(Src) then
        Start := Length(Src);
      i := Start;
      while (i > 0) and (Result < 1) do
        begin
          dec(i);
          if Src[i] = #32 then
            Result := i;
        end;
    end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var LastStart: integer;
begin
  if Key = #127 then
    begin
      LastStart := (Sender as TEdit).SelStart;
      (Sender as TEdit).SelStart := LastWordPos((Sender as TEdit).Text,LastStart);
      (Sender as TEdit).SelLength := LastStart - (Sender as TEdit).SelStart;
      (Sender as TEdit).SelText := '';
      Key := #0;
    end;
end;
Damit bleibt der Text hinter dem Cursor erhalten.

thepaine91 8. Dez 2009 13:04

Re: [strg] + [backspace] (TEdit)
 
Also eigentlich hat mir nur die #127 gefehlt. ^^

Das ist eh nur eine kleinigkeit gewesen.
DeddyH wobei die Löschmethode von dir ein wenig besser ist, da das Ergebnis dann wie der gewohnte standart ist. ;)
Diesen Weg wollte ich zuerst auch gehen aber... hatte eben die 127 nicht gefunden -.-

Auf jeden fall Vielen Dank für die Hilfe. Denke hier ist alles geklärt. :P

Sherlock 8. Dez 2009 14:29

Re: [strg] + [backspace] (TEdit)
 
Nicht ganz alles geklärt...im Prinzip wäre es doch Schick das andere Verhalten mit der Strg-Taste noch einzubauen. Nämlich das Wortweise hinundherspringen per Strg+<-->. Aber wenn ich das richtig gelesen habe, dann lässt das TEdit die Pfeiltasten nicht zum OnKeyDown durch.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz