在 Delphi 中的帧之间进行通信

Communicating between frames in Delphi

我刚开始在 Delphi 中使用 Frames。

Frames 在 FrameBar1 中并且它们都可见。仅供测试,第一个包含一个按钮,第二个框架包含一个编辑。

我想通过单击按钮(这是两个不同框架上的控件)更改编辑中的文本。

帧之间如何通信

如果控件在同一个窗体中,您将采用相同的方式。只需在 Edit 控件前面加上拥有它的 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 和 Frame2 互不了解。让 Frame1 公开一个在单击按钮时触发的事件,然后父 Form 可以为该事件分配一个处理程序并在 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;