TabOrder = 0 的 FireMonkey 控件在运行时未获得焦点
FireMonkey control with TabOrder = 0 is not focused at runtime
我在表格上有 3 个自定义 tRectangle
。在创建自定义 tRectangle
时,我设置了 CanFocus = True;
,因此可以聚焦 tRectangle
。在 FormCreate
事件中,我将第一个 tRectangle
的 TabOrder
设置为 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.X
和 position.Y
)以便您可以看到当前焦点是哪个。
FocusControl := Self;
行似乎放错了地方(至少在 XE7 中),所以我取消了它的注释。
TAB 通过 tMyRect
控件完全按预期工作,顺序为:
MyRect1 - MyRect2 - MyRect3 - Myrect1 ...
和Shift-TAB顺序相反
我在表格上有 3 个自定义 tRectangle
。在创建自定义 tRectangle
时,我设置了 CanFocus = True;
,因此可以聚焦 tRectangle
。在 FormCreate
事件中,我将第一个 tRectangle
的 TabOrder
设置为 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.X
和 position.Y
)以便您可以看到当前焦点是哪个。
FocusControl := Self;
行似乎放错了地方(至少在 XE7 中),所以我取消了它的注释。
TAB 通过 tMyRect
控件完全按预期工作,顺序为:
MyRect1 - MyRect2 - MyRect3 - Myrect1 ...
和Shift-TAB顺序相反