Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Tabulator im Formular deaktivieren
schitho - Mo 20.10.03 13:13
Titel: Tabulator im Formular deaktivieren
Hi,
wie kann ich die Tabulatorfunktion in einem Formular deaktivieren?
Dies sollte doch im jeweiligen Object mit TabStop:=false; funktionieren.
Tut es aber bei TRadioButton nicht.
Ich muss das Weiterspringen zum nächsten Feld verhindern, weil ich auf den Tabulator in einem Edit-Feld reagieren möchte.
Wie mach ich das?
Gruß
Thomas
Terra23 - Mo 20.10.03 13:36
Mach doch so:
OnKeyPress
Delphi-Quelltext
1: 2:
| If Key=VK_TAB Then Edit1.SetFocus; |
Delete - Mo 20.10.03 13:38
bei mir funktioniert die eigenschaft TabStop := False ... :twisted:
da liegt der fehler vermutlich woanders....
schitho - Mo 20.10.03 14:47
DaBass hat folgendes geschrieben: |
bei mir funktioniert die eigenschaft |
Auch bei den RadioButtons im Objektinspektor???
Zitat: |
Mach doch so:
OnKeyPress
Sourcecode:
If Key=VK_TAB
Then Edit1.SetFocus;
|
Es muss wohl heißen
Delphi-Quelltext
1:
| If Ord(Key)=VK_TAB then Edit1.SetFocus; |
weil Key vom Typ Char ist.
Funktioniert aber auch nicht. Es wird einfach zum nächsten Feld gesprungen.
Hier der Code:
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: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| unit TabUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; RadioButton1: TRadioButton; RadioButton2: TRadioButton; procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin If Ord(Key)=VK_TAB then begin Edit1.SetFocus; ShowMessage('Tabulator gedrückt'); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.TabStop:=false; RadioButton1.TabStop:=false; RadioButton2.TabStop:=false; end;
end. |
Wenn man in OnCreate bei den RadioButtons
TabStop:=falsezuweist, dann reagiert das Programm auf die Tabulator-Taste nicht mehr (kein Weiterspringen zum nächsten Feld). Im Objektinspektor hat es komischerweise keine Auswirkung, wenn
TabStop:=false zugewiesen wird.
Allerdings kann ich unter Edit1 weiterhin den Tabulator nicht abfangen :cry:
Hat wer ne Idee?
Gruß
Thomas
Delete - Mo 20.10.03 15:31
also ich habe die eigenschaft im objektinspektor auf False gesetzt und es funktioniert,
setze den TabOrder eintrag von TRadioGroup mal auf 0
und den von TEdit auf 1.
gehts nicht so??
Delete - Mo 20.10.03 15:34
ausserdem musst du die abfangroutine nicht in TEdit machen,
sondern in TRadioGroup denke ich... wechsle das im Code mal aus!!
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: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| unit TabUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; RadioButton1: TRadioButton; RadioButton2: TRadioButton; procedure RadioGroupKeyPress(Sender: TObject; var Key: Char); procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.RadioGroupKeyPress(Sender: TObject; var Key: Char); begin If Ord(Key)=VK_TAB then begin Edit1.SetFocus; ShowMessage('Tabulator gedrückt'); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.TabStop:=false; RadioButton1.TabStop:=false; RadioButton2.TabStop:=false; end;
end. |
so sollte deine source dann aussehen, siehst du den unterschied??
Terra23 - Mo 20.10.03 16:27
... gut, so ganz korrekt war mein Code halt nicht. :-) Ich muß aber sagen, je öfter ich das Eröffnungs-Posting lese, desto mehr verwirrt es mich. :roll:
schitho - Mo 20.10.03 22:43
DaBass hat folgendes geschrieben: |
ausserdem musst du die abfangroutine nicht in TEdit machen,
sondern in TRadioGroup denke ich... wechsle das im Code mal aus!!
|
Und wozu soll das gut sein? Versteh Deinen Vorschlag nicht. Hab ihn tortzdem ausprobiert. Bringt aber nix :(
Kann es einfach sein das Delphi die Abfrage des Keys VK_TAB nicht unterstützt?
Gruß
Thomas
schitho - Mo 20.10.03 23:48
Hab jetzt folgendes herausgefunden:
OnKeyPress liefert keine Virtual-Codes
OnKeyDown liefert Virtual-Codes ausgenommen Tabulator und Druck
OnKeyUp liefert alle virtuellen Codes.
Daher müsste es mit OnKeyUp funktionieren. Tu es auch - aber leider nur so lange man kein anderes Objekt anklickt.
Konkret:
Nach dem starten des Programmes klicke ich mit der Maus in das Edit-Feld. Sobald ich nun eine Taste drücke, wird das Ereignis
OnKeyUp ausgelöst. Auch bei der Tabulator-Taste.
Klick ich aber auf die RadioButtons und danach wieder in das Edit-Textfeld, dann wird der Tabulator nicht mehr erkannt. Die anderen Tasten lösen jedoch weiterhin das
OnKeyUp-Ereignis aus.
Seltsam, oder?
Hier der geänderte Code:
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: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| unit TabUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; RadioButton1: TRadioButton; RadioButton2: TRadioButton; procedure FormCreate(Sender: TObject); procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.TabStop:=false; RadioButton1.TabStop:=false; RadioButton2.TabStop:=false; end;
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin ShowMessage('Tastendruck erkannt'); If Key=VK_TAB then begin Edit1.SetFocus; ShowMessage('Tabulator gedrückt'); end; end;
end. |
Worin liegt nun der Unterschied, ob ich nach Programmstart oder eben erst später in das Edit-Feld klicke??
Gruß
Thomas
Delete - Di 21.10.03 13:05
so wie du die abfangroutine geschrieben hast, fängst du den TAB nur im Edit1 ab.. du must diesen event jedoch dem RadioGruop 1 zuteilen...
siehst du den Fehler, den du da machst??
schitho - Di 21.10.03 13:27
DaBass hat folgendes geschrieben: |
so wie du die abfangroutine geschrieben hast, fängst du den TAB nur im Edit1 ab.. du must diesen event jedoch dem RadioGruop 1 zuteilen...
siehst du den Fehler, den du da machst?? |
Nicht wirklich. Wenn der Cursor im Editfeld sich befindet, dann muss es doch reichen, wenn ich dort den Tabulator abfange. :roll:
Ich will ja nur im Editfeld den Tabulator abfangen und nicht in jedem anderen Objekt auch noch.
Gruß
TZhomas
barfuesser - Di 21.10.03 13:35
Benutze das Ereignis OnShortCut des Formulars.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TDasForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean); begin if (Msg.CharCode = VK_TAB) and (ActiveControl = DeinEdit) then begin Handled := true; end else Handled := false; end; |
[edit]
Vergiß nicht das Property KeyPreview des Forms auf true zu setzen!
[/edit]
barfuesser
schitho - Di 21.10.03 23:33
Hey! Super! Jetzt funktioniert es!!!!!! :dance:
Funktioniert auch, wenn KeyPreview auf false steht.
Nur die Taste Druck löst das Ereginis OnShortCut nicht aus. Ist aber kein Problem, weil diese Taste dafür das Ereignis OnKeyUp auslöst.
Vielen Dank!
Gruß
Thomas
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!