Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Форматирование строки с использованием подстановочных символов

Автор: Dimka Maslov
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Форматирование строки с использованием подстановочных символов %1, %2 и т.д.

Функция заменяет в строке Str все подстроки '%1', '%2', и т.д. На
соответсвующие значения из массива Values. При этом значения этого массива
не должны содержать подстановочных подстрок, в противном случае возможно
зависание функции.

Зависимости: SysUtils
Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        15 мая 2002 г.
***************************************************** }

{Эта функция работает неверно, если в строке, на которую надо
заменить %1,%2,… содержится одна из строк %1,%2,…
( она зависнет в бесконечном цикле )}

function FmtString(const Str: string; const Values: array of string): string;

  function InternalPos(SubStr: string; Str: PChar; out P: Integer): Integer;
  var
    Ptr: PChar;
  begin
    Ptr := StrPos(Str, PChar(SubStr));
    if Ptr = nil then
      Result := -1
    else
      Result := Integer(Ptr) - Integer(Str);
    P := Result;
  end;

  function InternalReplace(const Str, OldSub, NewSub: string): string;
  var
    PrePos: Integer;
    CurPos: Integer;
    OldLen, NewLen: Integer;
  begin
    PrePos := 1;
    Result := Str;
    OldLen := Length(OldSub);
    NewLen := Length(NewSub);
    while InternalPos(OldSub, @Result[PrePos], CurPos) >= 0 do
    begin
      Inc(PrePos, CurPos);
      Delete(Result, PrePos, OldLen);
      Insert(NewSub, Result, PrePos);
      Inc(PrePos, NewLen);
    end;
  end;

var
  i: Integer;
begin
  Result := Str;
  for i := High(Values) downto Low(Values) do
    Result := InternalReplace(Result, '%' + IntToStr(i + 1), Values[i]);
end;

Пример использования:

FmtString('%1 %2', ['Пример', 'использования']);
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay