Вверх ↑
Ответов: 5227
Рейтинг: 587
#1: 2022-07-10 09:51:35 ЛС | профиль | цитата
Доработал до рабочей версии (работает в FPC)
Аргументы преобразуются в типы Real,Integer,String автоматически при парсинге параметров
pas:

unit hiArgParser;

interface

uses Kol,Share,Debug,Windows;

type
THIArgParser = class(TDebug)
private
LstKeys: PStrList;
LstParam: PStrList;
FLoadParam: boolean;
procedure SetKeys(Value: string);
procedure LoadParam;
public
_prop_Prefix: string;
destructor Destroy; override;
procedure _var_Keys(var _Data: TData; Index: word);
property _prop_Keys: string write SetKeys;
end;

implementation

{$IFDEF F_P}
procedure AdapterFPC(var s: string);
var
i: integer;
begin
for i := 1 to Length(s) do
if s[i] = ' ' then begin s[i] := '='; Exit; end;
end;
{$ENDIF}

function IsReal(const AString: string; out Value: Double): Boolean;
var
i,Code: Integer;
s: string;
begin
s := AString;
for i := 1 to Length(AString) do
if s[i] = ',' then s[i] := '.';
Val(s, Value, Code);
Result := Code = 0;
end;

function IsInteger(const S: string; out Value: Integer): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;

destructor THIArgParser.Destroy;
begin
LstKeys.Free;
LstParam.Free;
inherited;
end;

procedure THIArgParser.LoadParam;
var
i: integer;
s,s2: string;
begin
s := GetCommandLine+' ';
//вырежем имя приложения
s2 := GetTok(s,_prop_Prefix[1]);
for i := 1 to ParamCount do
begin
s2 := GetTok(s,_prop_Prefix[1]);
{$IFDEF F_P}
AdapterFPC(s2);
{$ENDIF}
if LstParam.IndexOf(s2) = -1 then
LstParam.Add(s2)
end;
FLoadParam := True;
end;

procedure THIArgParser.SetKeys(Value: string);
begin
LstKeys := NewStrList;
LstParam := NewStrList;
{$IFNDEF F_P}
LstParam.NameDelimiter := ' ';
{$ENDIF}
LstKeys.Text := Value;
end;

procedure THIArgParser._var_Keys;
var
s: string;
idx: integer;
iInt: integer;
dDbl: Double;
begin
if not FLoadParam then LoadParam;
s := LstKeys.Items[Index];
idx := LstParam.IndexOfName(s);
if idx = -1 then //ключ отсутствует
begin
dtNull(_Data);
Exit;
end;
s := Trim(LstParam.LineValue[idx]);
if IsInteger(s,iInt) then
dtInteger(_Data,iInt)
else if IsReal(s,dDbl) then
dtReal(_Data,dDbl)
else dtString(_Data,s);
end;

end.

ini:

[About]
Version=1.5
Author=TheRenat & andrestudio
Mail=

[Type]
Class=DPLElement
Sub=,,Keys,
Info=Продвинутый парсер аргументов командной строки
Tab=Tools

[Property]
+Keys=Используемые ключи|5|
Prefix=Префикс ключей|2|-

--- Добавлено в 2022-07-10 10:02:48

добавлю по параметрам типа Integer то можно задавать их HEX значениями (удобно например для цветов, адресов и т.д)
например так с префиксом $ $FF или $ff = 255
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Редактировалось 1 раз(а), последний 2022-07-10 10:02:48