Delphi创建带图像的按钮

时间:2016-03-05 09:41:08

标签: class delphi delphi-xe7

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

类别:

  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;

但是当我创建这个按钮时会导致违规行为!我必须要做些什么?

1 个答案:

答案 0 :(得分:9)

问题:

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

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

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菜单中的Trace Into F8 / Run F7 逐行检查您的代码。

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

你需要学习如何使用Delphi进一步发展,你很快就能自己解决这些问题。

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

  

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

乍一看:

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