2016-08-09 14 views
1

Delphiでフレームを使用し始めました。フレームの操作(Delphi)

フレームはFrameBar1にあり、両方とも表示されます。テストのためだけに、最初に1つのボタンがあり、2つ目のフレームに1つの編集が含まれています。

ボタンをクリックして編集でテキストを変更したいとします(2つの異なるフレームのコントロール)。

どのようにフレーム間で通信しますか?

+1

フレームは自己完結型であることを意図しています。このようなやりとりを扱うのはその親です。それは可能ではないが、設計によってではない。あなたが1つの場所でフレームを使用するだけなら、それは意味をなさないことに注意してください。フレームは、同じセットのコントロールを何度も再利用することを意図しています。 –

+0

@JerryDodgeフレームには、再利用以外にも多くの利点があります。フレームには親フォーム(分離)に入れたくない複雑なコードを入れることができます。スワッピングなどには最適です。 –

+0

@JohnEasley Trueですが、私は常に埋め込みフォームを使用します。はるかに柔軟性があります。たとえば、フレームにはOnCreate/OnDestroyイベントがありません。 –

答えて

10

コントロールが同じフォームにある場合と同じ方法です。ちょうどそれを所有するFrameオブジェクトを編集コントロールを接頭辞、例えば:

uses 
    Frame1Unit, Frame2Unit; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Frame1 := TFrame1.Create(Self); 
    Frame1.Parent := ...; 
    ... 
    Frame2 := TFrame2.Create(Self); 
    Frame2.Parent := ...; 
    ... 
end; 

uses 
    Frame2Unit; 

procedure TFrame1.Button1Click(Sender: TObject); 
begin 
    Frame2.Edit1.Text := '...'; 
end; 

よりよい設計はFRAME1とフレーム2は、お互いを知らないので、ロジックをカプセル化することです。

uses 
    Frame1Unit, Frame2Unit; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Frame1 := TFrame1.Create(Self); 
    Frame1.Parent := ...; 
    Frame1.OnNewText := Frame1Text; 
    ... 
    Frame2 := TFrame2.Create(Self); 
    Frame2.Parent := ...; 
    ... 
end; 

procedure TForm1.Frame1Text(Sender: TObject; const NewText: string); 
begin 
    Frame2.EditText := NewText; 
end; 

type 
    TFrame1TextEvent = procedure(Sender: TObject; const NewText; string) of object; 

    TFrame1 = class(TFrame) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    public 
    OnNewText: TFrame1TextEvent; 
    end; 

procedure TFrame1.Button1Click(Sender: TObject); 
begin 
    if Assigned(OnNewText) then 
    OnNewText(Self, '...'); 
end; 

:FRAME1は、ボタンがクリックされたときに、それが発火するというイベントを公開して、親フォームがそのイベントにハンドラを割り当て、フレーム2上のテキストを割り当てることができ、例えば持っています

type 
    TFrame2 = class(TFrame) 
    Edit1: TEdit; 
    private 
    function GetEditText: string; 
    procedure SetEditText(const Value: string); 
    public 
    property EditText: string read GetEditText write SetEditText; 
    end; 

function TFrame2.GetEditText: string; 
begin 
    Result := Edit1.Text; 
end; 

procedure TFrame2.SetEditText(const Value: string); 
begin 
    Edit1.Text := Value; 
end; 
関連する問題