Delphi TabOrder=0的FireMonkey控件在运行时未聚焦
我在表单上有3个自定义的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
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;