绝对很少见的问题

taonyqian2022 2011-09-12 04:20:23
function aaa():TBitmap ;
VAR
B:tBITMAP;
begin
B:=TBitmap.Create;
try
B.loadfromfile('1.BMP');
Result:=B;
finally
B.FREE;
end;

end;
procedure TForm3.Button1Click(Sender: TObject);
var
t:TBitmap;
begin
t:=TBitmap.Create;
try
t:=aaa;
t.SaveToFile('2.bmp');
finally
t.Free;
end;
我只想说明的是一个问题, 类是不是不能在函数(function)中引用,
以上我只举了一个简单例子 实际我遇到的是 凡是函数中的类.create 我都会弹出 什么invalid point operate
除了这个问题 我还希望Active DLL中的自定义函数 也可以直接引用类

请高手回答,菜鸟走开
我的邮箱city008@163.com
谢谢啦

...全文
282 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinhx 2011-09-16
  • 打赏
  • 举报
回复
能用assign的都用,按一下 . 就知道了
cntigercat 2011-09-16
  • 打赏
  • 举报
回复
观看中。。。
看那山瞧那水 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jinhx 的回复:]

Result:=B;

应改为
Result.assign(B);

因为tbitmap是对象类
:= 只会传指针(或是内存地址,这两个我总搞不清)
assign 则是传实际内容
[/Quote]

有没人总结下,哪些类":="操作等于"Assign"
我只知道一个:TStrings类的Items的":="操作等于"Assign"
jinhx 2011-09-16
  • 打赏
  • 举报
回复
Result:=B;

应改为
Result.assign(B);

因为tbitmap是对象类
:= 只会传指针(或是内存地址,这两个我总搞不清)
assign 则是传实际内容
zlb_chen 2011-09-16
  • 打赏
  • 举报
回复
function aaa():TBitmap ;

这个方法中返回结果是 nil。因为在finally中Free了。

procedure TForm3.Button1Click(Sender: TObject);
var
t:TBitmap;
begin
t:=TBitmap.Create; // 这句用不了了。因为在 AAA中已有返回了。前提是 AAA中的 Finally中不应FREE
try
t:=aaa;
t.SaveToFile('2.bmp');
finally
t.Free;
end;
ecjtu5208 2011-09-16
  • 打赏
  • 举报
回复
我是菜鸟,我走开
程晨c 2011-09-16
  • 打赏
  • 举报
回复
像这种情况,最好不要拆分出一个aaa函数来,aaa函数中的B.FREE;导致了对象被释放,所以执行t:=aaa;后,t实际上还是一个空值。
Harryfin 2011-09-14
  • 打赏
  • 举报
回复
本来想回答的,不过喷一下算了。楼主你这问题可是属于连菜鸟都懂的常识性问题哦
funxu 2011-09-14
  • 打赏
  • 举报
回复
鉴于这么“少见”的“复杂”问题, 我就不回答了
rainychan2009 2011-09-13
  • 打赏
  • 举报
回复
栈与堆、指针需要理解清楚。
类对象变量只是一个指针,指向分配在对上的内存,通过指针的指向释放在堆上申请的内存,Free之后,指针中存储的地址并不为空,但是该地址指向的内容已经被系统回收。此时该指针就是一个野指针。
mdejtod 2011-09-13
  • 打赏
  • 举报
回复
口气确实比较大。
iamduo 2011-09-13
  • 打赏
  • 举报
回复
ABC= class
constructor ABC.Create(const AName : String);
begin
inherited Create;
self.Name:=AName;
self.Width:=0;
self.Height:=0;
self.BackColor:=BD_COLORLESS;
self.LineWidth:=0;
self.Size:=0;
self.BufSize:=0;
self.Bits:=nil;
self.Error:='';
end;
--------------------------------------
做如下类的引用报错 无提示退出
var
x:abc;
begin
x:=abc.create('abcd') // 这句无法实例化
taonyqian2022 2011-09-12
  • 打赏
  • 举报
回复
对不起 我实验了楼上几位高手的方法 依然是报错误 求教 到底怎么办啊
onlyou13 2011-09-12
  • 打赏
  • 举报
回复
靠,如此简单的问题还问得这么嚣张,比我还菜,口气倒不小。
Oraclers 2011-09-12
  • 打赏
  • 举报
回复
你的函数返回的是一个指针,而你又在函数中将这个指针所指对象FREE,这个指针当然无效了。本人认为只要将FREE语句去除,就不会出错。FREE放在这个对象用完后。
浩南_哥 2011-09-12
  • 打赏
  • 举报
回复
你在函数中Var申明一个类对象后,实际上只是在栈中创建了一个四字节的指针变量,没有create之前这个指针的内容没有任何意义,在使用类方法Create创建了对象后,会在堆中创建一个真实的对象,并且也在这个时候先前创建的对象指针的内容才会指向这个被创建的对象实体,如果你使用free,也就是把堆上的内存释放掉了。
taonyqian2022 2011-09-12
  • 打赏
  • 举报
回复
我有个问题,以下简略代码中 ABC是我定义的一个类,构造函数如下,在VCL APP中可以执行相关的方法,但是
在COM DLL中
ABC= class
constructor ABC.Create(const AName : String);
begin
self.Name:=AName;
self.Width:=0;
self.Height:=0;
self.BackColor:=BD_COLORLESS;
self.LineWidth:=0;
self.Size:=0;
self.BufSize:=0;
self.Bits:=nil;
self.Error:='';
end;
--------------------------------------
做如下类的引用报错 无提示退出
var
x:abc;
begin
x:=abc.create // 这句无法实例化
不知道为什么啊?
如果用系统的TBITMAP
就可以实例化
x:=tbitmap.create
chenzhuo 2011-09-12
  • 打赏
  • 举报
回复

function aaa():TBitmap ;
begin
Result:=TBitmap.Create;
Result.loadfromfile('1.BMP');
end;

end;
procedure TForm3.Button1Click(Sender: TObject);
var
t:TBitmap;
begin
t:=aaa;
try
t.SaveToFile('2.bmp');
finally
t.Free;
end;
en;

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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