今天我有一个问题很简单,但回答不是那么简单:有没有办法通过标签获取组件?
我有一组帧,在每个帧中我想要聚焦的组件被标记为“1”。标记的组件可以是TEdit,TMemo,TListBox等。
从帧控制器,我想根据帧本身将控制标记为每帧中标记为“1”。 我可以在不知道组件类型或名称的情况下完成此任务吗?
答案 0 :(得分:2)
循环遍历框架的Components[]
列表。 Tag
是TComponent
的公共财产。
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;
我故意没有在内部设置焦点,因为您可能希望为其他目的获得相同的组件。