如何在firemonkey控件中更改默认焦点行为

时间:2013-06-20 14:10:38

标签: delphi custom-component firemonkey delphi-xe4 firemonkey-fm3

我创建了一个自定义的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组件教程?考虑造型等。

我已更新了问题

1 个答案:

答案 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;