18

私の Delphi アプリケーションでは、コマンド ライン パラメータを追加して、ログイン画面でいくつかのパラメータを自動的に設定したいと考えています。

現在、ユーザーがいくつかの情報 (サーバー、データベース、ユーザー、パスワード、AuthenticationType、AUtoLogin など) を設定するログイン画面があります。

MRU を使用してフィールドに入力します。とにかく、大規模な組織では、ユーザーに情報を選択させないようにする必要があります。このために、私のシナリオで実行できる最も簡単な方法は、コマンド ライン パラメーターを使用することです。

私の質問は、コマンド ライン パラメーターの選択方法を教えてください。つまり、「位置」アプローチまたは「タグ」アプローチを使用する必要があります。たとえば、次のようになります。

MyProject.exe -s:MYSERVER -d:DATABASE

また

MyProject.exe MYSERVER DATABASE

最初のケースでは、すべてのパラメーターを使用してループしParamStr、それらが何であるかを「デコード」する必要があります。「-s:」で始まる場合、その後に続くのがサーバー名であることがわかります。2 番目の方法はより迅速で汚れていますが、より効果的です。

「スペース」を含むパラメータを管理するには? それらを ParamStr で自動的にインターセプトすることは可能ですか、それともすべて手動で処理する必要がありますか? (つまり、パラメーターにスペースが含まれていることを ParamStr に自動的に伝える方法があります(中かっこなどを使用するなど)。

ベストプラクティスは何ですか?

4

4 に答える 4

23

「位置」アプローチまたは「タグ」アプローチを使用する必要がありますか?

間違いなく、コマンド ライン引数にタグを付ける必要があります。定位置アプローチでは、パラメーターを省略できる十分な柔軟性がありません。タグ付けにより、特に以前に記述したコードに戻るときに、ユーザーが引数を理解しやすくなります。タグは自己文書化する必要があります。

タグなしの引数を使用する一般的なシナリオの 1 つは、ファイル名またはファイル名のリストがある場合です。

「スペース」を含むパラメータを管理するには?

Windows の規則では、引数を二重引用符で囲んでスペースをエスケープします。ParamStr解析はこれらを認識し、それに応じて引数を解析します。表示されるParamStr(i)のは、引用符が削除された引数です。


RTL には、コマンドライン引数の解析を支援する便利なヘルパー関数が付属していますFindCmdLineSwitch

于 2012-02-27T12:03:43.793 に答える
12

Delphi には、コマンドライン解析を行うTCommandParserクラスを備えた CommandParser という非常に優れたユニットが含まれています。ほとんどドキュメント
がないため、ここでいくつかの作業を開始します。

オープン ソースの bo リポジトリHiddenExecutable の例があります。

基本的にあなた:

  • コマンドライン パラメーターとして公開するプロパティを含むa をセットアップしTComponentます (つまりTHiddenExecuteSettingsHiddenExecuteSettingsUnitにあります)。
  • コマンドライン パーサー コントローラー。私たちの場合THiddenExecuteArgumentsTHiddenExecuteArgumentsUnit (振り返ってみると、あまり良い名前ではありません) にはInitCommandLine、TCommandParser インスタンスを設定してそれを渡すメソッドが含まれています。TComponent
  • 次に、いくつかのAddSwitch呼び出しを実行して、短縮コマンドライン スイッチと完全コマンドライン スイッチ (hと などhelp)の両方でパラメーターをセットアップします。
  • ProcessCommandLine次に、インスタンスでメソッドを呼び出してTCommandParser、コマンドラインを処理し、プロパティを入力できますTComponent(私の例では、これはProcessCommandLineメソッドで行われます)。

お楽しみは次のとおりです。

  • TCommandParserは、HelpTextメソッドに入力した内容に基づいてヘルプテキストを完全に自動的に組み立てるAddSwitchメソッドがあります。
  • には、TComponent の現在の設定を設定ファイルに保存できるメソッドもTCommandParserあります。SaveOptions

必要な 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

最初の質問は好みの問題です。しかし、私が答えることができる2番目のもの。スペースを含むパラメーターを囲むには、二重引用符を使用します。たとえば、

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 に答える