Есть ли реализация "getopt" для Delphi? - PullRequest
13 голосов
/ 07 мая 2009

Это не намного проще, чем использовать getopt () для разбора параметров командной строки в C / 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;
                }
        }

Ответы [ 8 ]

10 голосов
/ 07 мая 2009

Файл getopts.pp для FPC RTL является автономным совместимым с Delphi (включая Delphi2009) модулем, реализующим getopt:

Реализация Getopt для Free Pascal, по образцу GNU getopt

Устройство доступно в хранилище FPN SVN.

10 голосов
/ 07 мая 2009

Есть реализация TGetOpt, претендующая на

реализовать вариант Getopt для Delphi. Он почти POSIX-совместим, поддерживает длинные опции, обязательные, необязательные и без аргументов

Вы можете найти его здесь .

7 голосов
/ 20 августа 2012

См. TCommandParser, описанный в этой статье EDN http://edn.embarcadero.com/print/40404 и доступный для загрузки на CodeCentral http://cc.embarcadero.com/item/27574. TCommandParser теперь также должен быть включен в демонстрационные версии Delphi. Я сделал код свободно доступным для Embarcadero перед тем, как уйти, так что, надеюсь, они когда-нибудь включат его в фреймворк или что-то подобное.

3 голосов
/ 07 мая 2009

Что плохого в 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
2 голосов
/ 20 декабря 2013

Существует также новый синтаксический анализатор delphi-argparse , который имеет отношение к этому вопросу.

2 голосов
/ 07 мая 2009

Ничего встроенного - но вы можете сделать его довольно легко. Это должно быть близко к тому, что вы привыкли

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;
1 голос
/ 15 декабря 2014

Парсер на основе атрибутов для Delphi можно найти здесь .

0 голосов
/ 07 мая 2009

Это «Парсер командной строки Gastown Delphi», который недавно был открыт (например, на Torry's ). Я никогда не использовал его, поэтому не могу комментировать.

...