2016-10-12 13 views
0

今日私は質問するのは簡単ですが、それほど単純ではない質問があります。タグでコンポーネントを取得する方法はありますか?Delphiはタグからコンポーネントを取得します

私はフレームのグループを持っていて、それぞれに焦点を当てたいコンポーネントには「1」とタグ付けされています。タグ付きコンポーネントは、TEdit、TMemo、TListBoxなどであってもよい。

フレームコントローラからは、フレーム自体に応じて各フレームに「1」というタグ付きのコントロールをフォーカスしたいと思います。 コンポーネントのタイプや名前を知らなくてもこのタスクを実行できますか?

+1

フレームのタブ順序を十分に設定できないのはなぜですか? 'TabOrder'が' 0'に設定されているコントロールに自動的にフォーカスを当てるのではないのですか? – mghie

+0

目的のプロパティを持つものが見つかるまで、コントロールを反復処理します。 –

答えて

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; 

されていないと仮定他の目的のために同じコンポーネントを取得する。

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; 
関連する問題