Skip to main content
Some changes to the code to work with TCombobox
Source Link
type TClickObject = class(TObject) public Form: TForm; procedure MyTabOnClick(Sender: TObject); end; { ClickClass } procedure TClickObject.MyTabOnClick(Sender: TObject); var ch: Char; key: Word; begin if Form = nil then Exit; key := vkTab; ch := #9; Form.KeyDown(key, ch, []); end; procedurefunction CreateTabButton(Form: TForm); var Button: TButton; var Count: Integer; ClickObject: TClickObject; begin //Make the click object ClickObject := TClickObject.Create; ClickObject.Form := Form; //Make other buttons not default for Count := 0 to Form.ComponentCount-1 do begin if (Form.Components[Count] is TButton) then //Extend for other buttons ? begin (Form.Components[Count] as TButton).Default := False; end; end; //Make a button far off the screen ButtonResult := TButton.Create(Form); ButtonResult.Parent := Form; ButtonResult.Default := True; ButtonResult.OnClick := ClickObject.MyTabOnClick; ButtonResult.Text := 'TAB'; ButtonResult.Position.X := -10000; ButtonResult.Position.Y := -10000; end; //Form OnShow Event, declare tabButton as TButton in your Form then you can use it on other components like combo boxes where you want to fire tab / enter event  tabButton := CreateTabButton(Self); 

The TComboBox for example does does not place nice with the Button solution, here is an example of making it work

procedure TForm1.CommboBox1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if (Key = 13) then begin tabButton.OnClick(self); //tabButton declared in the Form an initialized with CreateTabButton end; end; 
type TClickObject = class(TObject) public Form: TForm; procedure MyTabOnClick(Sender: TObject); end; { ClickClass } procedure TClickObject.MyTabOnClick(Sender: TObject); var ch: Char; key: Word; begin if Form = nil then Exit; key := vkTab; ch := #9; Form.KeyDown(key, ch, []); end; procedure CreateTabButton(Form: TForm); var Button: TButton; Count: Integer; ClickObject: TClickObject; begin //Make the click object ClickObject := TClickObject.Create; ClickObject.Form := Form; //Make other buttons not default for Count := 0 to Form.ComponentCount-1 do begin if (Form.Components[Count] is TButton) then //Extend for other buttons ? begin (Form.Components[Count] as TButton).Default := False; end; end; //Make a button far off the screen Button := TButton.Create(Form); Button.Parent := Form; Button.Default := True; Button.OnClick := ClickObject.MyTabOnClick; Button.Text := 'TAB'; Button.Position.X := -10000; Button.Position.Y := -10000; end; //Form OnShow Event CreateTabButton(Self); 
type TClickObject = class(TObject) public Form: TForm; procedure MyTabOnClick(Sender: TObject); end; { ClickClass } procedure TClickObject.MyTabOnClick(Sender: TObject); var ch: Char; key: Word; begin if Form = nil then Exit; key := vkTab; ch := #9; Form.KeyDown(key, ch, []); end; function CreateTabButton(Form: TForm): TButton; var Count: Integer; ClickObject: TClickObject; begin //Make the click object ClickObject := TClickObject.Create; ClickObject.Form := Form; //Make other buttons not default for Count := 0 to Form.ComponentCount-1 do begin if (Form.Components[Count] is TButton) then //Extend for other buttons ? begin (Form.Components[Count] as TButton).Default := False; end; end; //Make a button far off the screen Result := TButton.Create(Form); Result.Parent := Form; Result.Default := True; Result.OnClick := ClickObject.MyTabOnClick; Result.Text := 'TAB'; Result.Position.X := -10000; Result.Position.Y := -10000; end; //Form OnShow Event, declare tabButton as TButton in your Form then you can use it on other components like combo boxes where you want to fire tab / enter event  tabButton := CreateTabButton(Self); 

The TComboBox for example does does not place nice with the Button solution, here is an example of making it work

procedure TForm1.CommboBox1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if (Key = 13) then begin tabButton.OnClick(self); //tabButton declared in the Form an initialized with CreateTabButton end; end; 
Added another solution which works as expected
Source Link

I'm editing my answer to provide another solution thanks to the simple solution provided by @Uwe Raabe. I'm leaving everything here as this answer exposes some of the "magic" in Firemonkey which often isn't obvious.

I needed to create the "TAB" functionality dynamically on FormShow event of a Form to save myself time on implementation. I needed to make a class to handle the TNotifyEvent (OnClick). Here is my other solution which I have tested now with success. Please note the code below will attempt to remove "Default" button action on Enter so it works.

type TClickObject = class(TObject) public Form: TForm; procedure MyTabOnClick(Sender: TObject); end; { ClickClass } procedure TClickObject.MyTabOnClick(Sender: TObject); var ch: Char; key: Word; begin if Form = nil then Exit; key := vkTab; ch := #9; Form.KeyDown(key, ch, []); end; procedure CreateTabButton(Form: TForm); var Button: TButton; Count: Integer; ClickObject: TClickObject; begin //Make the click object ClickObject := TClickObject.Create; ClickObject.Form := Form; //Make other buttons not default for Count := 0 to Form.ComponentCount-1 do begin if (Form.Components[Count] is TButton) then //Extend for other buttons ? begin (Form.Components[Count] as TButton).Default := False; end; end; //Make a button far off the screen Button := TButton.Create(Form); Button.Parent := Form; Button.Default := True; Button.OnClick := ClickObject.MyTabOnClick; Button.Text := 'TAB'; Button.Position.X := -10000; Button.Position.Y := -10000; end; //Form OnShow Event CreateTabButton(Self); 

