gpt4 book ai didi

Delphi - 无法引用在运行时创建的对象

转载 作者:行者123 更新时间:2023-12-03 19:00:03 25 4
gpt4 key购买 nike

我正在使用 Delphi 7。我已经编写了一些代码来在运行时创建按钮(我需要在每个表单的完全相同的位置有很多完全相同的按钮,这就是我决定这样做的原因)。但是我在程序中引用它们时遇到了麻烦(准确地说是 OnClick)。我希望在单击按钮时打开另一个表单。

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;

procedure buttons(a: TForm);

type
TForm2 = class(TForm)
Image1: TImage;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2; Button1, Button2, Button3, Button4: TButton;

implementation

uses Unit3, Unit4;

{$R *.dfm}

procedure buttons(a: TForm);
begin
Button1 := TButton.Create(a);
Button1.Name := 'Button1';
Button1.Left := 712;
Button1.Top := 96;
Button1.Width := 81;
Button1.Height := 41;
Button1.Visible := True;
Button1.Parent := a;
Button1.Enabled := False;
Button1.Caption := 'Go forwards';
Button2 := TButton.Create(a);
Button2.Name := 'Button2';
Button2.Left := 800;
Button2.Top := 152;
Button2.Width := 81;
Button2.Height := 41;
Button2.Visible := True;
Button2.Parent := a;
Button2.Enabled := False;
Button2.Caption := 'Go right';
Button3 := TButton.Create(a);
Button3.Name := 'Button3';
Button3.Left := 624;
Button3.Top := 152;
Button3.Width := 81;
Button3.Height := 41;
Button3.Visible := True;
Button3.Parent := a;
Button3.Enabled := False;
Button3.Caption := 'Go left';
Button4 := TButton.Create(a);
Button4.Name := 'Button4';
Button4.Left := 712;
Button4.Top := 208;
Button4.Width := 81;
Button4.Height := 41;
Button4.Visible := True;
Button4.Parent := a;
Button4.Enabled := False;
Button4.Caption := 'Go back';
end;


procedure TForm2.FormShow(Sender: TObject);
begin
buttons(Form2);
Button1.Enabled := True;
Button2.Enabled := True;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
Form3.Show;
Form2.Hide;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
Form4.Show;
Form2.Hide;
end;

end.

我已经将 OnClicks 声明为“类型”,我可能应该这样做。程序运行,但创建的按钮不起作用,尽管是可点击的。想法?

P.S.:我知道我本可以编写更紧凑的代码来创建所有这些按钮,但我没有时间考虑它,而且几乎没有意义。我知道它可能很难阅读——你需要知道的是,我在每个按钮上设置了相同类型的属性——你只需要查看 Button1,其他的都是相同的。

P.P.S.:这不是一个重复的问题: Delphi - Referencing Components created at Runtime .我无法找到解决我的问题的方法。

最佳答案

首先,您应该稍微清理一下您的代码。但这不是您的代码不起作用的原因。这是因为您忘记将 OnClick 事件分配给您的按钮:

看看这个:

unit Unit19;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm19 = class(TForm)
procedure FormCreate(Sender: TObject);
private
Button1: TButton;
Button2: TButton;
Procedure CreateButtons;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
public
{ Public declarations }
end;

var
Form19: TForm19;

implementation

{$R *.dfm}

procedure TForm19.Button1Click(Sender: TObject);
begin
Caption := 'Button1 Clicked';
end;

procedure TForm19.Button2Click(Sender: TObject);
begin
Caption := 'Button2 Clicked';
end;

procedure TForm19.CreateButtons;
begin
Button1 := TButton.Create(Self);
Button1.Name := 'Button1';
Button1.Left := 712;
Button1.Top := 96;
Button1.Width := 81;
Button1.Height := 41;
Button1.Visible := True;
Button1.Parent := Self;
Button1.Enabled := False;
Button1.OnClick := Button1Click;

Button1.Caption := 'Go forwards';
Button2 := TButton.Create(Self);
Button2.Name := 'Button2';
Button2.Left := 800;
Button2.Top := 152;
Button2.Width := 81;
Button2.Height := 41;
Button2.Visible := True;
Button2.Parent := Self;
Button2.Enabled := False;
Button2.Caption := 'Go right';
Button2.OnClick := Button2Click;
end;

procedure TForm19.FormCreate(Sender: TObject);
begin
CreateButtons;
end;

end.

首先是清理:我已将您的按钮声明移至拥有它们的表单的私有(private)部分。

关于按钮的所有者,构造函数的参数;应该是表格。因为当您销毁表单时,它也会销毁您的按钮,并且不会泄漏任何内存。

然后缺少 OnClick用这一行解决的事件:
Button1.OnClick := Button1Click;

我只是告诉按钮当用户单击按钮时要调用哪个过程。

我希望这能回答你的问题。

关于Delphi - 无法引用在运行时创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30012371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com