Autor Beitrag
schitho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Mo 20.10.03 13:36 
Mach doch so:

OnKeyPress
ausblenden Delphi-Quelltext
1:
2:
If Key=VK_TAB
Then Edit1.SetFocus;

_________________
Hasta La Victoria Siempre
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.10.03 13:38 
bei mir funktioniert die eigenschaft TabStop := False ... :twisted:


da liegt der fehler vermutlich woanders....
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: 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

ausblenden 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:

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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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

_________________
(Sorry! Leider ewiger Delphi-Neuling)
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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



BeitragVerfasst: 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!!

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:
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 
    { Private-Deklarationen } 
  public 
    { Public-Deklarationen } 
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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:

_________________
Hasta La Victoria Siempre
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: 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:

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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: 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

_________________
(Sorry! Leider ewiger Delphi-Neuling)
barfuesser
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: Di 21.10.03 13:35 
Benutze das Ereignis OnShortCut des Formulars.
ausblenden 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;
    // Deine Handlungen
  end else Handled := false;
end;


[edit]
Vergiß nicht das Property KeyPreview des Forms auf true zu setzen!
[/edit]

barfuesser
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: 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

_________________
(Sorry! Leider ewiger Delphi-Neuling)