procedureTForm1.Table1AfterPost(DataSet: TDataSet);
begin
DbiSaveChanges(Table1.handle);
end;
При таком способе можно не беспокоиться насчет потерь данных в случае потери питания или сбоя системы, которое может произойти после обновления записи.
DbiSaveChanges также можно использовать для того, чтобы временную таблицу (созданную с помощью DbiCreateTempTable) сделать постоянной.
Эта функция не применима к таблицам SQL.
DbiUseIdleTime:
DbiUseIdleTime может быть вызвана, если «Windows Message Queue» (очередь запросов Windows) пуста. Это позволяет Database Engine сохранить на диске «грязные буферы». Другими словами, выполняется операция DbiSaveChanges, но применительно ко ВСЕМ измененным таблицам. Тем не менее, данная операция не обязательно должна выполняться после каждого обновления записи, ее нужно приберечь для «холостого» периода (период простоя, idle).
В Delphi это может быть использовано таким образом (добавьте dbiProcs в список используемых модулей):
procedureTForm1.FormCreate(Sender: TObject);
begin
Application.onIdle := UseIdle;
end;
procedureTform1.UseIdle(Sender: TObject; varDone: Boolean);
begin
DbiUseIdleTime;
end;
Некоторые замечания:
Использование обоих вызовов DbiUseIdleTime и DbiSaveChanges (после каждого обновления записи) излишне и сопровождается необязательными вызовами функций. Если приложение выполняет множественный ввод новых записей или их редактирование в течение небольшого периода времени, рекомендуем осуществлять вызов функции DbiUseIdleTime во время простоя клинта, а вызов DbiSaveChanges после осуществления «пакета» обновлений.
В случае, если в таблице выполняется не слишком много изменений, клиент может использовать вызов DbiSaveChanges после каждого постинга или же «повесить» на таймер вызов DbiUseIdleTime.
Sergei Dubarevпишет:
Ваши "Советы…" — классная штука. Столько всего вкусного! :-) Со своей стороны хочу предложить несколько тормозной и местами упрощенный, но все же рабочий ;), алгоритм UUE кодирования (см. аттач). Не вершина искусства, но все же… :)
Для того, чтобы ОНО заработало, необходимо создать проект в составе:
Форма (form) — 1 шт. Поле ввода (edit) — 2 шт., используются события OnDblClick. Кнопка (button) — 1 шт., используется событие OnClick. Диалог открытия файла (Open Dialog) — 1 шт. Диалог сохранения файла (Save Dialog) — 1 шт.
Имена файлов будут вводится либо вручную, либо из диалога (double-click на поле ввода edit), причем в edit1.text должно лежать имя входного файла, в edit2.text — выходного. По нажатии кнопки пойдет процесс, который завершится сообщением "DONE."
Всего хорошего.
P.S. Функция toanysys обнаружена в книге "Для чего нужны и как работают персональные ЭВМ" от 1990 г. Там она присутствует в виде программы на BASIC'e.
P.P.S. Для стимулирования фантазии читателей "Советов…" высылаю так же мессагу из эхи, на основе которой я сваял свое чудо.
Файл Unit1.pas
//UUE кодирование
unitUnit1;
interface
usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ExtDlgs, StdCtrls;
typeTForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedureEdit1DblClick(Sender: TObject);
procedureEdit2DblClick(Sender: TObject);
procedureButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
varForm1: TForm1;
implementation
{$R *.DFM}
const
ssz = (High(Cardinal) - $F) divsizeof(byte);//эта константа используется при выделении памяти
p: string = '0123456789ABCDEF';//эта константа используется функцией toanysys
//выбор входного файла
procedureTForm1.Edit1DblClick(Sender: TObject);
begin
ifopendialog1.execute thenedit1.text:= opendialog1.filename;
end;
//выбор выходного (UUE) файла
procedureTForm1.Edit2DblClick(Sender: TObject);
begin
ifsavedialog1.execute thenedit2.text:= savedialog1.filename;
end;
//выделение подстроки
functionmid(s: string; fromc, toc: byte): string;
var
s1: string;
i : byte;
begin
s1:= '';
fori:= fromc totoc dos1:= s1+s[i];
mid:= s1;
Читать дальше