使用DevExpress的组件开发程序,是一个用图形方式进行设备控制的系统,用到了ExpressBar、QuantumTreeList、VerticalGrid和FlowChart。使用FlowChart显示图形,界面上含有的图形对象很多。开发的计算机内存有1G,在开发这台计算机上调试运行,一切正常。但是放到其它的计算机上,FlowChart清除图形对象时有时候产生Access violation at address ...异常,有时候又不产生。要是说我的应用程序有问题吧,我完全可以调试并找出代码问题所在,但是跟踪代码并没有发现程序问题,产生异常时查看调用堆栈为:kernel32.dll
rtl60.bpl
ntdll.dll
ntdll.dll程序代码无法捕获该异常,然后应用程序abnormal program terminated.另外,我尝试将DevExpress的组件(BPL库)静态链接到应用程序,MainForm一构造就产生类似的异常,因为是头一回用DevExpress的组件,不太清楚底细,是不是DevExpress的组件不可以静态链接?顺便说明:我使用的是C++ Builder 6.0开发环境。各位大哥有没有遇到类似的问题?如何解决?小弟拜谢!

解决方案 »

  1.   

    终于发现问题所在,DevExpress FlowChart 1.2.1 代码有Bug。destructor TdxFcObject.Destroy;
    var
      I: Integer;
    begin
      Owner.Delete(Self);
      DeleteRgn;
      if FPaintRgn <> 0 then DeleteObject(FPaintRgn);
      while ConnectionCount > 0 do
        Connections[0].Free;
      FConnections.Free;
      FLinkedObjects.Free;
      FObjects.Free;
      ^^^^^^^^^^^^^ 这一行!
      FShapeBrush.Free;
      FBkBrush.Free;
      with Owner do
        for I := 0 to ObjectCount - 1 do
          Objects[I].FObjects.Remove(Self); <-- TNND自己的FObjects都Free了还Remove。  Owner.FObjects.Remove(Self);
      Owner.SetChartSizes;
      inherited Destroy;
    end;把  FObjects.Free; 移到循环之后就行了。
      

  2.   

    我想应该不是那样的,应该是其它地方引起的Owner.Delete(Self);  //这一步已删除Owner对自己的引用

      with Owner do
        for I := 0 to ObjectCount - 1 do
          Objects[I].FObjects.Remove(Self); <-- 自己不在Objects里
    <<--------上面只不过是从所有Objects[I].FObjects删除对自己的引用
      

  3.   

    to quicksand201:   Owner.Delete(Self) 看它的源代码知道这一步并没有从Owner的Objects列表中删除,而只是作了一些删除前的准备工作。