1,OleVariant 和 Variant有什么区别啊?  感觉即使是同一类型的OleVariant变量也不能直接运算,可是这样??
2,一个OleVariant的变量怎么转化为Byte,又怎么转化为一个String呢
3,
procedure TForm1.FormCreate(Sender: TObject);
var T : SpObjectToken;
var i : Integer;
var j: Integer;
begin
    j := 0;
    i := 5;
    try
      i := i div j;
    except on
      EDivByZero do
          ShowMessage('kk');
           on
      E : Exception do
          ShowMessage('ee');
    end;
end;                          //为什么无法检测到异常呢, 为什么啊???4,最后一个问题了: 
Private Sub TokenInfo(text, token As SpObjectToken)
    
    On Error GoTo TokenInfoExit
    List1.AddItem text
    Set C = token.Category
    
TokenInfoExit:
    Select Case Err.Number
    
    Case 0
        List1.AddItem "  Token.GetDescription:"
        List1.AddItem "    " & token.GetDescription
        List1.AddItem "  Token.Category.Id:"
        List1.AddItem "    " & token.Category.Id
        List1.AddItem "  Token.Id:"
        List1.AddItem "    " & token.Id
        
    Case SPERR_UNINITIALIZED
        List1.AddItem "   SPERR_UNINITIALIZED"
        
    End Select
    List1.AddItem ""End Sub这一段VB的代码中有一个Select Case Err.Number的过程以捕获SPERR_UNINITIALIZED这个ERROR  如果是在DELPHI中 怎么捕获这个ERROR呢?? 万分感谢
另外问下 有没有人用微软的SAPI做语音开发的 有的话加我MSN
[email protected]  大家可以好好交流下 

解决方案 »

  1.   

    1) OleVariant 可以在 COM 之间进行传递. Variant 由于能够包括的类型比 OleVariant 多, 所以并不一定可以在 COM 中传递.2) String 与 OleVariant 之间转换function StringToVariant(AString: string): OleVariant;
    var
      P: Pointer;
    begin
      Result := VarArrayCreate([0, Length(AString)], varByte);
      P := VarArrayLock(Result);
      try
        Move(AString[1], P^, Length(AString));
      finally
        VarArrayUnlock(Result);
      end;
    end;function VariantToString(AVar: OleVariant): string;
    var
      P: Pointer;
      FSize: Integer;
    begin
      FSize := VarArrayHighBound(AVar, 1) - VarArrayLowBound(AVar, 1) + 1;
      SetLength(Result, FSize);
      P := VarArrayLock(AVar);
      try
        Move(P^, Result[1], FSize);
      finally
        VarArrayUnlock(AVar);
      end;
    end;不懂VB
      

  2.   

    3,
    procedure TForm1.FormCreate(Sender: TObject);
    var T : SpObjectToken;
    var i : Integer;
    var j: Integer;
    begin
        j := 0;
        i := 5;
        try
          i := i div j;
          ShowMessage('1 / 0 = '+IntToStr(i));   ///这加上,不然上面那句给Delphi卡擦掉的
        except on
          EDivByZero do
              ShowMessage('kk');
               on
          E : Exception do
              ShowMessage('ee');
        end;
    end;                 i := i div j; 这句的结果完全没有用到, 聪明的Delphi自然不会编译这样的费代码,你可以加上一句
    ShowMessage('1 / 0 = '+IntToStr(i)); 这样i的值就被调用了, 编译器才编译i := i div j这句。delphi可以这样:
        on E : Exception do
         begin
           ShowMessage('Exception class name = '+E.ClassName);
           ShowMessage('Exception message = '+E.Message);
         end;
      

  3.   

    补充一下第一个问题:
    一般来说使用 Variant and OleVariant 类型是不好的(毕竟要通过编译器去转换),
    但如果数据类型只能在运行时确定, 就必须使用这些类型了,
    比如开发 COM 和数据库程序时.
    OleVariant 常用于开发基于 COM 的程序, 比如 OLE 自动化和 ActiveX 控件.
    Variant 则常用于非 COM 程序.
    原因是 Variant 能(与字符串变量一样)更高效地存储 Delphi 字符串,
    但 OleVariant 需要把所有的字符串转换为 Ole Strings(WideChar Strings),
    而且由于没有引用记数, 字符串将永远存在.