Работа с базами
Есть маленькая программа для работы с базами. Надо чтобы при её каждом открытии она проверяла все свои базы с которыми работает, а их не так много(6-15) и если какая-нибудь база не найдена, выдавала сообщение об ошибке и о востановлении базы из архива. И если можно, как сделать, чтобы через какое-то время, которое задаёт пользователь, программа автоматически сохраняла себя в архиве. Помогите чайнику, плз!
procedure CheckTables;
var
i integer;
begin
with DataModule1 do begin
for i = 0 to ControlCount - 1 do
if Controls is TTable then begin
if not FileExists ((Controls as TTable {TQuery}).TableName then
// Восстановление из архива
end;
end;
end;
А на открытие/закрытие можно сделать так
procedure SetDbState (DbState boolean);
var
i integer;
begin
with DataModule1 do begin
for i = 0 to ControlCount - 1 do
if Controls is TTable then
(Controls as TTable).Active = State;
end;
end;
Обе процедуры перебирают все TTable'ы в DataModule и первая проверяет, что такая таблица физически существует на диске, а вторая - для всех устанавливае свойство Active (т.е. открывает или закрывает их).
Теперь что касается архива. Основная проблема в том, чтобы прога н еначала себя архивировать, скажем, в тот момент, когда пользователь редактирует накладную (или вообще меняет данные). Зесь есть два варианта.
1-й - отслеживать текущее состояние программы, и если в данный момент это не допустимо, не запускать архиварование. Реалтзуется технически достаточно просто (обыкновенной глобальной переменной), но муторно.
2-й вариант - отключать таймер перед наступлением такого события, кога база архивироваться не должна. Например, пользователь меняет данные
Timer1.Enabled = FALSE;
DoSomethingUseful;
Timer1.Enabled = TRUE;
Само архивирование при этом будет прописано в Timer1.OnTimer.
Недостаток обеих подходов в том, что реальный интервал между архивациями может значительно отличаться и зависеть от интенсивности работы пользователя. Можно немного усложнить это всё, например, не отключать таймер, а при срабатывании устанавливать какую-то глобальную переменную (например, TimeToArchivate = TRUE). После этого каждый раз, когда состояние базы допускает архивацию, проверять значение этой переменной и, если она имеет значение TRUE, запускать архивацию, которая установит её обратно в FALSE. Проверку эту можно делать, например, после каждого поста. Но в любом случае жёстко выдерживать интервал архивации не удасться, иначе вам придётся принудительно откатывать все сделанные пользователям изменения (при вставке новой записи, например), что мало какому пользователю понравится.