I had the same issue in my application, so I wrote a workaround:
http://andydunkel.net/delphi/coding/2013/11/23/firemonkey_xe_4_taborder_workaround.html
I am using a FormHelper class, the key down method of the Form (reacts to the Tab Key) and the help context property of the controls.
First I was setting the help context, you can use the tag for example too. But I am already using the tag property for something else:
unit FormHelper;
interface
type
TFormHelper = class helper for TForm
procedure DoTabHandlingXE(comp : TForm; tabOrder : Integer);
end;
implementation
//Workaround for Tab-Bug in Firemonkey
procedure TFormHelper.DoTabHandlingXE(comp: TForm; tabOrder : Integer);
var
i, c :integer;
current : TComponent;
currentNext : integer;
focus : TStyledControl;
begin
c := Self.ComponentCount - 1;
currentNext := 9999;
focus := nil;
for i := 0 to c do begin
current := Self.Components[i];
if (current is TStyledControl) then begin
if ((current as TStyledControl).HelpContext < currentNext) and
((current as TStyledControl).HelpContext > tabOrder) then begin
currentNext := (current as TStyledControl).HelpContext;
end;
end;
end;
for i := 0 to c do begin
current := Self.Components[i];
if (current is TStyledControl) then begin
if (currentNext = (current as TStyledControl).HelpContext) then begin
focus := (current as TStyledControl);
end;
end;
end;
if focus <> nil then begin
focus.SetFocus;
end;
end;
end.
Of course the code does nothing to far, since the method is not called yet. So the next step is to implement the KeyDown event in the form:
procedure TfrmEinzField.KeyDown(var Key: Word; var KeyChar: Char;
Shift: TShiftState);
var
control : TStyledControl;
begin
if Key = vkTab then
begin
//custom handling
if (Self.GetFocused is TStyledControl) then begin
control := (Self.GetFocused as TStyledControl);
DoTabHandlingXE(Self, control.HelpContext);
end;
end else
inherited; //do default handling
end;
In the code, we get the currently focused control. Then we call the method we wrote before with the current Form variable and the controls HelpContext value. With that workaround the tab key is now working as expected, jumping to the next control.
More details are in the blog post.