我创建了一个自定义的Styledcontrol后代,它由3个表示日期(日/月/小时)的TEdit组成,编辑是我的.style文件的一部分
当控件获得焦点时,第一个Edit应该获得焦点。其他编辑不应该通过Tab键获得焦点。他们在样式文件中有tabstop = false。
constructor TPWCalendar.Create(AOwner: TComponent);
Oncanfocus:=FocusEdit;
procedure TPWCalendar.FocusEdit(Sender: TObject; var ACanFocus: Boolean);
begin
ACanFocus:=false;
if Findedits then
if not FDayEdit.isfocused then
FDayEdit.SetFocus;
end;
这是有效的,但是当其中一个孩子Edits聚焦,并且我按Tab键时,会选择第一个创建的自定义控件的第一个编辑。 如何使其具有默认行为并选择下一个控件,就好像它是1个控件一样?(所以无论焦点位于控件的哪个位置 - edit1,edit2或edit3,按下选项卡应该选择下一个控制)。
PS:有没有合适的firemonkey组件教程?考虑造型等。
我已更新了问题
答案 0 :(得分:0)
我已经解决了主要问题。
通过设置私有oncanfocusEvent,选择第一个子节点(FDayEdit)。 然后我覆盖DialogKey,当我的一个孩子聚焦时,主要组件获得焦点(注意这会触发oncanfocusevent)。然后使用inherrited调用默认行为。
thnx slomoto让我朝着正确的方向前进。
PS:FindEdits从styleresource分配Edits,如果失败则返回false。
这是oncanfocusEvent:
procedure TPWCalendar.FocusEdit(Sender: TObject; var ACanFocus: Boolean);
begin
if findedits and ( fDayEdit.IsFocused or FMonthEdit.IsFocused or FYearEdit.IsFocused)
then aCanFocus:=true
else begin
ACanFocus:=false;
if Findedits then
FDayEdit.SetFocus;
end;
end;
然后这是DialogKey事件
procedure TPWCalendar.DialogKey(var Key: Word; Shift: TShiftState);
begin
if key=vktab then
if ischildfocused then begin
self.SetFocus;
inherited;
end;
end;