2012-02-27 9 views
17

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

現在、私はユーザがいくつかの情報(サーバ、データベース、ユーザ、パスワード、認証タイプ、AUtoLoginなど)を設定するログイン画面を持っています。

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

私の質問はどのようにコマンドラインパラメータを選択することをお勧めですか?

MyProject.exe -s:MYSERVER -d:DATABASE 

または最初のケースで

MyProject.exe MYSERVER DATABASE 

は、私が使用して、すべてのパラメータ間でループする必要があります。私は、たとえば、「位置」アプローチのためか、いくつかの「タグ」のアプローチのために行く必要があり、意味します ParamStrとは何ですか?彼らが "-s:"で始まっている場合、私はそれに続くのはサーバー名であることを知っています。 2番目はより速く汚れていますが、より効果的です。

「スペース」を含むパラメータを管理するにはどうすればよいですか? ParamStrを使ってそれらを自動的に傍受することはできますか?それとも手動ですべて処理する必要がありますか? (私は自動的にパラメータを()中括弧か何かを使用してのようにスペースを含むされていることをParamStrに伝える方法があるわけ。

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

+6

スペースを含むパラメータを囲むのに二重引用符を使用します。 –

+0

なぜ私はすべての組み合わせで試したのですか?二重引用符では試してみませんでした!ありがとう。私は面白いことに気づいた。 "-s:Server name"と-s: "Server name"と書くと、ParamStrと同じとみなされます。 "-s:Server Name"の記述は、-s: "Server Name"のようにユーザーフレンドリーではないため、これは非常に優れています。 – LaBracca

+0

第1のアプローチは、あなたとエンドユーザにとって、より便利で簡単です。'TStringList'(各行の先頭に' ''の記号をつける)を使うことができ、 ':'に設定された 'NameValueSeparator'で' Values'プロパティを使うことができます。 – teran

答えて

23

私は "のために行く必要があります位置」アプローチや、いくつかのための 『タグ』のアプローチ?

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

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

"スペース"を含むパラメータを管理するにはどうすればよいですか?

Windowsでは、引数の前後に二重引用符を入れるとスペースがエスケープされます。 ParamStr解析では、これを認識して引数を解析します。 ParamStr(i)に表示されているものは、引用符が削除された引数です。 FindCmdLineSwitch


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

+0

ありがとうございます。上記の私のコメントも見てください。 – LaBracca

+0

うわー、FindCmdLineSwitchに感謝します。私はいつも手動でそれをすべてコード化しました。 – LaBracca

+2

@ user193655、IMO、 'FindCmdLineSwitch'はあなたの間違った友達です。シンプルなスイッチで便利な砂糖を提供しますが、完全に本格的なCLIを本当の頭痛にします。 'prog -x -r src dest'を考えてみましょう。そして、 "より良い"構文についてのあなたのQはほとんど意味がありません。代わりにあなたのパワーユーザーに、どのCLIが便利かを尋ねてください。 – OnTheFly

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 
+0

はい、興味深いことに、それはうまく動作します:1つの2つの "スペース" 3つの4つの "スペース" – LaBracca

0

出力を得ます"c:>ヘルプコピー"など。

11

デルファイには、コマンドライン解析を行うTCommandParserクラスのCommandParserという素晴らしいユニットが含まれています。
virtually no documentationを持っているので、ここから始めましょう。

HiddenExecutable example私のopen source bo repositoryにあります。基本的には

あなたは:あなたがコマンドラインパラメータとして公開するプロパティ(つまりHiddenExecuteSettingsUnit

  • THiddenExecuteSettingsコマンドラインパーサコントローラであるが含まれてい

    • セットアップTComponent我々の場合THiddenExecuteArgumentsTHiddenExecuteArgumentsUnitで(。 TCommandParserのインスタンスを設定するInitCommandLineメソッドを含むこのような良い名前は振り返りません)TComponent
    • 012 (hhelpなど)の設定に回の呼び出し略しとフル両方のコマンドラインスイッチとパラメータ
    • あなたは、その後、私の例では(コマンドラインを処理し、あなたのTComponentの性質を埋めるためにTCommandParserインスタンスでこれをProcessCommandLineメソッドを呼び出すことができます方法はProcessCommandLineで行われます)。

    は今楽しいが来る:

    • TCommandParserは完全に自動的にAddSwitch方法でそれを供給するものに基づいてヘルプテキストを組み立てHelpText方法があります。
    • TCommandParserにはSaveOptionsメソッドもあり、TComponentの現在の設定を設定ファイルに保存することができます。

      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 Kastermore details on using the TCommandParserが含ま素敵article on EDNを書いたあなたが必要

    Delphiのユニットを使用すると、エンバカデロradstudiodemos.sourceforge.netデモ・リポジトリから取得することができ、これらのです。

  • +0

    あまりにも私はデルファイXE7またはそのデモのどこでもこのユニットを見つけることができません:( –

    +1

    あなたが正しいです; XE7では、すべてのdbExpressデモを削除しましたが、http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE6/Objectでオンラインになっています。 %20Pascal/Database/dbExpress/Utils/CommandParser.pas –