Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как в Paradox заставить все изменения сохранить физически... [D5, Paradox]


USAtyj ©   (2003-07-01 11:29:00) 

Ситуация такая:
Есть программулина, которая работает с парадоксовскими таблицами. По окончании программы хочу сжимать все таблицы в один файл (zip-архив), чтоб пользователь видел только один файл. При запуске программы таблицы распаковываются и с ними идет работа. НО! Пока приложение не закончит свою работу, физически файлы не изменяются, т.е. я архивирую файлы со старыми данными, а уже потом все данные реально сливаются в файлы.
Все таблицы в DataModule, на уничтожение DataModule делаю FlushBuffers для каждой таблицы. Но это не помогает.
Кто-что может посоветовать.
Заранее спасибо.


USAtyj   (2003-07-01 15:22:00) [1]

2 Семен Сорокин:
вы были правы, мне почему-то казалось "по умолчанию", что датамодуль уничтожается раньше, чем пакую, поскольку пакую ужо савсем в конце, а трассировкой лишний раз поленился. Щас протрассировал - пакует раньше.
Это называется тупостью от лени.
Всем спасибо.


VAleksey   (2003-07-01 15:12:00) [2]

1) Вообще dbiSaveChanges - принудительно сбрасывает буфер на диск.
2) Установка Local Share в BDE Administrator заставит BDE сбрасывать кэш после любых изменений.
3) У тебя Delphi в этот момент запущено?


Семен Сорокин   (2003-07-01 15:10:00) [3]

USAtyj (01.07.03 15:02)
дело в том что, скорее всего, твой DataModule удаляется позже того как у тебя происходит архивация данных, поэтому в архив попадают "файлы со старыми данными"


gek   (2003-07-01 15:08:00) [4]

Семен Сорокин © (01.07.03 13:49)
не зря-то спрашивал.


А функция, в которой просиходит архивация, вызывается уже после
Application.Run;



Вот и вызови ее после FlushBuffers
т.е. после цикла


VAleksey   (2003-07-01 15:07:00) [5]


> USAtyj (01.07.03 15:02)

Капец.
А ты трассировкой пройдись и посмотри в какой последовательности и что у тебя работает.


USAtyj   (2003-07-01 15:02:00) [6]

FlushBuffers вызывается OnDestroy для DataModule.
А функция, в которой просиходит архивация, вызывается уже после
Application.Run;


Семен Сорокин   (2003-07-01 13:49:00) [7]

и все-же, когда программно вызывается архиватор?
сразу после приведенного блока, или из другого места?


gek   (2003-07-01 13:29:00) [8]

Можно так попробовать, может получится


(Components[i] as TTable).Active:=true;
(Components[i] as TTable).FlushBuffers;
(Components[i] as TTable).Active:=false;
(Components[i] as TTable).DatabaseName:="";
(Components[i] as TTable).TableName:="";


USAtyj   (2003-07-01 13:13:00) [9]

FlushBuffers как раз и вызывает dbisavechanges().
Но не помогает все равно.
Но если делать изменения с помощью sql-запросов, тогда обновления сразу в файл записываются.


gek   (2003-07-01 12:26:00) [10]


> for i:=0 to ComponentCount-1 do
> if Components[i] is TTable then
> begin
> (Components[i] as TTable).Open;
> dbisavechanges( (Components[i] as TTable).handle);
> (Components[i] as TTable).Close;
> end;


USAtyj   (2003-07-01 11:57:00) [11]

Вот код на уничтожении:

for i:=0 to ComponentCount-1 do
if Components[i] is TTable then
begin
(Components[i] as TTable).Open;
(Components[i] as TTable).FlushBuffers;
(Components[i] as TTable).Close;
end;

Компоненты Database у меня нет. У меня просто для каждой таблицы в свойстве DatabaseName прописывается при запуске путь к каталогу, в котором таблицы.


Семен Сорокин   (2003-07-01 11:35:00) [12]

на уничтожение DataModule делаю FlushBuffers для каждой таблицыа упаковка идет после уничтожения?
делай DataBase.Close


Наверх

Титульная страница Поиск, карта сайта Написать письмо