TabOrder = 0 的 FireMonkey 控件在运行时未获得焦点

FireMonkey control with TabOrder = 0 is not focused at runtime

我在表格上有 3 个自定义 tRectangle。在创建自定义 tRectangle 时,我设置了 CanFocus = True;,因此可以聚焦 tRectangle。在 FormCreate 事件中,我将第一个 tRectangleTabOrder 设置为 0,第二个 tRectangle 设置为 1,第三个 tRectangle 设置为 2。

当 运行 应用程序时,第一个 tRectangle,因为它的 TabOrder 是 0,应该获得焦点,但它没有。

此外,当使用 Tab 键时,第二个控件获得焦点,然后是第三个控件,此时焦点被卡住。现在,如果按下 Shift 键,第二个控件获得焦点,直到到达第一个控件,焦点再次卡住。

如果有人能告诉我为什么带有 TabOrder 0 的控件在运行时不聚焦以及为什么 Tab 键不以循环方式运行,我将不胜感激。

代码如下:

unit frmMyRect;
interface
uses FMX.Controls, FMX.Controls.Presentation, FMX.Forms, FMX.Layouts, 
     FMX.Objects, FMXFMX.StdCtrls, FMX.Types,System.Classes, System.UITypes;
type
  tfrmMyRect =  class (tForm)
     procedure FormCreate (Sender: tObject);
  end;
  tMyRect = class (tRectangle)
    fMyRectLabel : tLabel;
    constructor Create (aOwner : tComponent);
    procedure MyRectClick (Sender: tObject);
    procedure MyRectEnter (Sender: tObject);
    procedure MyRectExit  (Sender: tObject);
    function GetText : string;
    procedure SetText (const aText: string);
    published
      property Text : string read GetText write SetText;
  end;
var formMyRect: tfrmMyRect;
implementation
{$R *.fmx}
var MyRect1 : tMyRect;
    MyRect2 : tMyRect;
    MyRect3 : tMyRect;
procedure tformMyRect.FormCreate (Sender: tObject);
begin
  MyRect1 := tMyRect.Create (Self);
  MyRect1.Parent := frmMyRect;
  MyRect1.TabOrder := 0;
  MyRect1.Text := 'MyRect&1';
  MyRect2 := tMyRect.Create (Self);
  MyRect2.Parent := frmMyRect;
  MyRect2.TabOrder := 1;
  MyRect2.Text := 'MyRect&2';
  MyRect3 := tMyRect.Create (Self);
  MyRect3.Parent := frmMyRect;
  MyRect3.TabOrder := 2;
  MyRect3.Text := 'MyRect&3';
end; { FormCreate }
constructor tMyRect.Create (aOwner: tComponent);
begin
   inherited;
  CanFocus   :=  True;
  Height     :=   23;
  OnClick    :=  MyRectClick;
  OnEnter    :=  MyRectEnter;
  OnExit     :=  MyRectExit;
  TabStop    :=  True;
  Width      :=   80;
  fMyRectLabel := tLabel.Create (Self);
    with fMyRectLabel do begin
           Align          := tAlignLayout.Center;
           FocusControl   :=  Self;
           HitTest        :=  False;
           Parent         :=  Self;
           StyledSettings := [];
           TabStop        :=  False;
            with TextSettings do begin
                 FontColor  := TAlphaColorRec.Blue;
                 WordWrap   :=  False;
                 Font.Style := [TFontStyle.fsBold];
            end;
    end;
  end; { Create }
  procedure ctMyRect.MyRectClick (Sender: tObject);
  begin
    Fill.Color := TAlphaColorRec.Aqua;
  end;
  procedure ctMyRect.MyRectEnter (Sender: TObject);
  begin
    Fill.Color := TAlphaColorRec.Aqua;
  end;
  procedure ctMyRect.MyRectExit (Sender: TObject);
  begin
    Fill.Color := TAlphaColorRec.Beige;
  end;
  end.

1. Control with TabOrder = 0 is not focused when form first appears

我可以用你的代码以及例如TEdit 控件。考虑一个窗体上的两个编辑控件。在设计器中添加到表单时,第一个添加的得到 TabOrder = 0。首次显示表单时,两者都没有焦点。 Tab 条目后,第一个创建的条目获得焦点。

来自 FMX.Controls.TControl.TabOrder 的帮助:

TabOrder is the order in which child controls are visited when the user presses the TAB key. The control with the TabOrder value of 0 is the control that has the focus when the form first appears.

第二句不正确。但是当用户点击 Tab 键时,带有 TabOrder = 0 的控件将第一个获得焦点。

要确保特定控件在包含窗体出现时已经具有焦点,请设置:

Focused := MyRect1;

或者,也许更好:

MyRect1.SetFocus;

在表格 OnCreate() 事件中。


2. Tabbing is not acting in a circular way

尝试您的代码后,我仍然无法重现您声称的问题。也许你只是误判了你所看到的。

因为constructor tMyRect.Create()开头的这一行:

Align      := tAlignLayout.Center;

所有的矩形都在表格的中心彼此重叠,IOW 你只能看到最上面的一个。 (焦点控件不会自动带到前面)删除该行并放置 rects appart(position.Xposition.Y)以便您可以看到当前焦点是哪个。

FocusControl := Self; 行似乎放错了地方(至少在 XE7 中),所以我取消了它的注释。

TAB 通过 tMyRect 控件完全按预期工作,顺序为:

MyRect1 - MyRect2 - MyRect3 - Myrect1 ...

Shift-TAB顺序相反