The following code is a procedure which can be used from a global library or TDataModule to provide you with the Enter to Tab functionality. I used the onkeyup events on inputs to test it.

The following code is a procedure which can be used from a global library or TDataModule to provide you with the Enter to Tab functionality. I used the onkeyup events on inputs to test it.

I'm editing my answer to provide another solution thanks to the simple solution provided by @Uwe Raabe. I'm leaving everything here as this answer exposes some of the "magic" in Firemonkey which often isn't obvious.

I needed to create the "TAB" functionality dynamically on FormShow event of a Form to save myself time on implementation. I needed to make a class to handle the TNotifyEvent (OnClick). Here is my other solution which I have tested now with success. Please note the code below will attempt to remove "Default" button action on Enter so it works.

type TClickObject = class(TObject) public Form: TForm; procedure MyTabOnClick(Sender: TObject); end; { ClickClass } procedure TClickObject.MyTabOnClick(Sender: TObject); var ch: Char; key: Word; begin if Form = nil then Exit; key := vkTab; ch := #9; Form.KeyDown(key, ch, []); end; procedure CreateTabButton(Form: TForm); var Button: TButton; Count: Integer; ClickObject: TClickObject; begin //Make the click object ClickObject := TClickObject.Create; ClickObject.Form := Form; //Make other buttons not default for Count := 0 to Form.ComponentCount-1 do begin if (Form.Components[Count] is TButton) then //Extend for other buttons ? begin (Form.Components[Count] as TButton).Default := False; end; end; //Make a button far off the screen Button := TButton.Create(Form); Button.Parent := Form; Button.Default := True; Button.OnClick := ClickObject.MyTabOnClick; Button.Text := 'TAB'; Button.Position.X := -10000; Button.Position.Y := -10000; end; //Form OnShow Event CreateTabButton(Self); 

The following code is a procedure which can be used from a global library or TDataModule to provide you with the Enter to Tab functionality. I used the onkeyup events on inputs to test it.

Fix on code
Source Link

The following code is a procedure which can be used from a global library or TDataModule to provide you with the Enter to Tab functionality. I used the onkeyup events on inputs to test it.

procedure HandleEnterAsTab(Form: TForm; Sender: TObject; Key: Word); var TabList: ITabList; CurrentControl, NextControl: IControl; begin if (Key = vkReturn) then begin TabList := Form.GetTabList; CurrentControl := TControl(Sender); NextControl := TabList.FindNextTabStop(CurrentControl, True, False); if (NextControl = nil) then //go to first item if reached end begin NextControl := TabList.GetItem(0); endend;   else   begin  NextControl.SetFocus; end; end; end; 

The following is an example snippet of it's use

procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin HandleEnterAsTab(Form1, Sender, Key); end; 

Obviously you could change the procedure to work differently according to your needs however I have tried to make it as generic as possible by using TComponent and TForm as the container for getting the TabList.

The following code is a procedure which can be used from a global library or TDataModule to provide you with the Enter to Tab functionality. I used the onkeyup events on inputs to test it.

procedure HandleEnterAsTab(Form: TForm; Sender: TObject; Key: Word); var TabList: ITabList; CurrentControl, NextControl: IControl; begin if (Key = vkReturn) then begin TabList := Form.GetTabList; CurrentControl := TControl(Sender); NextControl := TabList.FindNextTabStop(CurrentControl, True, False); if (NextControl = nil) then //go to first item if reached end begin NextControl := TabList.GetItem(0); end   else   begin  NextControl.SetFocus; end; end; end; 

The following is an example snippet of it's use

procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin HandleEnterAsTab(Form1, Sender, Key); end; 

Obviously you could change the procedure to work differently according to your needs however I have tried to make it as generic as possible by using TComponent and TForm as the container for getting the TabList.

The following code is a procedure which can be used from a global library or TDataModule to provide you with the Enter to Tab functionality. I used the onkeyup events on inputs to test it.

procedure HandleEnterAsTab(Form: TForm; Sender: TObject; Key: Word); var TabList: ITabList; CurrentControl, NextControl: IControl; begin if (Key = vkReturn) then begin TabList := Form.GetTabList; CurrentControl := TControl(Sender); NextControl := TabList.FindNextTabStop(CurrentControl, True, False); if (NextControl = nil) then //go to first item if reached end begin NextControl := TabList.GetItem(0); end; NextControl.SetFocus; end; end; 

The following is an example snippet of it's use

procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin HandleEnterAsTab(Form1, Sender, Key); end; 

Obviously you could change the procedure to work differently according to your needs however I have tried to make it as generic as possible by using TComponent and TForm as the container for getting the TabList.

Source Link
Loading