Вверх ↑
Этот топик читают: Гость
Ответов: 95
Рейтинг: 4
#1: 2022-07-07 17:51:29 ЛС | профиль | цитата
Вот я вам сделал очень полезный компонент. Не буду повторять ошибок своих и засовывать свои компоненты в раздел Компоненты (из-за чего потом количество страниц вырастало до 2 или более), так-что выложил сюда.
Компонент позволяет добавлять ключи, и доставать их значения.
Теперь вместо, например, простого "bmp2png file.bmp file.png", можно сделать "bmp2png -i file.bmp -o file.png". Причём, порядок можно изменить.
Как использовать

Нажмите два раза на компонент, чтобы зайти в свойство Args. (понятно дело, сделать это можно и просто зайдя в свойства элемента) Добавьте туда столько ключей, сколько нужно.
Теперь необязательно вы можете изменить префикс, поменяв свойство Prefix.
Появятся нижние точки с названиями ключей.
Возможные значения

NULL - ключ не присутствует
Пустая строка - ключ присутствует без значения (это происходит если он является последним или после него какой-либо другой ключ)
Строка - ключ присутствует со значением
Пример

Add(Console,2953706,21,105)
{
link(onStart,908929:doLoad,[(97,111)(97,125)])
}
Add(ArgParser,156681,140,49)
{
Args=#1:i|1:o|
}
Add(PictureStream,908929,140,119)
{
link(onLoad,3406362:doEvent1,[])
link(FileName,156681:i,[])
}
Add(PNG,1936082,224,119)
{
Point(doLoadFromBitmap)
Point(FileName)
link(FileName,156681:o,[(230,100)(153,100)])
}
Add(Hub,3406362,189,119)
{
link(onEvent1,1936082:doLoadFromBitmap,[(213,125)(213,139)])
link(onEvent2,1936082:doSave,[])
}
Буду рад исправить любые найденные ошибки.

Редактировалось 3 раз(а), последний 2022-07-08 16:19:09
карма: 0

1
файлы: 1ArgParser.zip [1.5KB] [281]
Голосовали:andrestudio
vip
#1.1контекстная реклама от партнеров
Ответов: 245
Рейтинг: 4
#2: 2022-07-08 15:47:49 ЛС | профиль | цитата
а пример есть, для чего это и как работает.
карма: 1

0
Ответов: 95
Рейтинг: 4
#3: 2022-07-08 16:19:20 ЛС | профиль | цитата
Добавлен простой пример.
карма: 0

0
Ответов: 5227
Рейтинг: 586
#4: 2022-07-09 15:32:22 ЛС | профиль | цитата
TheRenat, Несомненно получать ключи гораздо удобней чем через массив.
Есть правда некоторые замечания (несущественные)
Свойствo Args логичней будет Keys(т.е список ключей)
к примеру я попробовал такой вариант (правда для FPC нужно подшаманить)
Так же желательно сделать приведение к типу (допустим по первому символу ключа -sInput = string, -iCount = integer)
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

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]);
if LstParam.IndexOf(s2) = -1 then
LstParam.Add(s2)
end;
FLoadParam := True;
end;

procedure THIArgParser.SetKeys(Value: string);
begin
LstKeys := NewStrList;
LstParam := NewStrList;
LstParam.NameDelimiter := ' ';
LstKeys.Text := Value;
end;

procedure THIArgParser._var_Keys;
var
s: string;
idx: integer;
begin
if not FLoadParam then LoadParam;
s := LstKeys.Items[Index];
idx := LstParam.IndexOfName(s);
if idx = -1 then //ключ отсутствует
begin
dtNull(_Data);
Exit;
end;

s := LstParam.LineValue[idx];
dtString(_Data,s);
end;

end.

ini:
[About]
Version=1.4
Author=TheRenat
Mail=

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

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

p.s Видимо пользователям разработчики уже не нужны. Видать всё можно нарисовать уже кубиками, через жопу конечно но почти всё

Редактировалось 4 раз(а), последний 2022-07-10 09:41:14
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 5227
Рейтинг: 586
#5: 2022-07-09 21:29:54 ЛС | профиль | цитата
Выявилась ошибка в модуле If_arg.pas которая не даст выявить отсутствие аргумента который возвращает NULL
проверяется такой схемой

Add(MainForm,2953706,49,189)
{
link(onCreate,15379570:doCompare,[])
}
Add(Message,1945327,224,203)
{
}
Add(Debug,15459615,133,147)
{
link(Data,5590292:Value,[])
}
Add(If_else,15379570,133,203)
{
Type=5
link(onTrue,13817132:doEvent,[])
link(Op1,15459615:Var,[])
link(Op2,11391950:Var,[(146,181)(167,181)])
}
Add(Memory,6511753,189,84)
{
}
Add(Debug,11391950,161,154)
{
link(Data,6511753:Value,[(167,127)(195,127)])
}
Add(Debug,13817132,189,203)
{
link(onEvent,1945327:doMessage,[])
}
Add(Memory,5590292,133,84)
{
}

карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 5227
Рейтинг: 586
#6: 2022-07-10 09:35:52 ЛС | профиль | цитата
Пока у себя так поправил
      //data_null: Result := _IsType(op2) = data_null;
data_null:
begin
case OpType of
0: if _IsType(op2) = data_null then Result := True else Result := False;
5: if _IsType(op2) <> data_null then Result := True else Result := False;
1,2,3,4: Result := _IsType(op2) = data_null;
end;
end;

Редактировалось 1 раз(а), последний 2022-07-10 09:39:32
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 2059
Рейтинг: 131
#7: 2022-07-10 09:36:26 ЛС | профиль | цитата
andrestudio писал(а):
Выявилась ошибка в модуле If_arg.pas которая


Я в суть дела не вдавался.
Только из больницы зашёл домой....(в другом посте напишу)
Короче Склифосовский, - ты такой же придурок, как и я СЕР!
За что люблю и УВАЖАЮ!

Редактировалось 1 раз(а), последний 2022-07-10 09:45:06
карма: 6

0
Ответов: 5227
Рейтинг: 586
#8: 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

Редактировалось 1 раз(а), последний 2022-07-10 10:02:48
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 5227
Рейтинг: 586
#9: 2022-07-10 16:31:05 ЛС | профиль | цитата
и ещё по параметрам типа String. В моей модификации параметры имеющие пробелы, запятые не обрезаются.
К примеру такой параметр -s Hello, word!
будет валидным и вернётся неизменным, что не скажешь про штатный вариант.

Редактировалось 3 раз(а), последний 2022-07-10 16:32:43
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
9
Сообщение
...
Прикрепленные файлы
(файлы не залиты)