Delphi TabOrder=0的FireMonkey控件在运行时未聚焦

Delphi TabOrder=0的FireMonkey控件在运行时未聚焦,delphi,firemonkey,tabstop,Delphi,Firemonkey,Tabstop,我在表单上有3个自定义的tRectangle。在创建自定义的tRectangle时,我将CanFocus=True,因此可以聚焦树形角。在FormCreate事件中,我将TabOrder设置为0,第一个tRectangle,第二个tRectangle设置为1,第三个tRectangle设置为2 运行应用程序时,第一个tRectangle,因为它的TabOrder是0,应该获得焦点,但它没有 此外,在切换时,第二个控件获得焦点,然后是第三个控件,此时焦点被卡住。现在,如果按住Shift键进行tab

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

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

此外,在切换时,第二个控件获得焦点,然后是第三个控件,此时焦点被卡住。现在,如果按住
Shift
键进行tab键,第二个控件将获得焦点,直到它到达第一个控件,焦点再次被卡住

如果有人能告诉我为什么
TabOrder
0的控件在运行时没有被关注,为什么tabing没有以循环方式运行,我将不胜感激

代码如下:

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。表单第一次出现时,
TabOrder=0的控件未聚焦

我可以用您的代码和TEdit控件来确认这一点。考虑窗体上的两个编辑控件。在设计器中添加到表单时,添加的第一个表单得到
TabOrder=0
。当窗体第一次显示时,两个窗体都没有焦点。在
选项卡
条目之后,第一个创建的对象接收焦点

FMX.Controls.TControl.TabOrder的帮助中:

TabOrder是当 用户按TAB键。TabOrder值为0的控件无效 窗体首次出现时具有焦点的控件

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

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

Focused := MyRect1;
或者,也许更好:

MyRect1.SetFocus;
在表单
OnCreate()
事件中


2。制表符不是以循环方式运行的

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

由于
构造函数tMyRect.Create()开头的这一行:

所有的矩形都在表单的中心,相互重叠,这样你只能看到最上面的一个。(聚焦控件不会自动移到前面)移除该行并放置矩形装置(
position.X
position.Y
),以便您可以看到当前哪个控件处于聚焦状态

FocusControl:=Self
似乎放错了位置(至少在XE7中是这样),所以我的评论超过了它

通过
tMyRect
控件的选项卡完全按照预期的顺序工作:

MyRect1-MyRect2-MyRect3-MyRect1


然后按相反的顺序按住Shift键。

假设您使用的是上一个问题中的
tMyRect
,您如何指示聚焦矩形?如果您没有使用
tMyRect
请显示可以重现问题的代码。@Tom Brunberg您的权利。我插入了用于处理
OnCanFocus
事件的代码,并且使用
TabOrder
0的
tRectangle
是重点,但是
tabStop
问题仍然存在。有什么提示吗?你真的应该提供一个,所以这只是纯粹的猜测:也许你没有为第一个
TMyRect
设置
TabStop:=True
。当我为您的三个
TMyRect
设置
TabOrder
TabStop
时,tabbing工作正常。如果我在第一个
TMyRect
中离开
TabStop:=False
,则tabbing不会进入该矩形,而是进入1-2-1-2-1…,因此,没有您描述的锁定。@Tom Brunberg抱歉。我的错误。下面是一个示例:对不起,Align:=tAlignLayout.Center;。这是因为在我的应用程序中,表单上已经放置了三个
tlayout
。在Create事件中,我将rects父对象设置为
tLayouts
,以便它们在运行时正确定位在表单上。反过来,
tLayouts
处于
tRectangle
(对不起,我对演示问题有点神经质)。我还确保,只有
MyRect
控件才能接收焦点并响应
Tab
键。为了简单起见,本例仅使用MyRect。问题似乎在于
tRectangle
tlayout
。不知何故,它们与
选项卡
功能相互干扰。是的,确实如此。每个父项都按制表符顺序排列自己的子项。每个
TLayout
都有一个默认的
taborder
,根据它们在表单上的放置顺序。如果每个
TLayOut
只有一个控件(
TMyRect
),则默认情况下它们都将具有
TabOrder=0
,因为它们都有不同的父控件。既然
TMyRect
s具有不同的父级,那么在创建它们时就不需要设置它们的顺序。仅设置
TLayouts
的顺序。我明天再检查一下,没错!我应该注意到的!我非常确定我必须将
TabOrder
设置为
MyRect
控件,以至于我完全忘记了这个规则。问题是,只有当有人指出我们的错误时,我们才会看到它。谢谢我做了必要的修改,并且
选项卡
键工作正常。
Align      := tAlignLayout.Center;