我只是将Delphi 6中编写的一些旧代码升级到Delphi XE2.不幸的是,代码引用了Word97 COM对象来生成一些.doc文档.代码中有Word97的直接使用子句.
我必须保持生成的文档与旧的Crystal Report和另一个需要文档格式的第三方应用程序使用的Word格式相同.
所以,问题.因为我在uses子句中使用Word97,所以编译器抱怨每当使用EmptyParam变量时,实际和正式var参数的类型必须相同.这直接来自Word97.pas源文件.这是因为现在将EmptyParam声明为函数而不是变量.
处理这个问题的最佳方法是什么?我应该将Delphi 6源文件(Word97.pas等)复制到我的本地目录中,直接将它们与System.Variants.pas一起添加到我的项目中,并将我的应用程序的编译器指令更改为包含EMPTYPARAM_VAR吗?我没有尝试过,但希望它会将EmptyParam声明为变量.或者也许有一个更简单的解决方案.
谢谢
编辑
这里有更多的背景信息,即使我已经接受了答案,以备将来参考.这是代码的一个例子(AddClaimsLetter是"应用程序"COM对象 - 即TWordApplication):
AddClaimsLetter.Documents.Open(Wordfile, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Run Code Online (Sandbox Code Playgroud)
在不改变任何内容的情况下,此处的EmptyParam参数在编译时失败,表示"E2033实际和正式var参数的类型必须相同".
但是,因为我想保留Word97(在Delphi 6 Ent.安装文件夹中的OCX/Server中),我确实需要将.pas文件复制到我的本地项目文件中并声明一个用于代替EmptyParam的变量(因为这些文件也试图编译,我得到了与上面相同的编译器错误).
所以现在都在工作,但我可能会与管理层讨论升级到此应用程序的Office的更高版本!
谢谢
Uwe*_*abe 16
我快速解决问题的方法可能是声明OleVariant类型的局部变量,并为其分配函数EmptyParam的结果.
对于每个var参数,您应该添加一个用EmptyParam调用填充的局部变量.
原因是所有var参数都通过引用传递.如果在多个引用处传递相同的变量,则可能会遇到以下问题(使用"整数"简化).
Before: VarParameter=-1
Before: A=-1
Before: B=-1
After: A=2
After: B=2
After: VarParameter=2
EAssertionFailed: Assertion failure
Run Code Online (Sandbox Code Playgroud)
这是显示风险的代码:
program TheVarParameterRisk;
procedure AssignParameters(var A: Integer; var B: Integer);
begin
Writeln('Before: A=', A);
Writeln('Before: B=', B);
A := 1;
B := 2;
Writeln('After: A=', A);
Writeln('After: B=', B);
Assert(A = 1);
end;
var
VarParameter: Integer;
begin
try
VarParameter := -1;
try
Writeln('Before: VarParameter=', VarParameter);
AssignParameters(VarParameter, VarParameter);
finally
Writeln('After: VarParameter=', VarParameter);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
你看,在AssignParameters中Assert失败,因为调用者通过相同的参考到两个var参数.
这正是EmptyParam成为函数的原因:它永远不应该作为var参数传递.
人们抱怨Delphi中的错误(例如这里)导致了EmptyParam值的覆盖.
现在这个问题已经解决,这EmptyParam是一个功能.当您需要将其作为var参数传递时,请使用本地中间件.
笔记:
EmptyParam给var参数,那么基本上你本身就有问题:var参数意味着某些东西将被改变,这意味着传递EmptyParam(或具有相同内容的局部变量) )正在阻止这种变化.var参数而不是const参数),则导入的类型库具有错误的参数标志,或者(如果参数标记为OK)它是错误的(并且您应该提交https://quality.embarcadero.com上的错误报告(这曾经是http://qc.embarcadero.com索引的搜索引擎,但已被关闭; https://quality.embarcadero.com需要免费帐户搜索).编辑:
你必须通过这一事实EmptyParam在一个var参数是一个非常强大的暗示到了我的观点是被称为可能acually使用这些参数,将失败的功能.就像我的示例函数失败一样.(是的,函数文档可能会引诱你使用多个EmptyParam参数,而这些参数实际上根本就不是那么空;我经常看到文档说A和实际函数执行B).
| 归档时间: |
|
| 查看次数: |
3965 次 |
| 最近记录: |