【问题标题】:Assign value to variant parameter为变量参数赋值
【发布时间】:2011-05-02 00:39:21
【问题描述】:

我在 Delphi XE 中得到了这样的代码

function DoSomething(MyVar : Variant) : boolean;
begin
  MyVar := 'Bar';
  Result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  foo : string;
begin
  foo := '';
  showmessage(foo); // shows blank ofc
  DoSomething(foo);
  showmessage(foo); // still blank
end;

我想要做的是,让它可以设置 foo 的参数。我尝试使用 var 关键字,如

DoSomething(var MyVar : Variant)....

但这不会编译。

这样做的原因是 DoSomething 可以为 MyVar 分配一个字符串或整数,这就是为什么它是一个变体......

【问题讨论】:

  • 当使用var 参数(通过引用传递)时,你的foo : string; 应该变成foo : Variant;,正如编译器告诉你的那样。

标签: delphi pass-by-reference parameter-passing delphi-xe


【解决方案1】:

当我这样做时

function Foo(var Bar: variant): boolean;
begin
  Bar := 'beta';
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  a: variant;
begin
  a := 'alpha';
  Foo(a);
  caption := a;
end;

表单的标题是beta。所以它为我编译...

您尝试将string 作为var variant 参数发送。您需要发送variant 作为var variant 参数,正如编译器所说的([DCC Error] Unit1.pas(35): E2033 Types of actual and formal var parameters must be identical)!

但变体通常不是最适合使用的东西(性能次优,仅提一件事)。

你可以做一些简单的事情,比如

type
  TValType = (vtString, vtInteger);
  TData = record
    ValType: TValType;
    ValStr: string;
    ValInt: integer;
  end;

然后做

function Foo(var Data: TData): boolean;

【讨论】:

  • 你为什么要像那样重新发明轮子。如果您想要由运行时确定的类型,使用变体很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多