从VBA到Delphi转换(可选参数问题)

Ale*_*lex 2 delphi excel vba excel-vba

目前我正在将用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)
Run Code Online (Sandbox Code Playgroud)

那个Sub随后可以这样调用:

    Call SetMark (15, 100,,,"135")
    Call SetMark (100, 100, 8,, "My text here..", "")
    'a lot of calls here
Run Code Online (Sandbox Code Playgroud)

这里的Optional参数非常灵活,你可以省略它们中的任何一个,并且你也可以为它们中的任何一个赋值.与Delphi不同.

Procedure SetMark
    (x0: real; y0: real, 
            TextOffset: Integer =5;
     TextBefore: ShortString = '';
     Text: ShortString = '';
     TextAfter: ShortString = 'mm';
     Color: ShortString = 'FFFFFF';
     ArrowPresent: Boolean = True);
Run Code Online (Sandbox Code Playgroud)

看来你不能只是制作VBA电话的副本:

SetMark (15, 100,,,'135');// error here 
Run Code Online (Sandbox Code Playgroud)

因此,问题是:有没有办法将Subs转换为Delphi程序,保持参数的相同灵活性?我的第一个想法是使用默认参数,但它不起作用.至于现在,在Delphi中我似乎必须直接传递列表中的所有参数,但这意味着需要进行大量的工作来审查和正确移植VBA调用.

有任何想法吗?

Dav*_*nan 12

有没有办法将VBA子程序转换为Delphi程序,仍然保持参数的相同灵活性?

没有办法实现这一点 - 除了列表末尾之外,省略参数的灵活性根本不存在.

对于自动化对象的方法,您可以使用命名参数,如下所述:Delphi中的命名/可选参数?但是,我非常建议您不要将类实现为自动化对象,只是为了获得该功能.

无论何时在语言之间切换,您都会发现不方便的差异.这是不可避免的.最好的方法是尝试找到用新语言解决问题的最佳方法,而不是试图将旧语言中的习语用于新语言.

在这种情况下,您可能希望使用重载函数参数对象来减轻这种不便.

  • 是.超载是我的首选解决方案. (3认同)