OleVariant赋值出错 ( 积分: 100 )

  • 主题发起人 主题发起人 aiken
  • 开始时间 开始时间
A

aiken

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的怎么会出错呢?
procedure TForm1.Button1Click(Sender: TObject);
type
OleVariantArray = array[0..65535] of OleVariant;
POleVariantArray = ^OleVariantArray;
var
pVariants: POleVariantArray;
a: Variant;
b: String;
begin
pVariants := POleVariantArray(CoTaskMemAlloc(5 * sizeof(OleVariant)));
if pVariants = nil then Exit;
b := 'Hello world!';
a := b;
pVariants[0] := a; //这一句

button1.Caption := pVariants[0];
if pVariants <> nil then CoTaskMemFree(pVariants);
end;
 
下面的怎么会出错呢?
procedure TForm1.Button1Click(Sender: TObject);
type
OleVariantArray = array[0..65535] of OleVariant;
POleVariantArray = ^OleVariantArray;
var
pVariants: POleVariantArray;
a: Variant;
b: String;
begin
pVariants := POleVariantArray(CoTaskMemAlloc(5 * sizeof(OleVariant)));
if pVariants = nil then Exit;
b := 'Hello world!';
a := b;
pVariants[0] := a; //这一句

button1.Caption := pVariants[0];
if pVariants <> nil then CoTaskMemFree(pVariants);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
type
OleVariantArray = array[0..65535] of OleVariant;
POleVariantArray = ^OleVariantArray;
var
pVariants: POleVariantArray;
a: Variant;
b: String;
begin
pVariants := POleVariantArray(CoTaskMemAlloc(5 * sizeof(OleVariant)));
if pVariants = nil then Exit;
b := 'Hello world!';
a := b;
pVariants[0] := a; //这一句不出错
caption := pVariants[0]; //读取正常

button1.Caption := pVariants[0];
if pVariants <> nil then CoTaskMemFree(pVariants);
end;

aiken,我试过了,这段程序没问题的啊,不会出错的。
我是在Delphi6下试的。
要不你把出错消息贴上来分析分析?
 
所以我很奇怪,我使用Delphi7,提示如下:
"... raised exception class EVariantBadVarTypeError with message 'Invalid variant type'. ..."
在单步调试时发现是那一句出的问题。
 
procedure TForm1.Button1Click(Sender: TObject);
var
pVariants: OleVariantArray;
b: String;
begin
pVariants := VarArrayCreate([0, 0], VarOleStr);
b := 'Hello world!';
pVariants[0] := b;
button1.Caption := pVariants[0];
end;
 
“Incompatible types: 'OleVariantArray' and 'Variant'”
不对哦!就算没问题,也不是我要的结果,类型都不一样了。
 
procedure TForm1.Button1Click(Sender: TObject);
var
pVariants: OleVariant; //写错了 OleVariantArray -> OleVariant
b: String;
begin
pVariants := VarArrayCreate([0, 0], VarOleStr);
b := 'Hello world!';
pVariants[0] := b;
button1.Caption := pVariants[0];
end;
 
算啦,我还知道这样写没问题呢:
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Caption := 'Hello world!';
end;
帮忙找找我开头说的问题吧...
 
楼主代码中使用Variant数组的方法很是生僻,而且很不安全,可能是以前在Delphi低版本中由于对Variant数组支持不够好时所用的方法吧。这种做法在Delphi6中还支持,Delphi7加强了对Variant数组的安全性方面的约束,所以该做法已经通不过了。
其实Delphi对Variant数组的使用有其标准的做法,完全没必要使用如此生僻难懂的方法。
在Delphi7的帮助中查找VarArrayCreate主题就可以找到相关的内容和例子。
 
原来是不被支持了,我查去也...
 

Similar threads

后退
顶部