Delphi从其标记获取组件

Delphi从其标记获取组件,delphi,focus,components,Delphi,Focus,Components,今天我有一个简单的问题要问,但回答起来却不那么简单:有没有一种方法可以通过标签来获取组件 我有一组帧,其中每个帧中我想聚焦的组件都标记为“1”。标记的组件可以是TEdit、TMemo、TListBox等 从帧控制器中,我想根据帧本身在每个帧中聚焦标记为“1”的控件。 我可以在不知道组件类型或名称的情况下完成此任务吗?这应该可以得到您的组件-您可以在之后使用它(设置焦点等)执行您想要的操作-假设它不是零 function TFrameController.GetMainControlForFram

今天我有一个简单的问题要问,但回答起来却不那么简单:有没有一种方法可以通过标签来获取组件

我有一组帧,其中每个帧中我想聚焦的组件都标记为“1”。标记的组件可以是TEdit、TMemo、TListBox等

从帧控制器中,我想根据帧本身在每个帧中聚焦标记为“1”的控件。
我可以在不知道组件类型或名称的情况下完成此任务吗?

这应该可以得到您的组件-您可以在之后使用它(设置焦点等)执行您想要的操作-假设它不是零

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
时,它是否会自动聚焦控件?在控件上迭代,直到找到具有所需属性的控件。