Delphi 用图像创建按钮

Delphi create button with image

我在创建带有图像和标签的按钮时遇到问题。 这是我的代码:

Class:

  type
  Folder = class(TButton)
    AName:TLabel;
    AImage:TImage;
    constructor Create(Nme:String;Path:String;Handle:TForm);
  end;

构造函数:

constructor Folder.Create(Nme:String;Path:String;Handle:TForm);
begin
  AImage:=Timage.Create(Self);
  AName:=TLabel.Create(Self);
  AImage.Parent:=Self;
  AName.Parent:=Self;
  AName.Caption:=Nme;
  AImage.Picture.LoadFromFile(Path);
end;`

以及我创建此按钮的事件:

procedure TForm3.Button1Click(Sender: TObject);
  var Fld:Folder;
  begin
  Fld:=Folder.Create('It','D:\image.bmp',Form3);
  Fld.Parent:=Form3;
  Fld.Width:=100;
  Fld.Height:=100;
end;

但是当我创建这个按钮时它会导致访问冲突!我必须如何处理它?

问题:

问题是您已经声明了构造函数的自定义版本,但您没有调用 TButton class.

的父构造函数

您需要像这样更改构造函数:

constructor Folder.Create(Nme: String; Path: String; Handle: TForm);
begin
  inherited Create(Handle);     // <- Add this line
  AImage := TImage.Create(Self);
  AName := TLabel.Create(Self);
  AImage.Parent := Self;
  AName.Parent := Self;
  AName.Caption := Nme;
  AImage.Picture.LoadFromFile(Path);
end;

一般建议:

您需要学习如何自己调试此类问题。

Fld:=Folder.Create('It','D:\image.bmp',Form3);行下断点,然后使用Step Over F8 / Trace Into F7Run 菜单逐行检查您的代码。

您将看到,一旦到达行 AImage.Parent:=Self;,就会发生异常。这是因为指向您的 Folder 对象的 Self 未正确初始化,并且不是正确的 TButton 后代。

你需要学习如何做才能在 Delphi 上取得进一步的进步,你很快就能自己解决这些问题。


此外,如果您需要为 Delphi 编写自定义组件,请花一些时间了解更多有关组件工作和使用方式的信息。我会推荐以下组件编写指南:


另请参阅 Delphi Coding Style 上的指南。

乍一看:

  • Class 名称应以 T
  • 开头
  • Class 字段应以 F 开头,而不是 A
  • constructor 应该在 public 部分,字段在 privateprotected
  • 您应该在参数周围、声明中的变量之后和运算符周围使用空格