如何引用在运行时而不是在表单设计器中创建的组件?

Dim*_*ats 8 delphi delphi-7

我有一点问题.我试图在Delphi7中创建一个运行时的组件列表,并使用表单的.OnResize事件调整它们的大小但没有用...我无法弄清楚如何做到这一点.

这是我的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  //ExtCtrls
  panel: TPanel;
  memo: TMemo;
  splitter: TSplitter;
  list: TListBox;
begin
  panel := TPanel.Create(Self);
  list := TListBox.Create(Self);
  splitter := TSplitter.Create(Self);
  memo := TMemo.Create(Self);

  with panel do
  begin
    Parent := Form1;
    BevelOuter := bvNone;
    Top := 12;
    Left := 12;
    Height := Form1.Clientheight - 24;
    Width := Form1.Clientwidth - 24;
  end;

  with list do
  begin
    Parent := panel;
    Align := alClient;
    Top := 0;
    Height := panel.Height;
  end;

  with splitter do
  begin
    Parent := panel;
    Top := 0;
    Width := 12;
    Align := alLeft;
  end;

  with memo do
  begin
    Parent := panel;
    Top := 0;
    Left := 0;
    Width := round(panel.Width / 4) * 3;
    Height := panel.Height;
    Align := alLeft;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我是否必须以某种方式注册他们的名字才能在表格活动中使用它们?或者,也许,创建一个类并包含它们?

任何形式的帮助真的很感激!先感谢您.

Dav*_*nan 9

您的变量是创建它们的过程的本地变量,因此当您在该过程之外时,您无法使用这些变量来引用它们.解决方案是使它们成为表单类的字段.

type
  TForm1 = class(TForm)
    procedure FormResize(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    FPanel: TPanel;
    FMemo: TMemo;
    FSplitter: TSplitter;
    FList: TListBox;
  end;
Run Code Online (Sandbox Code Playgroud)

然后您的FormResize事件处理程序可以引用它们.

procedure TForm1.FormResize(Sender: TObject);
begin
  if Assigned(FPanel) then
  begin
    ...
  end;
end;
Run Code Online (Sandbox Code Playgroud)

不要忘记从中删除局部变量,Button1Click而是使用字段.

procedure TForm1.Button1Click(Sender: TObject);
begin
  FPanel := TPanel.Create(Self);
  ...
end;
Run Code Online (Sandbox Code Playgroud)