Для удобства я написал такую функцию
{ упрощенная реализация форматированного вывода
fmt содержит подстановки:
% - очередной аргумент (string, integer, boolean, single, double, extended)
%% - процент
формат вывода чисел по умолчанию (как в системе)
если в массиве аргументов не хватает или больше, чем надо, ничего не происходит
если в массиве неподдерживаемый аргумент, выводится знак вопроса
использование:
S := format('% % + % = %',['Результат', 1, 2, 1+2]);
S = 'Результат 1 + 2 = 3';
}
function format(const fmt : string; args : array of const) : string;
var
position : integer;
argpos : integer;
Ch : string;
V : Variant;
S : string;
VR : TVarRec;
TS : string;
type TPS = ^string;
begin
Result := '';
position := 0;
argpos := 0;
while position <= length(fmt) do begin
inc(position);
Ch := fmt[position];
if Ch <> '%' then begin
// все, кроме %, копируется на выход
Result := Result + Ch;
continue;
end;
if position < length(fmt) then // добавлено 12.01.25: этой проверки не было, возможно, проблема с SQL была тут
Ch := fmt[position+1];
if Ch = '%' then begin
// задвоенный % - это просто %
Result := Result + '%';
inc(position);
continue;
end else if argpos < length(args) then begin
// поочередный вывод аргумента
VR := args[argpos];
inc(argpos);
// в зависимости от типа аргумента
case VR.VType of
vtInteger : S := IntToStr(VR.VInteger);
vtBoolean : if VR.VBoolean then S := 'true' else S := 'false';
vtChar : S := VR.VChar;
vtExtended : S := FloatToStr(VR.VExtended^);
17 {!string!} : S := TPS(@args[argpos-1])^;
else // неизвестно что
S := '?';
end;
Result := Result + S;
end;
end;
end;
В ней всё прекрасно, кроме того, что "законными" средствами добраться до строки в массиве параметров невозможно, пришлось использовать грязный хак (см. пометку !string!). Не могли бы вы пояснить, почему обычный, то есть
S := VR.VString^, не работает? И почему vtString в case тоже не даёт доступ к строке?
Предполагаю, что каким-то образом использование этой функции при построении запросов и влияло, но каким именно - не выяснил.