18

在我的 Delphi 应用程序中,我想添加命令行参数以在登录屏幕中自动设置一些参数。

目前我有一个登录屏幕,用户可以在其中设置一些信息(如服务器、数据库、用户、密码、AuthenticationType、AUtoLogin...)。

我使用 MRU 来填充字段。无论如何,在大型组织中,需要不要让用户选择任何信息。为此,我可以在我的场景中做的最简单的事情是使用命令行参数。

我的问题是你建议如何选择命令行参数?我的意思是,我应该采用“定位”方法还是某种“标签”方法,例如:

MyProject.exe -s:MYSERVER -d:DATABASE

或者

MyProject.exe MYSERVER DATABASE

在第一种情况下,我需要遍历所有参数ParamStr并“解码”它们是什么。如果它们以“-s:”开头,我知道后面是服务器名称。第二种更快更脏,但可能更有效。

如何管理包含“空格”的参数?是否可以使用 ParamStr 自动拦截它们,还是应该手动处理?(我的意思是有一种方法可以自动告诉 ParamStr 一个参数包含一个空格(比如使用大括号或其他东西)。

最佳做法是什么?

4

4 回答 4

23

我应该采用“定位”方法还是某种“标签”方法?

毫无疑问,您应该标记您的命令行参数。位置方法不允许有足够的灵活性来省略参数。标记使用户更容易理解参数,尤其是在返回之前编写的代码时。标签应该是自记录的。

当您有未标记的参数时,一种常见的情况是当您有一个文件名或文件名列表时。

如何管理包含“空格”的参数?

Windows 约定是通过在参数周围放置双引号来转义空格。ParamStr解析将识别这些并相应地解析参数。你看到的ParamStr(i)是去掉引号的参数。


RTL 带有一个有用的辅助函数来帮助您解析命令行参数:FindCmdLineSwitch.

于 2012-02-27T12:03:43.793 回答
12

Delphi 包含一个名为 CommandParser 的非常好的单元,它带有一个TCommandParser类,可以为您进行命令行解析。
由于它几乎没有文档,这里有一些事情可以开始。

我在我们的开源 bo 存储库中有一个HiddenExecutable 示例

基本上你:

  • 设置一个TComponent包含要作为命令行参数公开的属性(即THiddenExecuteSettingsHiddenExecuteSettingsUnit
  • 命令行解析器控制器。在我们的例子THiddenExecuteArguments中,在THiddenExecuteArgumentsUnit(回想起来不是一个好名字)中,它包含一个InitCommandLine设置 TCommandParser 实例的方法,将它传递给你的TComponent
  • 然后它执行几个AddSwitch调用以使用缩写和完整的命令行开关(如hhelp)设置参数
  • 然后,您可以调用实例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',

编辑: John Kaster在 EDN 上写了一篇不错的文章,其中包含有关使用 TCommandParser 的更多详细信息

于 2012-02-27T18:38:18.940 回答
7

你的第一个问题只是口味问题。但是,第二个我可以回答。您使用双引号将包含空格的参数括起来。例如,如果您有

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i: integer;

begin
  for i := 0 to ParamCount do
    WriteLn(ParamStr(i));
  Readln;
end.

并使用参数启动应用程序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
于 2012-02-27T12:05:07.537 回答
0

我将参数(基于顺序)和选项(基于开关)分开,例如参见“c:>help copy”。

于 2012-02-27T14:32:31.243 回答