在我的Delphi应用程序中,我想添加命令行参数以在登录屏幕中自动设置一些参数.
目前我有一个登录界面,用户可以在其中设置一些信息(如服务器,数据库,用户,密码,AuthenticationType,AUtoLogin等).
我使用MRU来填充字段.无论如何,在大型组织中,不需要让用户选择任何信息.为此,我在我的场景中可以做的最简单的事情是使用命令行参数.
我的问题是你如何建议选择命令行参数?我的意思是,我应该采用"位置"方法还是某种"标记"方法,例如:
MyProject.exe -s:MYSERVER -d:DATABASE
Run Code Online (Sandbox Code Playgroud)
要么
MyProject.exe MYSERVER DATABASE
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我需要循环使用所有参数ParamStr并"解码"它们的内容.如果他们以"-s:"开头,我知道接下来是服务器名称.第二种是更快速和更脏,但可能更有效.
如何管理包含"空格"的参数?是否可以使用ParamStr自动拦截它们,还是应该手动处理所有?(我的意思是有一种方法可以自动告诉ParamStr一个参数包含一个空格(比如使用大括号或其他东西).
什么是最佳做法?
Dav*_*nan 23
我应该采用"位置"方法还是某种"标记"方法?
毫无疑问,您应该标记命令行参数.位置方法不允许足够的灵活性来省略参数.标记使用户更容易理解参数,尤其是在返回先前编写的代码时.标签应该是自我记录的.
当您有未标记的参数时,一种常见的情况是您有文件名或文件名列表.
如何管理包含"空格"的参数?
Windows约定是通过在参数周围加上双引号来转义空格.该ParamStr分析将认识到这些,并相应地解析参数.你看到的ParamStr(i)是删除了引号的参数.
RTL带有一个有用的辅助函数来帮助您解释命令行参数:FindCmdLineSwitch.
Jer*_*ers 12
Delphi包含一个非常好的单元,名为CommandParser,带有一个TCommandParser类,可以为您执行命令行解析.
由于它几乎没有文档,这里有一些入门的东西.
我在我们的开源bo存储库中有一个HiddenExecutable示例.
基本上你:
TComponent包含要作为命令行参数公开的属性(THiddenExecuteSettings在HiddenExecuteSettingsUnit中)THiddenExecuteArguments,在THiddenExecuteArgumentsUnit(回想起来不是这么好的名字)中,它包含一个InitCommandLine设置TCommandParser实例的方法,并将其传递给你TComponenth和help)ProcessCommandLine在TCommandParser实例上调用该方法来处理命令行并填充您的属性TComponent(在我的示例中,这是在ProcessCommandLine方法中完成的).现在来了很有趣:
TCommandParser有一个HelpText是完全自动组装根据你喂什么它与一个帮助文件方法AddSwitch的方法.TCommandParser也有一个SaveOptions方法,它允许您将TComponent的当前设置保存为一个设置文件.您需要的Delphi单元是您可以从Embarcadero radstudiodemos.sourceforge.net演示库获得的:
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',
Run Code Online (Sandbox Code Playgroud)
编辑: John Kaster 在EDN上写了一篇很好的文章,其中包含有关使用TCommandParser的更多细节.
你的第一个问题仅仅是品味问题.但是,第二个我可以回答.您使用双引号括起包含空格的参数.例如,如果你有
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
i: integer;
begin
for i := 0 to ParamCount do
WriteLn(ParamStr(i));
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
并使用参数启动应用程序one "two with spaces" three "four with spaces",然后获得输出
C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects\Project1.exe
one
two with spaces
three
four with spaces
Run Code Online (Sandbox Code Playgroud)