ループをフレームの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;
フレームのタブ順序を十分に設定できないのはなぜですか? 'TabOrder'が' 0'に設定されているコントロールに自動的にフォーカスを当てるのではないのですか? – mghie
目的のプロパティを持つものが見つかるまで、コントロールを反復処理します。 –