delphi paramstr

delphi - Sugerencias sobre cómo definir los parámetros de la línea de comandos.



paramstr (4)

¿Debo optar por un enfoque de "posición" o por un enfoque de "etiqueta"?

Sin duda deberías etiquetar tus argumentos de línea de comando. Los enfoques posicionales no permiten suficiente flexibilidad para omitir parámetros. El etiquetado hace que sea más fácil para el usuario entender los argumentos, especialmente cuando se regresa al código escrito previamente. Las etiquetas deben ser auto-documentadas.

Un escenario común cuando tendría argumentos sin etiquetar es cuando tiene un nombre de archivo o una lista de nombres de archivo.

¿Cómo gestionar los parámetros que contienen un "espacio"?

La convención de Windows es que los espacios se escapan poniendo comillas dobles alrededor del argumento. El análisis de ParamStr los reconocerá y analizará los argumentos en consecuencia. Lo que ve en ParamStr(i) es el argumento con las comillas eliminadas.

La RTL viene con una útil función auxiliar para ayudar a su análisis de argumentos de la línea de comandos: FindCmdLineSwitch .

En mi aplicación Delphi, me gustaría agregar parámetros de línea de comandos para establecer automáticamente algunos parámetros en la pantalla de inicio de sesión.

Actualmente tengo una pantalla de inicio de sesión donde el usuario establece cierta información (como Servidor, base de datos, usuario, contraseña, Tipo de autenticación, AUtoLogin, ...).

Yo uso MRU para rellenar los campos. De todos modos, en las grandes organizaciones, existe la necesidad de no permitir que el usuario elija ninguna información. Para esto, lo más simple que puedo hacer en mi escenario es usar los parámetros de la línea de comandos.

Mi pregunta es ¿cómo sugiere elegir los parámetros de la línea de comandos? Quiero decir, ¿debería optar por un enfoque de "posición" o por un enfoque de "etiqueta", por ejemplo:

MyProject.exe -s:MYSERVER -d:DATABASE

o

MyProject.exe MYSERVER DATABASE

En el primer caso, necesito recorrer todos los parámetros usando ParamStr y "decodificar" lo que son. Si comienzan con "-s:" Sé que lo que sigue es el nombre del servidor. El segundo es más rápido y sucio, pero puede ser más efectivo.

¿Cómo gestionar los parámetros que contienen un "espacio"? ¿Es posible interceptarlos automáticamente con ParamStr o debo manejar todo manualmente? (Quiero decir, ¿hay una manera de decirle automáticamente a ParamStr que un parámetro contiene un espacio (como usar llaves o algo)?

cual es la mejor practica?


Delphi contiene una unidad realmente agradable llamada CommandParser con una clase TCommandParser que realiza el análisis de la línea de comandos por ti.
Ya que prácticamente no tiene documentación , aquí hay algunas cosas para comenzar.

Tengo un ejemplo de HiddenExecutable en nuestro repositorio bo de código abierto .

Básicamente usted:

  • configure un TComponent que contenga las propiedades que desea exponer como parámetros de la línea de comandos (es decir, THiddenExecuteSettings en la HiddenExecuteSettingsUnit
  • un controlador de analizador de línea de comandos. En nuestro caso, THiddenExecuteArguments en THiddenExecuteArgumentsUnit (en retrospectiva no es un nombre tan bueno) que contenga un método InitCommandLine que configure una instancia de TCommandParser y le pase su TComponent
  • Luego ejecuta un par de llamadas AddSwitch para configurar los parámetros con los interruptores de línea de comando abreviados y completos (como h y help )
  • Luego puede llamar al método ProcessCommandLine en la instancia de TCommandParser para procesar la línea de comandos y completar las propiedades de su TComponent (en mi ejemplo, esto se hace en el método ProcessCommandLine ).

Ahora viene la diversión:

  • El TCommandParser tiene un método de texto de HelpText que ensambla de forma totalmente automática un texto de ayuda basado en lo que lo alimentó con los métodos AddSwitch .
  • El TCommandParser también tiene un método SaveOptions que le permite guardar la configuración actual de su TComponent en un archivo de configuración.

Las unidades Delphi que necesita son las que puede obtener en el repositorio de demostraciones de 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'',

Edición: John Kaster escribió un buen artículo en EDN que incluye más detalles sobre el uso de TCommandParser .


Separaría Argumentos (basados ​​en orden) y Opciones (basado en conmutador). Ver "c:> copiar ayuda" por ejemplo.


Tu primera pregunta es simplemente una cuestión de gusto. Sin embargo, el segundo que puedo responder. Utiliza comillas dobles para encerrar un parámetro que contiene espacios. Por ejemplo, si tiene

program Project1; {$APPTYPE CONSOLE} uses SysUtils; var i: integer; begin for i := 0 to ParamCount do WriteLn(ParamStr(i)); Readln; end.

e inicie la aplicación con los argumentos one "two with spaces" three "four with spaces" , luego obtendrá la salida

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