Ответ 1
Существует реализация TGetOpt, требующая
реализовать вариант getopt для Delphi. Он почти совместим с POSIX, поддерживает длинные параметры, обязательно, необязательно и без аргументов
Вы можете найти здесь.
Это не намного проще, чем использование getopt() для анализа параметров командной строки в C/С++.
Есть ли что-то подобное для Delphi? Или в идеале, с тем же синтаксисом? Я знаю, что Delphi поддерживает FindCmdLineSwitch и ParamStr(), но для этого все еще требуется дополнительный синтаксический анализ.
Я хочу что-то, что работает как getopt() в C. Что-то, что легко позволяет использовать основные тумблеры, а также фиксировать значение после переключения. Ниже приведен пример кода C, чтобы увидеть, о чем я говорю:
void print_help()
{
printf("usage:\n") ;
printf("\t\t-i set input file\n") ;
printf("\t\t-o set output file\n") ;
printf("\t\t-c set config file\n") ;
printf("\t\t-h print this help information\n") ;
printf("\t\t-v print version\n") ;
}
char* input_file = NULL ;
char *query=NULL;
char opt_char=0;
while ((opt_char = getopt(argc, argv, "i:q:vh")) != -1)
{
switch(opt_char)
{
case 'h':
print_help();
exit(-1);
break;
case 'v':
print_version() ;
exit(-1) ;
break ;
case 'i':
input_file= optarg ;
break ;
case 'q':
query= optarg ;
break ;
default:
print_help();
exit(-1);
break;
}
}
Существует реализация TGetOpt, требующая
реализовать вариант getopt для Delphi. Он почти совместим с POSIX, поддерживает длинные параметры, обязательно, необязательно и без аргументов
Вы можете найти здесь.
Файл getopts.pp файла FPC RTL является автономным компонентом, совместимым с Delphi (Delphi2009), который реализует getopt:
Реализация Getopt для Free Pascal, моделируется после GNU getopt
См. TCommandParser, описанный в этой статье EDN http://edn.embarcadero.com/print/40404 и доступный для загрузки на CodeCentral http://cc.embarcadero.com/item/27574. TCommandParser также должен быть включен в демоверсии Delphi. Я сделал код доступным для Embarcadero до того, как я ушел, поэтому, надеюсь, они будут включать его в рамки или что-то в этом роде в какой-то момент.
Что не так в FindCmdLineSwitch в блоке SysUtils?
if FindCmdLineSwitch('h',['-'],false) then
Print_Help();
if FindCmdLineSwitch('v',['-'],false) then
print_Version();
вам нужно будет выполнить петлю через параметры, чтобы получить значения, но это довольно просто:
if FindCmdLineSwitch('f',['-'],false) then
for ix := 1 to paramcount do
if (paramStr(ix) = '-f') and (ix < paramcount) then
begin
if fileExists( ParamStr(ix+1) ) then
filename := ParamStr(ix+1);
break;
end
Ничего не встроено - но вы можете сделать это довольно легко. Это должно быть близко к тому, что вы используете для
TsoCommandLineParser = class
private
fArguments:TStringList;
public
constructor Create();
destructor Destroy(); override;
function GetOpt(const pArgument:string; const pDefaultValue:string = ''):string;
end;
constructor TsoCommandLineParser.Create();
var
i:Integer;
begin
inherited Create();
fArguments := TStringList.Create();
for i := 1 to ParamCount() do
begin
fArguments.Add(ParamStr(i));
end;
end;
destructor TsoCommandLineParser.Destroy();
begin
fArguments.Free();
inherited Destroy();
end;
function TsoCommandLineParser.GetOpt(const pArgument:string; const pDefaultValue:string = ''):string;
var
i:Integer;
begin
i := fArguments.IndexOfName(pArgument);
if i > -1 then
begin
Result := fArguments.ValueFromIndex[i];
end
else
begin
Result := pDefaultValue;
end;
end;
Существует также новый парсер, называемый delphi-argparse, который имеет отношение к этому вопросу.
Параграф на основе атрибутов для Delphi можно найти здесь.
Там "Gastown Delphi Command Line Parser", который недавно был открыт (например, на Torry's). Я никогда не использовал его, поэтому я не могу его прокомментировать.