1
var
  A: OleVariant;
begin
  A := VarArrayCreate([0, 4], varVariant);
  A[0] := 1;
  A[1] := 1234.5678;
  A[2] := 'Hello world';
  A[3] := True;
  A[4] := VarArrayOf([1, 10, 100, 1000]);
  WriteLn(A[2]); { Hello world }
  WriteLn(A[4][2]); { 100 }end;2
绝对不允许在事件中释放自己。因为Event执行完毕后,还需要执行一部分自己的代码。如果释放了自己,那么剩下的代码全部都变成了非法的内存空间。

解决方案 »

  1.   

    TVarData = packed record
        VType: Word;
        Reserved1, Reserved2, Reserved3: Word;
        case Integer of
          varSmallint: (VSmallint: Smallint);
          varInteger:  (VInteger: Integer);
          varSingle:   (VSingle: Single);
          varDouble:   (VDouble: Double);
          varCurrency: (VCurrency: Currency);
          varDate:     (VDate: Double);
          varOleStr:   (VOleStr: PWideChar);
          varDispatch: (VDispatch: Pointer);
          varError:    (VError: LongWord);
          varBoolean:  (VBoolean: WordBool);
          varUnknown:  (VUnknown: Pointer);
          varByte:     (VByte: Byte);
          varString:   (VString: Pointer);
          varAny:      (VAny: Pointer);
          varArray:    (VArray: PVarArray);
          varByRef:    (VPointer: Pointer);
      end;
      

  2.   

        1》我是想知道OleVariant如何存放数组,我用ClientDataSet取得一个Data属性,将其保存到硬盘,用XML时是一堆正确地数据,但用二进制方式就是乱码,我想自己解析数组(不用VarArrayHighBound之类的东西),此前必须先知OleVariant保存数组的方式。我不是问的OleVariant的类型之类,反正Help中能查到的就不劳回答了(我基本查遍了)
        2》有否变通方法?请教!
      

  3.   

    1)要分析ClientDataSet的数据还是用ClientDataset自己比较好。直接CLientDataSet.LoadFromFile。因为ClientDataSet的数据非常复杂,存有字段信息,记录信息,还有Delta信息。
    2)不要在事件内部释放,在外部释放。可以在事件中对某个标志置位。这样外部程序发现该标志,就释放这个对象。
      

  4.   

    1.我想自己定义OleVariant数组的存盘方式(相当于记Log,把OleVariant数据记录下来),不一定是ClientDataSet(说它仅是举例)。我想OleVariant数组总有一套规范吧?
    2.我想在ActiveX中实现授权,无论运行时设计时,访问ActiveX,一旦ActiveX初始化时未发现注册信息便退出,VB中设计时用SendKey({DEL})达到效果,但我想,可否在ActiveX中自己实现呢?
      

  5.   

    1、OleVariant存盘需要你自己定义,遍历OleVariant应该是可能的。但我想工作量比较大。
    2、我想,你可以考虑使用Unit中的initializtion和finalization两个区域。
      

  6.   

    1>我是想自己定义,但我得先知道OleVariant变量中存放数组的定义(如何存)?
    2>暂时未试,等会儿!
      

  7.   

    1)你只能遍历,它如何存那是Delphi的问题,你根本无法了解。何况,从它的定义看,它是存指针的,那么有些问题就很难说清楚了。总不能把指针存入文件中去吧。
    仔细想一想,如何将一个树存入数据库中?
      

  8.   

    1,是啊,我遍历数组,可怎么遍历法,不会让我先取维数,再取每维上下标,再
    如果是这样,我倒了
    2,无论那个区域,最终问题在如何安全的卸载自己,我在initializtion中对Create作条件判断,不满足条件不Create,在VB中会提示未注册类,所以,可否具体介绍一下?
      

  9.   

    1、就像遍历树一样,用递归,很简单。
    2、卸载可以在finalization中做。未注册类是因为你的COM对象,没有用regsvr32注册。
      

  10.   

    1.唉,我不想说了
    2.我是要在加载ActiveX之前阻止加载,到了finalization黄花菜都凉了
      

  11.   

    在initializtion中写Application.Terminate,最直接彻底。
      

  12.   

    是释放ActiveX,不让应用程序加载ActiveX,但不关闭应用程序!
    我试过了,我在VB中调试“在initializtion中写Application.Terminate,最直接彻底”,
    彻底到完全关闭VB,喔喔!
      

  13.   

    是这样的,Application.Terminate会导致应用程序的关闭。我的Delphi也被这么关掉过的。
    不能释放自己,而且又无法获得自己的实例,确实头痛。那么在试试在建构函数中引发例外,不让建构函数顺利执行,会不会迫使应用程序卸载ActiveX,如果这招都没用,我就没辙了。
      

  14.   

    建构函数在哪?
    好像Delphi只向用户开放OnCreate事件,你是说我修改VCL?
      

  15.   

    Delphi所有的类都有建构函数啊!如果是Form,可以在public区这么写
    constructor Create(AOwner:TComponent); override;
      

  16.   

    我受不了啦,我快趴下了,老大说的不行喔:
    ActiveX不会引起VB出错,但VB中不能正常显示异常