Копия таблицы в файле
Пользовательские таблицы находятся в оперативной памяти и могут содержать важную информацию, которая не должна пропасть при выключении программы или неожиданных сбоях (например, по питанию). Как организовать регулярное сохранение таблицы на жесткий диск?
Первое, что приходит в голову - на каждой итерации сохранять таблицу в файл. Способ надежный, но подразумевает много бесполезной работы. Не на каждой итерации таблица будет изменяться - перезапись файла впустую будет расходовать ресурсы.
Значит, имеет смысл при каждом изменении таблицы устанавливать флаг, сигнализирующие об этом. Запись в файл производить только в случае наличия этого флага.
Флаг можно иметь в виде обычной переменной и после каждого вызова функции, изменяющей содержимое таблицы (например, AmiSharp.SetCellName) устанавливать его. Можно сделать универсально.
Переопределяем функцию SetCellName:
function SetCellName(Table,Column,Row,Value)
{ Local Result; if ( (Result = IsTableExists(Table)) == "1")
{ AmiSharp.SetCellName(Table,Column,Row,Value);
StaticVarInc(Table + "~Changed");
}
Return Result;
}
Для записи таблицы пишем новую функцию WriteTable:
function WriteTable(Table,TableFileName)
{ Local Result; Result = "0"; if (NZ(StaticVarGet(Table + "~Changed")))
{ Result = AmiSharp.SaveTable(Table,TableFileName);
StaticVarSet(Table + "~Changed",0);
}
return Result;
}
Теперь для любой записи в таблицу посредством SetCellName будет создан флаг (уникальный для каждой таблицы). Функция WriteTable, вызываемая в конце каждой итерации, проверит его наличие и в случае необходимости сделает копию таблицы на диске.