Autor |
Beitrag |
schitho
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: Mo 20.10.03 13:13
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
_________________ (Sorry! Leider ewiger Delphi-Neuling)
|
|
Terra23
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Mo 20.10.03 13:36
Mach doch so:
OnKeyPress
Delphi-Quelltext 1: 2:
| If Key=VK_TAB Then Edit1.SetFocus; |
_________________ Hasta La Victoria Siempre
|
|
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 20.10.03 13:38
bei mir funktioniert die eigenschaft TabStop := False ...
da liegt der fehler vermutlich woanders....
|
|
schitho 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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:
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
Hat wer ne Idee?
Gruß
Thomas
_________________ (Sorry! Leider ewiger Delphi-Neuling)
|
|
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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??
|
|
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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!!
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
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: 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. 
_________________ Hasta La Victoria Siempre
|
|
schitho 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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
_________________ (Sorry! Leider ewiger Delphi-Neuling)
|
|
schitho 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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:
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
_________________ (Sorry! Leider ewiger Delphi-Neuling)
|
|
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: 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.
Ich will ja nur im Editfeld den Tabulator abfangen und nicht in jedem anderen Objekt auch noch.
Gruß
TZhomas
_________________ (Sorry! Leider ewiger Delphi-Neuling)
|
|
barfuesser
      
Beiträge: 324
|
Verfasst: 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 
      
Beiträge: 288
XP Home SP2
D2005 Prof
|
Verfasst: Di 21.10.03 23:33
Hey! Super! Jetzt funktioniert es!!!!!!
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
_________________ (Sorry! Leider ewiger Delphi-Neuling)
|
|