Получение параметра из строки по его индексу

Материал из 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