2

我创建了一个自定义 Styledcontrol 后代,它由代表日期(日/月/小时)的 3 个 TEdit 组成,编辑是我的 .style 文件的一部分

当控件获得焦点时,第一个 Edit 应该获得焦点。其他编辑永远不应该通过标签获得焦点。他们在样式文件中有 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;

这可行,但是当其中一个子编辑被聚焦时,我按下选项卡,第一个创建的自定义控件的第一个编辑被选中。如何使其具有默认行为并选择下一个控件,就好像它是 1 个控件一样?(所以无论焦点在控件的哪个位置 - edit1、edit2 或 edit3,按 Tab 应该选择下一个控件)。

PS:有没有像样的firemonkey组件教程?考虑造型等

我已经更新了问题

4

1 回答 1

0

我已经解决了主要问题。

通过设置一个私有的 oncanfocusEvent,第一个孩子(FDayEdit)被选中。然后我覆盖DialogKey,当我的一个孩子集中注意力时,主要组件获得焦点(注意这会触发oncanfocusevent)。然后使用继承调用默认行为。

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;
于 2013-06-26T09:29:16.367 回答