Аргументы преобразуются в типы 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