2009-05-07 36 views
13

Nó không dễ dàng hơn nhiều so với việc sử dụng getopt() để phân tích các tham số dòng lệnh trong C/C++.Có triển khai "getopt" cho Delphi không?

Có điều gì tương tự với Delphi không? Hay lý tưởng, với cùng một cú pháp? Tôi biết Delphi hỗ trợ FindCmdLineSwitch và ParamStr(), nhưng vẫn yêu cầu một số phân tích cú pháp bổ sung.

Tôi muốn một cái gì đó hoạt động như getopt() trong C. Cái gì đó dễ dàng cho phép chuyển đổi cơ bản chuyển đổi, cũng như chụp một giá trị sau khi chuyển đổi. Xem dưới đây đối với một số mã ví dụ C để xem những gì tôi đang nói về:

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; 
       } 
     } 

Trả lời

10

Có một thực TGetOpt, tự xưng

thực hiện một biến thể getopt cho Delphi. Nó gần tương thích POSIX, hỗ trợ các tùy chọn dài, bắt buộc, tùy chọn và không có đối số

Bạn có thể tìm thấy nó here.

+0

Bạn nên thay thế * tại đây * bằng thứ gì đó như [Sandkasten: các thường trình hữu ích cho các chương trình Delphi | stefan.huberdoc.at] (https://stefan.huberdoc.at/sandkasten/) - ai biết trang web có thể đi, và sau đó * ở đây * sẽ không hữu ích. ... cũng làm rõ rằng TGetOpt đến ** được bao gồm trong bộ sưu tập **. – Wolf

+0

@Wolf: Tôi không nghĩ rằng sẽ thêm bất cứ điều gì, vì trình duyệt sẽ vẫn hiển thị mục tiêu liên kết và cho phép sao chép nó vào khay nhớ tạm ngay cả khi liên kết bị hỏng. Dù sao, toàn bộ câu trả lời là của một loại mà đã trở thành không phù hợp cho SO (liên kết với các nguồn lực bên ngoài), và tôi không thực sự muốn đẩy nó lên đến trang đầu bằng cách chỉnh sửa nó. – mghie

+0

Tôi hiểu. Mặt khác, tôi thường thấy các mục tiêu liên kết biến mất nhưng nội dung của chúng bị di chuyển, trong những trường hợp này tiêu đề trang hoàn toàn hữu ích. Nhưng đây không phải là lý do duy nhất, bạn có thể có một cái nhìn tại [Tại sao Liên kết của bạn không bao giờ nên nói "Click vào đây" - Smashing Magazine] (http://www.smashingmagazine.com/2012/06/links-should-never- say-click-đây /) – Wolf

2

Không có gì được tích hợp sẵn - nhưng bạn có thể làm cho một thiết bị dễ dàng. Điều này cần được gần gũi với những gì bạn đang sử dụng để

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

Có những "Gastown Delphi Command Line Parser" mà gần đây đã được mã nguồn mở (ví dụ on Torry's). Tôi chưa bao giờ sử dụng nó, vì vậy tôi không thể bình luận về nó.

+0

Tôi có thể tìm nguồn ở đâu? Tôi googled, nhưng không có may mắn. – Mick

+0

Rất tiếc, ngồi chính thức biến mất. Nhưng http://www.vclcomponents.com/Delphi/System_Components/Gastown_Command_Line_Parser-info.html trông kosher với tôi. Có thể http://groups.google.de/group/borland.public.delphi.thirdpartytools.general/browse_frm/thread/1de12d1ad4f08f7 cũng giúp ích. –

3

Điều gì sai về FindCmdLineSwitch trong đơn vị SysUtils?

if FindCmdLineSwitch('h',['-'],false) then 
    Print_Help(); 
if FindCmdLineSwitch('v',['-'],false) then 
    print_Version(); 

bạn sẽ phải lặp qua các params để có được những giá trị, nhưng thats khá đơn giản để làm:

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

Getopt cho phép bạn kết hợp nhiều tùy chọn vào một đối số duy nhất. Nó cũng cho phép bạn chắc chắn rằng bạn đang xử lý các đối số theo thứ tự. Nó có các điều khoản đặc biệt để cho phép các đối số trông giống như các tùy chọn nhưng thực sự là tên tệp (chẳng hạn như mở một tệp có tên là "-f" trong ví dụ của bạn ở trên). –

+0

ah, nhưng nếu ai đó có một -f làm tên tệp, và -f là một tham số, thì làm sao nó biết được cái nào? – skamradt

+1

-f "-f" Lưu ý rằng bạn có thể chỉ định nếu một tùy chọn có tham số hay không. –

10

Các getopts.pp tập tin của FPC RTL là khép kín Delphi (Delphi2009 bao gồm) đơn vị tương thích triển khai getopt:

Triển khai Getopt cho Pascal miễn phí, được mô hình hóa sau GNU getopt

unit có sẵn tại kho FPC SVN.

7

Xem TCommandParser, được mô tả trong bài viết EDN http://edn.embarcadero.com/print/40404 này và có sẵn để tải xuống trên CodeCentral http://cc.embarcadero.com/item/27574. TCommandParser cũng nên được bao gồm trong bản demo Delphi bây giờ. Tôi đã tạo mã tự do cho Embarcadero trước khi tôi rời đi, vì vậy hy vọng chúng sẽ bao gồm nó trong khung công tác hoặc một cái gì đó giống như nó ở một thời điểm nào đó.

+4

Xin lỗi, tôi quên - CommandParser thực sự là * kèm theo * với bản demo Delphi có sẵn từ IDE. –

+0

Tôi không thể tìm thấy 'CommandParser' trong các mẫu được bao gồm, @ john-kaster. Ngoài ra, các liên kết đã bị hỏng kể từ khi bạn đăng câu trả lời của mình. Bất kỳ ý tưởng nào mà tôi có thể tìm thấy lớp học của bạn ngay bây giờ? – BigSmoke

+0

@BigSmoke cả hai liên kết đó vẫn hoạt động với tôi. Xin lỗi nó vẫn chưa có trong bản demo. Dưới đây là một số thông tin khác về nó. https://wiert.me/2015/05/13/on-the-delphi-tcommandparser-class-for-parsing-command-lines-and-arguments-via-suggestions-for-how-to-define-command- line-parameters-stack-overflow/ –

2

Ngoài ra còn có một trình phân tích cú pháp mới có tên là delphi-argparse có liên quan đến câu hỏi này.

1

Trình phân tích cú pháp dựa trên thuộc tính cho Delphi có thể được tìm thấy here.

+0

Tôi nghĩ tiêu đề trang sẽ an toàn hơn trong tương lai * ở đây * - ví dụ [The Delphi Geek: Phân tích dòng lệnh dựa trên thuộc tính] (http://www.thedelphigeek.com/ 2014/12/thuộc tính-based-command-line-parsing.html) – Wolf

Các vấn đề liên quan