对于第3个问题我倒是遇到过,是这样解决的:
TBitmap调用LoadFromFile,LoadFromStream,Assign的时候,你应该能发现他们都有相应的实体,当图象显示在TBitmap的对象上后,就可以画你自己的图了,为什么呢?原因就是这些函数把图象调到TBitmap对象时,会自动初始化TBitmap的画布大小,而刚刚建立的TBitmap对象的画布面积大小却为零,所以……改变画布的大小,你就可以为所欲为!

解决方案 »

  1.   

    1.ActiveForm本身的Destroy析构方法,重载就可以了。
    2.动态数组传递的还是一个指针,应该不存在堆栈溢出的情况。
    3.失败是什么意思?是画不上还是异常?如果是没有画上,就设置Width和Height属性,让它分配内存。
      

  2.   

    1:放在析构函数中:
      destructor Destroy;override;
    2:动态数组作为参数时并不会把它的所有元素都传递过去,实际上是传递了它的指针,所以无论元素有多少都不会导致椎栈溢出.如果你的函数是供外部调用的,你不应该用动态数组,应该用Variant类型.调用者用VarArrayCreate创建一个数组型的Variant传递给它.因为ActiveForm是通过COM接口供外部调用的,所有的参数都必须是COM的标准类型.
    3:必须先设置bitmap的宽和高,然后才能在上面画图:
      ABitmap := TBitmap.Create;
      ABitmap.Width := ClientWidth;
      ABitmap.Height := ClientHeight;
      ...
      

  3.   

    多谢两位 第三个问题相信已经解决了mshawk(憨憨):
     对于第二个问题 我开始也认为应该是指针 可是遇到这个莫名其妙的错误后
    我突然开始怀疑 会不会delphi为了防止误修改原始数据 在函数中又复制了一份数据的拷贝?而且这个ActiveForm是嵌在ie弹出的一个窗口中的 应该是ie的一个线程 会不会跟这个有关系 要不然在application中怎么没有类似的问题呢
      

  4.   

    对了 关于第二个问题 其实是这样的
    我定义了一个类A 其中有一个动态数组 并为其赋值
    然后有一个类B 其中有一个成员函数 参数为那个动态数组的类型
    现在 我在类A的对象中创建一个B的对象并调用其成员函数
    问题就在这儿出现了
      

  5.   

    我想看一下你在A中为动态数组赋值、B的成员函数的声明和B中使用这个动态数组的代码。
      

  6.   

    现在代码不在手边 大体是这样的
    B = class
    public
      ProcessData(Data: array of SomeType);
    end;A = class
    private
      fData: array of SomeType;
    public
      constructor Create;
      procedure   DoSomething;
    end;
    constructor A.Create;
    begin
      SetLength(fData, LengthOfData);
      //给Data赋值
    end;procedure A.DoSomething;
    var
      bb: B;
    begin
      bb:= B.Create;
      with bb do
      begin
        ProcessData(fData);
        Free;
      end;
    end;procedure B.ProcessData(Data: array of SomeType);
    begin
      ShowMessage('hello');
      //处理数据 但是上边一句ShowMessage就已经运行不到了
    end;
      

  7.   

    这样试试:
    Type
      TSomeTypeAry = array of SomeType;B = class
    public
      ProcessData(Data: TSomeTypeAry );
    end;A = class
    private
      fData: TSomeTypeAry ;
    public
      constructor Create;
      procedure   DoSomething;
    end;
    Note: The syntax of open array parameters resembles that of dynamic array types, but they do not mean the same thing. The example above creates a function that takes any array of Char elements, including (but not limited to) dynamic arrays. To declare parameters that must be dynamic arrays, you need to specify a type identifier:type TDynamicCharArray = array of Char;function Find(A: TDynamicCharArray): Integer;
      

  8.   

    呵呵 所有问题统统解决!多谢大家!
    To plainsong(轻风):
      我碰到的应该不是这样的问题 因为在数据量比较小的情况下不会出问题 不过在类似于array of array这样的类型时 确实应该象你那样解决 否则好像编译通不过 我今天把A和B两个类写到了一起 都使用A的fData 结果搞定了TBitmap的问题解决后 内存占用量一下子小了N多 真爽亚 呵呵 结贴喽