【发布时间】:2017-02-03 15:24:39
【问题描述】:
目前,我正在将一个用 VBA 编写的项目转换为 Delphi,并偶然发现了在转换一些带有 Optional 参数的 Subs 时出现的问题。
比如说,有一个 Sub 声明(只是一个例子,实际的 Subs 最多有 10 个可选参数):
Sub SetMark
(x0 As Double, y0 As Double,
Optional TextOffset As Integer =5,
Optional TextBefore As String = "",
Optional Text As String = "",
Optional TextAfter As String = "mm",
Optional Color As String = "FFFFFF",
Optional ArrowPresent As Boolean = True)
Sub 随后可以这样调用:
Call SetMark (15, 100,,,"135")
Call SetMark (100, 100, 8,, "My text here..", "")
'a lot of calls here
Optional 参数在这里非常灵活,您可以省略其中任何一个,也可以为其中任何一个赋值。与 Delphi 不同。
Procedure SetMark
(x0: real; y0: real,
TextOffset: Integer =5;
TextBefore: ShortString = '';
Text: ShortString = '';
TextAfter: ShortString = 'mm';
Color: ShortString = 'FFFFFF';
ArrowPresent: Boolean = True);
看来您不能只复制 VBA 调用:
SetMark (15, 100,,,'135');// error here
所以,问题是:有什么方法可以将 Subs 转换为 Delphi 程序,保持参数的相同灵活性? 我的第一个想法是使用默认参数,但它不起作用。 就目前而言,在 Delphi 中,我将不得不直接传递列表中的所有参数及其值,但这意味着需要大量工作来审查和正确移植 VBA 调用。
有什么想法吗?
【问题讨论】:
-
顺便说一句,你真的不应该使用
ShortString。这已经被弃用了很多年。使用原生字符串类型string。 -
另外,切线地,
real是一个遗留类型,它只是为了兼容性而真正存在(它是double的别名)。最好在 Delphi 代码中声明一个double,就像 VB 代码一样。