Delphi 关于如何定义命令行参数的建议
在我的Delphi应用程序中,我想添加命令行参数,以便在登录屏幕中自动设置一些参数 目前,我有一个登录屏幕,用户在其中设置一些信息(如服务器、数据库、用户、密码、AuthenticationType、AUtoLogin等) 我使用MRU填充字段。无论如何,在大型组织中,有必要不让用户选择任何信息。为此,在我的场景中,我能做的最简单的事情就是使用命令行参数 我的问题是,您建议如何选择命令行参数?我的意思是,我应该选择“位置”方法还是“标记”方法,例如:Delphi 关于如何定义命令行参数的建议,delphi,paramstr,Delphi,Paramstr,在我的Delphi应用程序中,我想添加命令行参数,以便在登录屏幕中自动设置一些参数 目前,我有一个登录屏幕,用户在其中设置一些信息(如服务器、数据库、用户、密码、AuthenticationType、AUtoLogin等) 我使用MRU填充字段。无论如何,在大型组织中,有必要不让用户选择任何信息。为此,在我的场景中,我能做的最简单的事情就是使用命令行参数 我的问题是,您建议如何选择命令行参数?我的意思是,我应该选择“位置”方法还是“标记”方法,例如: MyProject.exe -s:MYSER
MyProject.exe -s:MYSERVER -d:DATABASE
或
在第一种情况下,我需要使用ParamStr
遍历所有参数并“解码”它们是什么。如果它们以“-s:”开头,我知道下面是服务器名。第二种方法更快、更脏,但可能更有效
如何管理包含“空格”的参数?是否可以使用ParamStr自动拦截它们,或者我是否应该手动处理所有这些?(我的意思是有没有一种方法可以自动告诉ParamStr一个参数包含一个空格(比如使用花括号之类的)
最佳做法是什么
我应该选择“定位”方法还是“标记”方法
毫无疑问,您应该标记命令行参数。位置方法不允许有足够的灵活性来省略参数。标记使用户更容易理解参数,特别是在返回到以前编写的代码时。标记应该是自文档化的
当您有一个文件名或一个文件名列表时,一种常见的情况是您会有未标记的参数
如何管理包含“空格”的参数
Windows惯例是通过在参数周围加双引号来转义空格。ParamStr
解析将识别这些参数并相应地解析参数。ParamStr(i)
中看到的是带引号的参数
RTL附带了一个有用的帮助函数来帮助您分析命令行参数:。您的第一个问题只是一个品味问题。但是,我可以回答第二个问题。您可以使用双引号将包含空格的参数括起来。例如,如果
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
i: integer;
begin
for i := 0 to ParamCount do
WriteLn(ParamStr(i));
Readln;
end.
并使用参数启动应用程序1“2带空格”3“4带空格”
,然后获得输出
C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects\Project1.exe
one
two with spaces
three
four with spaces
我将参数(基于顺序)和选项(基于开关)分开
例如,请参阅“c:>帮助复制”。Delphi包含一个非常好的名为CommandParser的单元,其中包含一个为您执行命令行解析的类。
既然如此,下面是一些需要开始的事情 我对我们的工作有兴趣 基本上你:
- 设置一个
,其中包含要作为命令行参数公开的属性(即t组件
- 一个命令行解析器控制器。在我们的例子中(回想起来不是一个好名字)中的
,它包含一个thiddenexecutarguments
方法,该方法设置一个TCommandParser实例,并将您的InitCommandLine
TComponent
- 然后,它执行两个调用,用缩写和完整的命令行开关设置参数(如
和h
)help
- 然后可以在
实例上调用TCommandParser
方法来处理命令行并填充ProcessCommandLine
的属性(在我的示例中,这是在TComponent
方法中完成的)ProcessCommandLine
有一个TCommandParser
方法,该方法根据您使用HelpText
方法输入的内容,完全自动组合HelpTextAddSwitch
还有一个TCommandParser
方法,允许您将TComponent的当前设置保存到设置文件中SaveOptions
CommandParser in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\Utils\CommandParser.pas',
PropertyHelpers in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\DbxDataPump\PropertyHelpers.pas',
ParseIds in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\DbxDataPump\ParseIds.pas',
编辑:编写了一个包含空格的nice。您使用双引号括起了一个包含空格的参数。我不知道为什么我尝试了所有组合,但没有使用双引号。谢谢。我注意到一件有趣的事情。如果我写:“-s:Server name”和-s:“Server name”ParamStr认为它们是相同的。这很好,因为编写“-s:Server Name”不像-s:“Server Name”那样方便用户。第一种方法对您和最终用户来说更方便。要“解码”params,您可以使用
TStringList
(在每行开头加上-
符号)使用它的Values
属性,将NameValueSeparator
设置为:
我认为如果参数是必需的,那么它应该是“位置的”。如果它是可选的,那么它应该是“标记的”.@Nat位置参数的缺点是,人类读者很难解析它们。当然,计算机很清楚这一点,但想想可怜的人类!位置参数也会使命令行的重构更具挑战性。谢谢。另请参阅我上面的评论。哇,感谢FindCmdLineSwitch。我总是手动编写所有这些代码。@user193655年,依我看,FindCmdLineSwitch
是你的假朋友。它用简单的开关带来方便,但让成熟的CLI成为一个真正令人头痛的问题。考虑一下:prog-x-r src dest
。还有你关于“更好”的问题语法没有什么意义。请询问您的高级用户,他们认为哪种CLI更方便。我同意这一点。为了能够处理此类参数,这是我在回答中描述的“常见场景”,您确实希望参数解析器使用开关/选项,并将剩下的参数留给您。
CommandParser in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\Utils\CommandParser.pas',
PropertyHelpers in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\DbxDataPump\PropertyHelpers.pas',
ParseIds in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\DbxDataPump\ParseIds.pas',