gpt4 book ai didi

delphi - 如何更改 firemonkey 控件中的默认焦点行为

转载 作者:行者123 更新时间:2023-12-02 03:33:24 34 4
gpt4 key购买 nike

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

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

这有效,但是当其中一个子编辑获得焦点时,并且我按 Tab 键,将选择第一个创建的自定义控件的第一个编辑。 如何使其具有默认行为并选择下一个控件,就好像它是 1 个控件一样?(因此,无论焦点位于控件的哪个位置 - edit1、edit2 或 edit3,按 Tab 都应选择下一个控件)控制)。

PS:有什么像样的firemonkey组件教程吗?考虑样式等。

我已更新问题

最佳答案

我已经解决了主要问题。

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

感谢 slomoto 为我指明了正确的方向。

PS:FindEdits从样式资源中分配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;

关于delphi - 如何更改 firemonkey 控件中的默认焦点行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17215886/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com