Delphi-PRAXiS

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 Tab im Edit unterdrücken (https://www.delphipraxis.net/52158-tab-im-edit-unterdruecken.html)

digleu 24. Aug 2005 19:04


Tab im Edit unterdrücken
 
Hi @ll,
besuche diese Seite schon eine Weile und habe schon sehr viele Anstöße und Ideen hierher bekommen, also großes Lob an alle dafür, dass es so eine effiziente und freundliche Delphi-Community im Netz gibt.

Nun zu meinem Anliegen:
Wie kann ich erreichen, dass man mit der Tabluator-Taste nicht mehr von einem Edit-Feld (z.B.) ins nächste springen kann? Das Problem ist nämlich, dass die Events OnKeyPress und OnKeyDown auf die Tabulator-Taste garnicht reagieren und ich somit sowas wie:
Code:
if Key = #9 then Key := #0 (bei OnKeyPress)
nicht machen kann. Das Event OnKeyUp reagiert zwar auf die Tab-Taste, allerdings ist es dann ja schon zu spät (der Fokus ist schon auf dem nächsten Control). Natürlich gibt es die Möglichkeit OnKeyUp
Code:
if Key = VK_TAB then PostMessage(Handle, WM_NextDlgCtl, 1, 0);
aufzurufen (um zum vorherigen Control zurückzuspringen), aber dann springt der Fokus immer so lustig im Formular rum, unschön anzusehen ...

also vielen Dank im Vorraus, Suche wurde natürlich genutzt, google auch und ich bin zu keinem adäquaten Ergebniss gekommen.

Viele Grüße
Lars

SebE 24. Aug 2005 19:07

Re: Tab im Edit unterdrücken
 
Schau dir mal die Eigenschaft TabStop eines Editfeldes an.

In ein Editfeld, bei dem TabStop = False ist, wird nicht mit #9 reingesprungen.
-> Also alle Edits.TabStop := False

marabu 24. Aug 2005 19:17

Re: Tab im Edit unterdrücken
 
Hallo Lars,

wenn du das Verlassen eines Controls per Tab verhindern möchtest, dann kannst du eine OnExit Routine benutzen:

Delphi-Quellcode:
procedure TDemoForm.TestEditExit(Sender: TObject);
begin
  with Sender as TWinControl do
    SetFocus;
end;
Grüße vom marabu

digleu 24. Aug 2005 22:27

Re: Tab im Edit unterdrücken
 
@SebE: ne das wollte ich nicht, aber trotzdem danke!

@marabu: ja genau, perfekt, genau das war mein Anliegen ... ich will ja jetzt nicht zu hohe Ansprüche stellen, aber bei dieser Methode wird der Text, der im Edit-Feld drin ist bei drücken von Tab einmal vollständig markiert ... geht das noch anders? :)

faux 24. Aug 2005 22:40

Re: Tab im Edit unterdrücken
 
Hallo Lars!

Mit "SelStart"legst du fest, wo die Selektierung beginnen soll und mit "SelLength", die Anzahl der zu markierenden Zeichen. Also:

Delphi-Quellcode:
Edit1.SetFocus;
Edit1.SelStart := 0;
Edit1.SelLength := 0;
Grüße
Faux

marabu 25. Aug 2005 08:49

Re: Tab im Edit unterdrücken
 
Hallo Lars,

die Markierung des Textinhaltes ist an das Ereignis OnEnter gekoppelt:

Delphi-Quellcode:
procedure TDemoForm.TestEditEnter(Sender: TObject);
begin
  with Sender as TCustomEdit do
    SelLength := 0;
end;
marabu

digleu 25. Aug 2005 12:01

Re: Tab im Edit unterdrücken
 
ok, damit konnte ich auf jedenfall jetzt schon ne ganze Menge reißen, wenn es Interessiert:
Code:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  with Sender as TCustomEdit do
  begin
    // Die aktuelle Auswahlposition in der nicht verwendeten Eigenschaft Tag speichern
    Tag := SelStart;
    SetFocus;
  end;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  with Sender as TCustomEdit do
  begin
    // Die aktuelle Auswahlposition aus der sonst nicht verwendeten Eigenschaft Tag lesen
    SelStart := Tag;
    SelLength := 0;
  end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then begin  {#13 = Enter}
    Key := #0;
    PostMessage(Handle, WM_NextDlgCtl, 0, 0);
  end;
end;
allerdings habe ich immernoch ein Problem, denn mir ist gestern nicht aufgefallen, dass man das Edit-Feld ja jetzt _garnicht_mehr verlassen kann ... weder mit Enter (also in diesem Fall über PostMessage) noch mit der Maus.

So spontan fällt mir auch nicht ein wie ich das mit der Maus hinbekommen sollte. Für die Enter-Taste fällt mir spontan so ein übler Hack ein, also z.B. OnKeyPress den DragCurser von crDrag auf crNormal setzen (und bei allen anderen Tasten auf crDrag) und den Inhalt von OnExit nur ausführen lassen, wenn der DragCurser auf crNormal gesetzt ist (ja das vergewaltigt die Bedeutung von DragCurser, aber solange ich kein Drag&Drop realisieren will...). Hat hier vielleicht wer eine elegantere Idee?

Lg Lars

Delphi-Freak 25. Aug 2005 12:38

Re: Tab im Edit unterdrücken
 
Naja, ob es elegant ist weiß ich nicht :zwinker:

Zwei Dinge:
Delphi-Quellcode:
if Key = #9 then Key := #0 (bei OnKeyPress)
sollte das nicht eher
Delphi-Quellcode:
if Key = VK_TAB then Key := #0 (bei OnKeyPress)
heißen?
Zweitens hätte ich eine ganz eine andere Idee:
Ein MainMenu mit einem Eintrag mit visible := False und standardmäßig auch enabled := False, dann mit Shortcut auf die Tabulator-Taste: im onEnter-Event setzt du enabled des MenuItems auf True, im onExit auf False.
Nicht so elegant, aber es sollte funktionieren :wink:

LG

Sprint 25. Aug 2005 13:02

Re: Tab im Edit unterdrücken
 
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  {...}
  private
    { Private-Deklarationen }
    procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
  {...}
  end;
Delphi-Quellcode:
{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := OnAppMessage;
end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := False;
  if Msg.message = WM_KEYDOWN then
    if Msg.wParam = VK_TAB then
      if (ActiveControl = Edit1) or (ActiveControl = Edit2) then
        Handled := True;
end;

{--------------------------------------------------------------------------------------------------}
Unterbindet Tabstop in Edit1 und Edit2.

digleu 29. Aug 2005 02:27

Re: Tab im Edit unterdrücken
 
na perfekt, genau das war mein Anliegen. Vielen Dankeschön (natürlich auch an alle Helfer aus den vorherigen Posts)!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 Uhr.

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