Добрый день.
Помогите, пожалуйста, разобраться со скриптом.
Реализовал свою простенькую функцию FormatStr.
Не всегда, но достаточно часто вижу в логах сервера, вот такую ошибку на этот скрипт:
'Ошибка в скрипте Utils в строке 192. Обращение к несуществующему объекту (017C0647 . Read of address 00000028)'.
Utils -- это мой глобальный модуль, а строка 192 -- это завершающий мою функцию
`end;` .
Вот сама функция:
// === Format String ===============================================================================
// =================================================================================================
// Подставляет в строку вместо %s элементы из массива.
// Может принимать элементы для подстановки разных типов (Variant).
// Каждый элемент для подстановки рассматривается внутри функции как тип Variant,
// который затем приводится к строке через VarToStrDef().
// Экранирование процента делается так: '%%' -> '%'.
// Стандартная делфишная функция Format() не поддерживается.
// Пример:
// FormatStr('Процент: %s%%, значение: %s.', [85, 'Ok']);
// => 'Процент: 85%, значение: Ok.'
function FormatStr(const AString: string; const Args: array of Variant): string;
var
I, ArgIndex: Integer;
NextSeq: string;
V: Variant;
begin
Result := '';
ArgIndex := 0;
I := 1;
while I <= Length(AString) do
begin
if (AString[I] = '%') and (I < Length(AString)) then
begin
NextSeq := Copy(AString, I, 2); // например: '%s', '%%', '%x'
if NextSeq = '%%' then
begin
Result := Result + '%';
Inc(I, 2);
end
else if NextSeq = '%s' then
begin
if (Length(Args) > 0) and (ArgIndex <= High(Args)) then
begin
V := Args[ArgIndex];
Result := Result + VarToStrDef(V, '<unsupported>');
Inc(ArgIndex);
end
else
Result := Result + '<missing>';
Inc(I, 2);
end
else // неизвестная последовательность -- оставляем просто '%'
begin
Result := Result + '%';
Inc(I);
end;
end
else
begin
Result := Result + AString[I];
Inc(I);
end;
end;
end;
PS: Странно, что эта функция не поддерживается из коробки. Очень удобно ей пользоваться, например, при формировании sql-запросов с несколькими подстановками.
Вот код вызова, он иногода выполняется без ошибок, а иногда с этой ошибкой по памяти.
Но! Если перед этим кодом добавить строку для записи в виртуальную переменную любого значения, то
всегда работает без ошибок.
Test.Value := 'Ok'; // С этой строкой FormatStr всегда работает без ошибок.
GetVariableByName(FormatStr('Ch%s_PrgName', [ChamberNo])).Value := tblPrograms.GetCell(Ord( colPrgName ), SelRow).Text;
GetVariableByName(FormatStr('Ch%s_BoardWood', [ChamberNo])).Value := tblPrograms.GetCell(Ord( colPrgBoardWood ), SelRow).Text;
GetVariableByName(FormatStr('Ch%s_BoardThk', [ChamberNo])).Value := StrToInt( tblPrograms.GetCell(Ord( colPrgBoardThk ), SelRow).Text );