Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

var

 Fields: TList;

 KeyValues: Variant;

 KeyNames: String;

 Bmk: TBookmark;

 I: Integer;

 BookmarkFound: Boolean;

 CanLocate: Boolean;

begin

 Fields := TList.Create;

 if KeyFields = '' then KeyFields := GetFieldNamesStr(Query);

 try

Query.GetFieldList(Fields, KeyFields);

for I := Fields.Count - 1 downto 0 do with TField(Fields[I]) do

if Calculated or Lookup then Fields.Delete(I);

CanLocate := Fields.Count > 0;

if CanLocate then begin

if Fields.Count = 1 then KeyValues := TField(Fields[0]).Value

else begin

KeyValues := VarArrayCreate([0, Fields.Count - 1], varVariant);

KeyValues[0] := TField(Fields[0]).Value;

end;

KeyNames := TField(Fields[0]).FieldName;

for I := 1 to Fields.Count - 1 do begin

KeyNames := KeyNames + ';' + TField(Fields[I]).FieldName;

KeyValues[I] := TField(Fields[I]).Value;

end;

end;

 finally

Fields.Free;

 end;

 with Query do begin

Bmk := nil;

DisableControls;

try

BookmarkFound := False;

if BookMarkSearch then Bmk := GetBookmark;

Close;

Open;

if Assigned(Bmk) then try

GotoBookMark(Bmk);

BookmarkFound := True;

except

end;

if not BookmarkFound and CanLocate then Locate(KeyNames, KeyValues, []);

finally

EnableControls;

Screen.Cursor := crDefault;

FreeBookmark(Bmk);

end;

 end;

end;

procedure TQuery.RefreshParams;

var DataSet: TDataSet;

begin

 DisableControls;

 try

if FDataLink.DataSource <> nil then begin

DataSet := FDataLink.DataSource.DataSet;

if DataSet <> nil then

if DataSet.Active and (DataSet.State <> dsSetKey) then

DoRefreshQuery(Self, GetFieldNamesStr(Self), False);

end;

 finally

EnableControls;

 end;

end;
 

Как

заставить BDE сохранять в БД поле времени с сотыми долями секунды?

Nomadic отвечает:

Если руками, то в BDE Administrator (BDE Configuration Utility).

Если при инсталляции твоей программы, то –

В пункте Make Registry Changes InstallShield'а создай ключ

HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine\Settings\SYSTEM\FORMATS\TIME\MILSECONDS=TRUE
 

Запись буфера BDE на диск

Delphi 1 

Общее:

Сделанные в таблице изменения непосредственно на диск не записываются до тех пор, пока таблица не будет закрыта. Потеря питания или сбой в системе может привести к потере данных и прочим неприятностям. Чтобы избежать этого, существует два прямых вызова Database Engine, дающих один и тот же результат. Эти функции – DbiUseIdleTime и DbiSaveChanges.

DbiSaveChanges(hDBICur):

DbiSaveChanges сохраняет на диске все обновления, находящиеся в буфере таблицы, связанной с курсором (hDBICur). Может быть вызвана из любого места программы. Например, можно при каждом обновлении записи сохранять на диске все изменения (добавьте dbiProcs в список используемых модулей):

procedure TForm1.Table1AfterPost(DataSet: TDataSet);

begin

 DbiSaveChanges(Table1.handle);

end;

При таком способе можно не беспокоиться насчет потерь данных в случае потери питания или сбоя системы, которое может произойти после обновления записи.

DbiSaveChanges также можно использовать для того, чтобы временную таблицу (созданную с помощью DbiCreateTempTable) сделать постоянной.

Эта функция не применима к таблицам SQL.

DbiUseIdleTime:

DbiUseIdleTime может быть вызвана, если «Windows Message Queue» (очередь запросов Windows) пуста. Это позволяет Database Engine сохранить на диске «грязные буферы». Другими словами, выполняется операция DbiSaveChanges, но применительно ко ВСЕМ измененным таблицам. Тем не менее, данная операция не обязательно должна выполняться после каждого обновления записи, ее нужно приберечь для «холостого» периода (период простоя, idle).

Поделиться с друзьями: