2012-02-27 10 views
17

Nell'applicazione Delphi, vorrei aggiungere i parametri della riga di comando per impostare automaticamente alcuni parametri nella schermata di accesso.Suggerimenti su come definire i parametri della riga di comando

Attualmente ho una schermata di accesso in cui l'utente imposta alcune informazioni (come server, database, utente, password, AuthenticationType, AUtoLogin, ...).

Uso MRU per popolare i campi. Comunque, nelle grandi organizzazioni, c'è la necessità di non lasciare che l'utente scelga alcuna informazione. Per questo, la cosa più semplice che posso fare nel mio scenario è usare i parametri della riga di comando.

La mia domanda è come suggerisci di scegliere i parametri della riga di comando? Voglio dire, dovrei andare per un approccio "posizione" o per qualche approccio "tag", ad esempio:

MyProject.exe -s:MYSERVER -d:DATABASE 

o

MyProject.exe MYSERVER DATABASE 

Nel primo caso ho bisogno di ciclo in tutti i parametri utilizzando ParamStr e "decodifica" cosa sono. Se iniziano con "-s:" so che quello che segue è il nome del server. Il secondo è più veloce e sporco ma potrebbe essere più efficace.

Come gestire i parametri che contengono uno "spazio"? È possibile intercettarli automaticamente con ParamStr o dovrei gestirli tutti manualmente? (Intendo c'è un modo per dire automaticamente ParamStr che un parametro che contiene uno spazio (come l'utilizzo di parentesi graffe o qualcosa del genere).

Qual è la migliore pratica?

+6

Utilizzare le virgolette doppie per racchiudere un parametro che contiene spazi. –

+0

Non so perché ho provato con tutte le combinazioni ma non con virgolette doppie !. Grazie. Ho notato una cosa interessante. Se scrivo: "-s: Nome server" e -s: "Nome server" sono considerati uguali da ParamStr. Questo è molto buono, perché scrivere "-s: Nome server" non è facile da usare come -s: "Nome server". – LaBracca

+0

1 ° approccio è più pratico e facile per te e per gli utenti finali ..per "decodificare" params puoi usare 'TStringList' (strip' -' simboli all'inizio di ogni riga) e usare la sua proprietà 'Values' con' NameValueSeparator' impostato a ':' – teran

risposta

23

Devo andare a fare una " " approccio o per qualche 'posizione di accostamento tag'?

senza dubbio si dovrebbe contrassegnare le argomentazioni della riga di comando. approcci posizionali non permettono una sufficiente flessibilità per omettere i parametri. Tagging rende più facile per l'utente a comprendere gli argomenti , soprattutto quando si torna al codice precedentemente scritto. I tag dovrebbero essere auto-documentanti .

Uno scenario comune quando si hanno argomenti senza tag è quando si ha un nome di file o un elenco di nomi di file.

Come gestire i parametri che contengono uno "spazio"?

La convenzione di Windows è che gli spazi sono sfuggiti inserendo virgolette sull'argomento. L'analisi ParamStr riconoscerà questi e analizzerà gli argomenti di conseguenza. Quello che vedi in ParamStr(i) è l'argomento con le virgolette rimosse.


La RTL è dotato di un funzione di supporto utile per aiutare la vostra linea di comando argomento analisi: FindCmdLineSwitch.

+0

Grazie. Vedi anche il mio commento sopra. – LaBracca

+0

Wow, grazie per FindCmdLineSwitch. Ho sempre programmato tutto manualmente. – LaBracca

+2

@ user193655, IMO, 'FindCmdLineSwitch' è il tuo falso amico. Porta lo zucchero conveniente con interruttori semplici, ma rende la CLI completa un vero mal di testa. Considera: 'prog -x -r src dest'. E la tua Q sulla sintassi "migliore" ha poco senso. Chiedete invece ai vostri utenti esperti quali sono le CLI che trovano convenienti. – OnTheFly

7

La tua prima domanda è semplicemente una questione di gusti. Tuttavia, il secondo a cui posso rispondere. Utilizzare le virgolette doppie per racchiudere un parametro che contiene spazi.Ad esempio, se si dispone di

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

var 
    i: integer; 

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

e avvia l'applicazione con argomenti one "two with spaces" three "four with spaces", quindi si ottiene l'output

C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects\Project1.exe 
one 
two with spaces 
three 
four with spaces 
+0

Sì, la cosa interessante è che funziona anche bene: uno due "con spazi" tre quattro "con spazi" – LaBracca

0

mi piacerebbe separare gli argomenti (ordine base) e opzioni (basata switch) See "c:> help copy" per esempio.

11

Delphi contiene un'unità molto utile denominata CommandParser con una classe TCommandParser che esegue l'analisi della riga di comando per l'utente.
Dal momento che ha virtually no documentation, ecco alcune cose per iniziare.

Ho un HiddenExecutable example presso il nostro open source bo repository.

Fondamentalmente è:.

  • impostare un TComponent che contiene le proprietà da esporre come parametri della riga di comando (cioè THiddenExecuteSettings nel HiddenExecuteSettingsUnit
  • un controller di comando parser Nel nostro caso THiddenExecuteArguments nel THiddenExecuteArgumentsUnit (in retrospect non è un nome così buono) che contiene un metodo InitCommandLine che imposta un'istanza TCommandParser passandogli il tuo TComponent
  • Quindi esegue un paio di AddSwitch chiamate per impostare i parametri con entrambi gli switch a riga di comando abbreviati e completi (come h e help)
  • È quindi possibile chiamare il metodo ProcessCommandLine nell'istanza TCommandParser per elaborare la linea di comando e riempire le proprietà del vostro TComponent (nel mio esempio, questo è fatto nel metodo ProcessCommandLine).

Ora viene il bello:

  • Il TCommandParser ha un metodo HelpText che assembla in modo completamente automatico un Helptext basata su ciò che ti ha nutrito con le AddSwitch metodi.
  • Il TCommandParser ha anche un metodo SaveOptions che consente di salvare le impostazioni correnti di TComponent in un file di impostazioni.

Le unità Delphi necessari sono questi che si può ottenere dal repository radstudiodemos.sourceforge.net demo Embarcadero:

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', 

Edit:John Kaster ha scritto un bel article on EDN che include more details on using the TCommandParser.

+0

Peccato che non riesca a trovare questa unità ovunque in Delphi XE7 o nei suoi demo :( –

+1

@JerryDodge hai ragione; l'ultima versione fornita negli esempi era XE6. In XE7 sono stati rimossi tutti i demo di dbExpress, ma è ancora in linea su http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE6/Object % 20Pascal/database/dbExpress/utils/CommandParser.pas –

Problemi correlati