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中的自定义函数 也可以直接引用类请高手回答,菜鸟走开谢谢啦

解决方案 »

  1.   

    你在函数中Var申明一个类对象后,实际上只是在栈中创建了一个四字节的指针变量,没有create之前这个指针的内容没有任何意义,在使用类方法Create创建了对象后,会在堆中创建一个真实的对象,并且也在这个时候先前创建的对象指针的内容才会指向这个被创建的对象实体,如果你使用free,也就是把堆上的内存释放掉了。
      

  2.   

    你的函数返回的是一个指针,而你又在函数中将这个指针所指对象FREE,这个指针当然无效了。本人认为只要将FREE语句去除,就不会出错。FREE放在这个对象用完后。
      

  3.   


    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;
      

  4.   

    我有个问题,以下简略代码中 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
      

  5.   

    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') // 这句无法实例化
      

  6.   

    栈与堆、指针需要理解清楚。
    类对象变量只是一个指针,指向分配在对上的内存,通过指针的指向释放在堆上申请的内存,Free之后,指针中存储的地址并不为空,但是该地址指向的内容已经被系统回收。此时该指针就是一个野指针。
      

  7.   

    像这种情况,最好不要拆分出一个aaa函数来,aaa函数中的B.FREE;导致了对象被释放,所以执行t:=aaa;后,t实际上还是一个空值。
      

  8.   

    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;
      

  9.   

    Result:=B;应改为
    Result.assign(B);因为tbitmap是对象类
    := 只会传指针(或是内存地址,这两个我总搞不清)
    assign 则是传实际内容
      

  10.   


    有没人总结下,哪些类":="操作等于"Assign"
    我只知道一个:TStrings类的Items的":="操作等于"Assign"
      

  11.   

    能用assign的都用,按一下 . 就知道了