2016-08-09 4 views
1

Я только начал использовать фреймы в Delphi.Работа с рамками (Delphi)

Эти рамки находятся в FrameBar1, и оба они видны. Только для тестирования, сначала один содержит одну кнопку, а второй кадр содержит одно редактирование.

Я хочу изменить текст в Редакторе с помощью кнопки «Кнопка» (элементы управления на двух разных кадрах).

Как связаться между рамами?

+1

Рамки предназначены для автономного использования. Это их родитель, предназначенный для такого взаимодействия. Не то чтобы это невозможно, но не по дизайну. Имейте в виду, если вы собираетесь использовать рамку только в одном месте, это не имеет смысла. Рамки предназначены для повторного использования одного и того же набора элементов управления несколько раз. –

+0

Рамы @JerryDodge имеют много преимуществ, кроме повторного использования. Фреймы могут содержать сложный код, который вы не хотите включать в родительскую форму (разделение), отлично подходит для обмена и т. Д. –

+0

@JohnEasley Правда, но я всегда использую встроенные формы для этого. Гораздо более гибкий. Например, фреймы не имеют события OnCreate/OnDestroy. –

ответ

10

Точно так же, как если бы элементы управления находились в одной и той же форме. Просто префикс управления Edit с объектом кадра, которому принадлежит это, например:

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 и frame2 не знают друг о друге. Есть Frame1 выставить событие, которое он срабатывает при нажатии на кнопку, а затем родительская форма может назначить обработчик этого события и присвоить текст на frame2, например:

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; 

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; 
Смежные вопросы