use*_*107 1 delphi class delphi-xe7
我在创建带有图像和标签的按钮时遇到问题.这是我的代码:
类:
type
Folder = class(TButton)
AName:TLabel;
AImage:TImage;
constructor Create(Nme:String;Path:String;Handle:TForm);
end;
Run Code Online (Sandbox Code Playgroud)
构造函数:
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;`
Run Code Online (Sandbox Code Playgroud)
我创建此按钮的事件:
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;
Run Code Online (Sandbox Code Playgroud)
但是当我创建这个按钮时,它会导致违规行为!我必须做些什么呢?
问题是您已经声明了构造函数的自定义版本,但您没有调用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;
Run Code Online (Sandbox Code Playgroud)
您需要自己学习如何调试此类问题.
在线上放置一个断点Fld:=Folder.Create('It','D:\image.bmp',Form3);并使用Step Over F8/ Trace Into F7从Run菜单中逐行检查您的代码.
您将看到一旦到达该行AImage.Parent:=Self;,就会发生异常.这是因为Self,指向您的Folder对象,未正确初始化,并且不是适当的TButton后代.
您需要学习如何使用Delphi进一步学习,并且您很快就能够自己解决这些问题.
此外,如果您需要为Delphi编写自定义组件,请花些时间了解有关组件工作和使用方式的更多信息.我会推荐以下有关组件编写的指南:
另请参阅Delphi编码风格指南.
乍一看:
TF而不是开头Aconstructor应该在公共部门和领域private或protected