Получение параметра из строки по его индексу
Материал из DRKB
Получение параметра из строки по его индексу[править | править код]
{ **** UBPFD *********** by kladovka.net.ru ****
>> Получение параметра из строки по его индексу, а также получение общего числа параметров в строке
В юните представлены две функции, одна из которых, GetParamFromString, позволяет получить параметр из строки, по индексу этого параметра (индексация начинается с 1). Параметров в строке, я называю части строк, разделённые каким-нибудь оговорённым разделителем, например символом ";".
К пример строка "fex;9x-1;code" имеет три параметра:
fex
9x-1
code.
Описание аргументов функции GetParamFromString:
SourceStr - строка, содержащая в себе параметры;
Delimiter - разделитель параметров в строке;
Ind - индекс запрашиваемого параметра.
Функция GetParamsCount просто возвращает количество параметров в строке.
Описание аргументов функции GetParamsCount:
SourceStr - строка, содержащая в себе параметры;
Delimiter - разделитель параметров в строке;
Зависимости: Windows
Автор: VID, ICQ:132234868, Махачкала
Copyright: (c) не моё
Дата: 26 апреля 2004 г.
********************************************** }
unit getstrparam;
interface
uses Windows;
function GetParamsCount (const SourceStr, Delimiter:String): integer;
function GetParamFromString(const SourceStr,Delimiter:String; Ind:integer):string;
implementation
function GetDTextItem(DText, delimeter: PChar; var idx: Integer): PChar;
var
nextpos: PChar;
i, len, p: Integer;
begin
Result := DText;
len := Length(delimeter);
if (len = 0) or (DText = '') then Exit;
i := 1;
while True do
begin
p := Pos(delimeter, Result);
if (p <> 0) then
nextpos := Pointer(Integer(Result) + p - 1)
else
nextpos := Pointer(Integer(Result) + Length(Result));
if (i = idx) or (p = 0) then Break;
Result := Pointer(Integer(Nextpos) + len);
Inc(i);
end;
if i = idx then
Byte(nextpos^) := 0
else
Byte(Result^) := 0;
end;
function GetDTextCount(DText, delimeter: PChar): Integer;
var
subpos: PChar;
i, len: Integer;
begin
result := 0;
len := Length(delimeter);
if (len = 0) or (DText = '') then Exit;
subpos := DText;
i := Pos(delimeter, subpos);
while i <> 0 do
begin
Inc(Result);
subpos := Pointer(Integer(subpos) + i + len - 1);
i := Pos(delimeter, subpos);
end;
if (Byte(subpos^)) <> 0 then Inc(Result);
end;
function GetParamsCount(const SourceStr, Delimiter: string): Integer;
begin
Result := GetDTextCount(PChar(SourceStr), PChar(Delimiter));
end;
function GetParamFromString(const SourceStr, Delimiter: string; Ind: Integer): string;
var
TmpS, TmpRes: PChar;
LRes: Integer;
begin
GetMem(Tmps, Length(SourceStr)+1);
try
CopyMemory(Tmps, PChar(SourceStr), Length(SourceStr));
Byte(Pointer(Integer(Tmps) + Length(SourceStr))^) := 0;
TmpRes := GetDTextItem(TmpS, PChar(Delimiter), Ind);
LRes := Length(TmpRes);
SetLength(Result, LRes);
CopyMemory(@Result[1], TmpRes, LRes);
finally
FreeMem(TmpS);
end;
end;
end.
Пример использования:
ShowMessage(GetParamFromString('1;2a;3;4', ';',2));
ShowMessage(IntToStr(GetParamsCount('1;2;3;4', ';')));
Source: kladovka.net.ru
ID: 00172