Delphi-在运行时创建引用对象时遇到麻烦

选择器

我使用的是Delphi7。我编写了一些代码来在运行时创建按钮(我需要在每个表单的完全相同的位置上放置许多完全相同的按钮,这就是为什么我决定这样做的原因)。但是我在过程(准确地说是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声明为“类型”。该程序会运行,但是创建的按钮无法工作,尽管可以单击。有想法吗?

PS:我知道我可以编写更紧凑的代码来创建所有这些按钮,但是我没有时间去思考,这很重要。我知道可能很难读-您需要知道的是,我在每个按钮上设置了相同种类的属性-您只需要查看Button1,其他都相同。

PPS:这不是一个重复的问题:Delphi-引用在运行时创建的组件在那个问题上,我找不到解决方案。

詹斯·鲍里斯霍尔特(Jens Borrisholt)

首先,您应该清理一下代码。但这不是为什么您的代码无法正常工作的原因。这是因为您忘记为按钮分配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.

首先清理:我已经将按钮的声明移到了拥有它们的表单的私有部分。

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

然后OnClick用此行解决的丢失事件:

Button1.OnClick := Button1Click;

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在运行时创建的对象上的双击事件-Delphi

来自分类Dev

Delphi:在运行时以动态创建的形式创建TComboBox

来自分类Dev

Delphi Firemonkey 在运行时创建 TExpanders 和 TLabels

来自分类Dev

Delphi 创建 dxTileBarItem 运行时

来自分类Dev

在运行时在Delphi中从数据库表创建按钮

来自分类Dev

从字符串在运行时创建Delphi Firemonkey组件

来自分类Dev

Delphi 和高 DPI:在运行时创建的控件获得错误的位置

来自分类Dev

Delphi / Firemonkey在运行时更改iOS屏幕旋转

来自分类Dev

Delphi在运行时重建模式形式

来自分类Dev

如何在运行时在Delphi中创建自定义属性并将其附加到字段

来自分类Dev

Delphi是否需要运行时库?

来自分类Dev

确定运行时的项目(Delphi Seattle)

来自分类Dev

Delphi XE7 BDE Alias-是否在运行时设置?

来自分类Dev

我该如何存储可以在运行时在Delphi中更改的文件路径

来自分类Dev

Delphi:如何在运行时构建的TVarRec数组中使用Format()?

来自分类Dev

Delphi XE2在运行时不考虑组件属性

来自分类Dev

在运行时创建Command对象

来自分类Dev

在运行时创建对象?

来自分类Dev

如何使Singleton在Delphi的运行时和设计时工作

来自分类Dev

Delphi Firemonkey-运行时加载样式

来自分类Dev

应用运行时的Delphi Apple Push Notification

来自分类Dev

在应用程序运行时更改Delphi主窗体

来自分类Dev

0040423F的Delphi运行时错误105

来自分类Dev

Delphi-在运行时动态添加所有字段,在数据集中生成重复项

来自分类Dev

在运行时从Delphi TDBGrid后代显示DBGrid之前,如何以编程方式更改TColumn属性?

来自分类Dev

设置文本对齐方式listboxitem Delphi XE5 FM在运行时不起作用

来自分类Dev

Delphi 2007-是否有可能在运行时获取被忽略的异常类的列表?

来自分类Dev

Delphi引用程序异常

来自分类Dev

在Delphi中创建可访问的UI组件时遇到的问题

Related 相关文章

  1. 1

    在运行时创建的对象上的双击事件-Delphi

  2. 2

    Delphi:在运行时以动态创建的形式创建TComboBox

  3. 3

    Delphi Firemonkey 在运行时创建 TExpanders 和 TLabels

  4. 4

    Delphi 创建 dxTileBarItem 运行时

  5. 5

    在运行时在Delphi中从数据库表创建按钮

  6. 6

    从字符串在运行时创建Delphi Firemonkey组件

  7. 7

    Delphi 和高 DPI:在运行时创建的控件获得错误的位置

  8. 8

    Delphi / Firemonkey在运行时更改iOS屏幕旋转

  9. 9

    Delphi在运行时重建模式形式

  10. 10

    如何在运行时在Delphi中创建自定义属性并将其附加到字段

  11. 11

    Delphi是否需要运行时库?

  12. 12

    确定运行时的项目(Delphi Seattle)

  13. 13

    Delphi XE7 BDE Alias-是否在运行时设置?

  14. 14

    我该如何存储可以在运行时在Delphi中更改的文件路径

  15. 15

    Delphi:如何在运行时构建的TVarRec数组中使用Format()?

  16. 16

    Delphi XE2在运行时不考虑组件属性

  17. 17

    在运行时创建Command对象

  18. 18

    在运行时创建对象?

  19. 19

    如何使Singleton在Delphi的运行时和设计时工作

  20. 20

    Delphi Firemonkey-运行时加载样式

  21. 21

    应用运行时的Delphi Apple Push Notification

  22. 22

    在应用程序运行时更改Delphi主窗体

  23. 23

    0040423F的Delphi运行时错误105

  24. 24

    Delphi-在运行时动态添加所有字段,在数据集中生成重复项

  25. 25

    在运行时从Delphi TDBGrid后代显示DBGrid之前,如何以编程方式更改TColumn属性?

  26. 26

    设置文本对齐方式listboxitem Delphi XE5 FM在运行时不起作用

  27. 27

    Delphi 2007-是否有可能在运行时获取被忽略的异常类的列表?

  28. 28

    Delphi引用程序异常

  29. 29

    在Delphi中创建可访问的UI组件时遇到的问题

热门标签

归档