关于类的复制

Open2ye 2005-08-03 04:58:08
我现在写了这样一个函数
function TForm1.Cratebt(s: string): TButton;
var
tbt:TButton;
begin
tbt:=TButton.Create(nil);
try
tbt.Caption:=s;
tbt.Top:=100;
tbt.Left:=100;
Result:=tbt;
finally
tbt.Free;
end;
end;
________________
我用以下代码来生成按钮
var
bt2:TButton;
begin
bt2:=TButton.Create(Self);
bt2:=Cratebt('a');
bt2.Parent :=form1;
end;
问题1 Cratebt生成的函数 不能在 finaly里 free 如果 free 后,返回的值就不对了。应该在什么地方free 呢

问题2 就算返回了但是   bt2:=Cratebt('a') 只是把指针给bt2 不是复制出一个新的指针,
我查了书,书上说利用一个抽象类——TPersistent的AssignTo方法就行了。可是我不知道怎么用。
谢谢



...全文
326 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wizardqi 2005-08-08
  • 打赏
  • 举报
回复
晕到。。。其实问题很简单,现给个过程如下:
function TForm1.Createbt(s: String): TButton;
begin
Result:=TButton.Create(Self);
with Result do
begin
Caption:=s;
Top:=100;
Left:=100;
Parent:=Self;
end;
end;
用如下方法调用(你的过程中多创建了次):
var
bt2:TButton;
begin
bt2:=Cratebt('a');
end;

Open2ye 2005-08-08
  • 打赏
  • 举报
回复
up
Open2ye 2005-08-05
  • 打赏
  • 举报
回复
楼上的同志们误会了,可能是我没说清什么意思。
function TForm1.Cratebt(s: string): TButton;
var
tbt:TButton;
begin
tbt:=TButton.Create(nil);
try
tbt.Caption:=s;
tbt.Top:=100;
tbt.Left:=100;
Result:=tbt;
finally
tbt.Free;
end;
end;

这个函数 我知道不 free 就对了,可是不释放对于这个函数是失败的,只有创建,没有释放。
MFC里可以有这样的临时变量,过一段时间系统会自动释放。delphi 里应该用什么方法。

还有
var
bt2:TButton;
begin
bt2:=TButton.Create(Self);
bt2:=Cratebt('a');
bt2.Parent :=form1;
end;

这段代码只是我举个例子来说明白这段问题啦
xthmpro_cn 2005-08-03
  • 打赏
  • 举报
回复
郑重地告诉搂主:
如果类创建是:Create(AObject),只要AObject是有效的对象,则AObject释放时,你创建的对象也会自动释放。如果是:Create(nil),则需要自己手工释放创建的对象。
cdsgajxlp 2005-08-03
  • 打赏
  • 举报
回复

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
List : TList;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
List:=TList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
button : Tbutton;
begin
button:=Tbutton.Create(self);
button.Parent:=self;
button.Left:=100;
button.Top:=100;
List.Add(button);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if List.Count>0 then
Tbutton(List.Items[0]).free;

end;

end.
cdsgajxlp 2005-08-03
  • 打赏
  • 举报
回复
最好的办法是建一琏,想什么释放就什么时候释放
如果不释放,就交个delphi去干,如

function TForm1.Cratebt(s: string): TButton;
var
tbt:TButton;
begin
tbt:=TButton.Create(self); ////////////////////////
try
tbt.Caption:=s;
tbt.Top:=100;
tbt.Left:=100;
Result:=tbt;
finally
//tbt.Free;
end;
end;
LocustWei 2005-08-03
  • 打赏
  • 举报
回复
function TForm1.Cratebt(s: string): TButton;
var
tbt:TButton;
begin
tbt:=TButton.Create(self); ////////////////////////
try
tbt.Caption:=s;
tbt.Top:=100;
tbt.Left:=100;
Result:=tbt;
finally
//tbt.Free;
end;
end;
GoldProgramer 2005-08-03
  • 打赏
  • 举报
回复
var
bt2:TButton;
begin
bt2:=TButton.Create(Self);
bt2:=Cratebt('a');
bt2.Parent :=form1;
end;

如果我是老师,我的学生写出这样的代码,直接给0分。
winxkm 2005-08-03
  • 打赏
  • 举报
回复
不好意思!可以直接用
var
bt2:TButton;
begin
bt2:=Cratebt('a');
bt2.Parent :=form1;
end;
winxkm 2005-08-03
  • 打赏
  • 举报
回复
创建按钮时就不会促错了
var
bt2:TButton;
begin
bt2:=TButton.Create(Self);
bt2.Assign(Cratebt('a'));
bt2.Parent :=form1;
end;
winxkm 2005-08-03
  • 打赏
  • 举报
回复
你的代码有问题!
var
bt2:TButton;
begin
bt2:=TButton.Create(Self); //你已经创建了一个button按钮!
bt2:=Cratebt('a'); //bt2被重新指向了,并且在finally中将此对象销毁!所以报错!
bt2.Parent :=form1;
end;
函数这样写
function TForm1.Cratebt(s: string): TButton;
var
tbt:TButton;
begin
try
tbt:=TButton.Create(nil);
tbt.Caption:=s;
tbt.name:=s;
tbt.Top:=100;
tbt.Left:=100;
Result:=tbt;
except
showmessage('error!');
end;
end;
创建按钮时就不会促错了
var
bt2:TButton;
begin
bt2:=TButton.Create(Self);
bt2:=Cratebt('a');
bt2.Parent :=form1;
end;

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