Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.173.48.18] |
|
Сообщ.
#1
,
|
|
|
Format без SysUtils
Сразу оговорюсь, что это не полный аналог Format, с немного другим синтаксисом (несовместимым - можно применять, если все строки форматирования находятся внутри программы). Используется системная функция FormatMessage. Поддерживаются подстановки строк, целых и pointer-to-hex; поддерживаются спецификаторы ширины и точности. Вещественные числа, региональные установки - не поддерживаются. Код // Частично позаимствовано из SysUtils.SysErrorMessage function FormatWinapi(const Patt: string; const Args: array of const): string; var Buffer: PChar; Len, i: Integer; InternalArgs: array of Pointer; begin SetLength(InternalArgs, Length(Args)); for i := Low(InternalArgs) to High(InternalArgs) do InternalArgs[i] := Pointer(Args[i].VPointer); Len := FormatMessage( FORMAT_MESSAGE_FROM_STRING or FORMAT_MESSAGE_ARGUMENT_ARRAY or FORMAT_MESSAGE_ALLOCATE_BUFFER, PChar(Patt), 0, 0, @Buffer, 0, Pointer(InternalArgs)); try { Convert to Delphi string } SetString(Result, Buffer, Len); finally { Free the OS allocated memory block } LocalFree(HLOCAL(Buffer)); end; end; Применение MemLog.Lines.Add(FormatWinapi('Мама мыла %1.%nВымыто %2!.2d!%%.%nApplication находится по адресу %3!p!.', ['раму', 9, Application])); Результат Мама мыла раму. Вымыто 09%. Application находится по адресу 7EF49E00. Обработка ошибок Функция FormatMessage возвращает 0 при ошибке, код ошибки получается через GetLastError. Поскольку мы избавляемся от SysUtils, никаких классов исключений не объявлено, и rais-ить ошибку мы не можем. Варианты решения: 1) Проверять GetLastError после вызова FormatWinapi. 2) Проверять результирующую строку после вызова FormatWinapi (при ошибке она будет пуста). 3) Создать собственный класс Exception и rais-ить его. Инфо: FormatMessage printf Type Field Characters |