Delphi从其标签中获取组件

时间:2016-10-12 06:55:47

标签: delphi focus components

今天我有一个问题很简单,但回答不是那么简单:有没有办法通过标签获取组件?

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

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

2 个答案:

答案 0 :(得分:2)

循环遍历框架的Components[]列表。 TagTComponent的公共财产。

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;

另一种方法是定义每个框架实现的interface,并让它直接返回/操作所需的组件而不必寻找它:

type
  ITaggedComponent = interface
    ['{e5cfb88e-8c5d-4898-a008-742dd8d86698}']
    function GetTaggedComponent: TComponent;
    procedure FocusTaggedComponent;
    property TaggedComponent: TComponent read GetTaggedComponent;
  end;

type
  TFrame1 = class(TFrame, ITaggedComponent)
    Edit1: TEdit;
    ...
  public
    function GetTaggedComponent: TComponent;
    procedure FocusTaggedComponent;
  end;

  TFrame2 = class(TFrame, ITaggedComponent)
    Memo1: TMemo;
    ...
  public
    function GetTaggedComponent: TComponent;
    procedure FocusTaggedComponent;
  end;

  TFrame3 = class(TFrame, ITaggedComponent)
    ListBox1: TListBox;
    ...
  public
    function GetTaggedComponent: TComponent;
    procedure FocusTaggedComponent;
  end;

...

function TFrame1.GetTaggedComponent: TComponent;
begin
  Result := Edit1;
end;

procedure TFrame1.FocusTaggedComponent;
begin
  Edit1.SetFocus;
end;

function TFrame2.GetTaggedComponent: TComponent;
begin
  Result := Memo1;
end;

procedure TFrame2.FocusTaggedComponent;
begin
  Memo1.SetFocus;
end;

function TFrame3.GetTaggedComponent: TComponent;
begin
  Result := ListBox1;
end;

procedure TFrame3.FocusTaggedComponent;
begin
  ListBox1.SetFocus;
end;

...

然后你可以这样做:

var
  Intf: ITaggedComponent;
begin
  if Supports(frame, ITaggedComponent, Intf) then
    Intf.FocusTaggedComponent;
end;

答案 1 :(得分:0)

这应该得到你的组件 - 你可以随后做它你想做的事情(设置焦点等) - 假设它不是零

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;

我故意没有在内部设置焦点,因为您可能希望为其他目的获得相同的组件。