Delphi从其标记获取组件
今天我有一个简单的问题要问,但回答起来却不那么简单:有没有一种方法可以通过标签来获取组件 我有一组帧,其中每个帧中我想聚焦的组件都标记为“1”。标记的组件可以是TEdit、TMemo、TListBox等 从帧控制器中,我想根据帧本身在每个帧中聚焦标记为“1”的控件。Delphi从其标记获取组件,delphi,focus,components,Delphi,Focus,Components,今天我有一个简单的问题要问,但回答起来却不那么简单:有没有一种方法可以通过标签来获取组件 我有一组帧,其中每个帧中我想聚焦的组件都标记为“1”。标记的组件可以是TEdit、TMemo、TListBox等 从帧控制器中,我想根据帧本身在每个帧中聚焦标记为“1”的控件。 我可以在不知道组件类型或名称的情况下完成此任务吗?这应该可以得到您的组件-您可以在之后使用它(设置焦点等)执行您想要的操作-假设它不是零 function TFrameController.GetMainControlForFram
我可以在不知道组件类型或名称的情况下完成此任务吗?这应该可以得到您的组件-您可以在之后使用它(设置焦点等)执行您想要的操作-假设它不是零
function TFrameController.GetMainControlForFrame( const pFrame : TFrame ) : TComponent;
begin
for Result in pFrame do
begin
if Result.Tag = 1 then
begin
exit;
end;
end;
// else
Result := nil;
end;
我故意没有在内部设置焦点,因为您可能希望获得用于其他目的的相同组件。这应该得到您的组件-您可以在之后使用它(设置焦点等)执行您想要的操作-假设它不是零
function TFrameController.GetMainControlForFrame( const pFrame : TFrame ) : TComponent;
begin
for Result in pFrame do
begin
if Result.Tag = 1 then
begin
exit;
end;
end;
// else
Result := nil;
end;
我故意没有在内部设置焦点,因为您可能希望获得用于其他目的的相同组件。循环查看框架的
组件[]
列表<代码>标记是t组件
的公共属性
var
Comp: TComponent;
I: Integer;
begin
for i := 0 to frame.ComponentCount-1 do
begin
Comp := frame.Components[i];
if Comp.Tag = 1 then
begin
(Comp as TWinControl).SetFocus;
break;
end;
end;
end;
另一种方法是定义每个框架实现的接口
,让它直接返回/操作所需的组件,而不必搜索它:
type
ITaggedComponent = interface
['{e5cfb88e-8c5d-4898-a008-742dd8d86698}']
function GetTaggedComponent: TComponent;
procedure FocusTaggedComponent;
property TaggedComponent: TComponent read GetTaggedComponent;
end;
然后你可以这样做:
var
Intf: ITaggedComponent;
begin
if Supports(frame, ITaggedComponent, Intf) then
Intf.FocusTaggedComponent;
end;
循环浏览框架的
组件[]
列表<代码>标记是t组件
的公共属性
var
Comp: TComponent;
I: Integer;
begin
for i := 0 to frame.ComponentCount-1 do
begin
Comp := frame.Components[i];
if Comp.Tag = 1 then
begin
(Comp as TWinControl).SetFocus;
break;
end;
end;
end;
另一种方法是定义每个框架实现的接口
,让它直接返回/操作所需的组件,而不必搜索它:
type
ITaggedComponent = interface
['{e5cfb88e-8c5d-4898-a008-742dd8d86698}']
function GetTaggedComponent: TComponent;
procedure FocusTaggedComponent;
property TaggedComponent: TComponent read GetTaggedComponent;
end;
然后你可以这样做:
var
Intf: ITaggedComponent;
begin
if Supports(frame, ITaggedComponent, Intf) then
Intf.FocusTaggedComponent;
end;
为什么在框架中设置选项卡顺序是不够的?当
TabOrder
设置为0
时,它不会自动聚焦控件吗?在控件上迭代,直到找到具有所需属性的控件。为什么在框架中设置选项卡顺序是不够的?当TabOrder
设置为0
时,它是否会自动聚焦控件?在控件上迭代,直到找到具有所需属性的控件。