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

ЖАНРЫ

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

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

Шрифт:

 TblDesc: CRTblDesc;

 rslt: DBIResult;

 Dir: String; //имеется в виду huge string т.е. {$h+}

 hDb: hDbiDb;

begin

 tLog.Active := False; //деактивиpуем TTable

 SetLength(Dir, dbiMaxNameLen + 1);

 DbiGetDirectory(tLog.DBHandle, False, PChar(Dir));

 SetLength(Dir, StrLen(PChar(Dir)));

 DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb);

 DbiSetDirectory(hDb, PChar(Dir));

 FillChar(TblDesc, sizeof(CRTblDesc), 0);

 StrPCopy(TblDesc.szTblName, 'd:\db\log.db');

 //
здесь должно быть полное имя файла

 //котоpое можно: а) ввести pуками;

 //б) вытащить из пpопеpтей таблицы;

 //в) вытащить из алиаса;

 //г) см. FAQ

 StrCopy(TblDesc.szTblType, szParadox);

 //BTW тут может и szDBase стоять

 TblDesc.bPack := TRUE;

 DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, false);

 DbiCloseDatabase(hDb);

end;

// можно еще чеки ввести, но облом :-)

Показ удаленных записей в таблице dBASE

В таблицах dBASE записи не удаляются до тех пор, пока таблица не будет упакована. Пока же это не произойдет, удаленные записи остаются в таблице, только имеют при этом флажок "к удалению". Для того, чтобы показать эти существующие, но не отображаемые записи, существует функция ShowDeleted, которая использует функцию BDE API DbiSetProp, показывающая записи, помеченные к удалению. При использовании этой функции нет необходимости закрывать и вновь открывать таблицу. ShowDeleted в качестве параметров передается TTable и логическое значение. Логический параметр указывает на необходимость показа удаленных записей.

Демонстрационный проект:

unit Unit1;

interface

uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables;

type

 TForm1 = class(TForm)

Table1: TTable;

DataSource1: TDataSource;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

CheckBox1: TCheckBox;

procedure CheckBox1Click(Sender: TObject);

 public

procedure ShowDeleted(Table: TTable; ShowDeleted: Boolean);

 end;

var

 Form1: TForm1;

implementation

uses DBITYPES, DBIERRS, DBIPROCS;

{$R *.DFM}

procedure TForm1.ShowDeleted(Table: TTable; ShowDeleted: Boolean);

var

 rslt: DBIResult;

 szErrMsg: DBIMSG;

begin

 Table.DisableControls;

 try

Check(DbiSetProp(hDBIObj(Table.Handle), curSOFTDELETEON, LongInt(ShowDeleted)));

 finally

Table.EnableControls;

 end;

 Table.Refresh;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

 ShowDeleted(Table1, CheckBox1.Checked);

end;

end.
 

Пароль

на dBASE-файлы

Delphi 1 

dBase-файлы не поддерживают пароли. Естественно, вы можете создать свои собственные методы поддержки паролей. Но это будет работать только с вашими приложениями. Боюсь, что при наличии тысяч читателей/конверторов dBase, этот способ не годится. 

Показ меток 'удаленных' записей в dBASE-файлах

Delphi 1 

Для начала вы должны включить SoftDeletes, после чего вы сможете просматривать записи, помеченные к удалению. В противном случае, вы их не увидите. По умолчанию, для файлов DBF, SoftDeletes установлен в False. Вот логика работы:

procedure TForm1.Button1Click(Sender: TObject);

var

 B: BOOL;

 W: Word;

begin

 Check(DbiSetProp(hDBIObj(Table1.Handle), curSOFTDELETEON, longint(True)));

 { Проверяем, что это работает }

 Check(DbiGetProp(hDBIObj(Table1.Handle), curSOFTDELETEON, @B, sizeof(B), W));

 if B = False then Label2.Caption := 'Не помечена'

 else Label2.Caption := 'Помечена';

end;

Когда указатель на запись указывает на запись, которую вы хотите удалить, используйте следующую логику:

Table1.UpdateCursorPos;

Check(DbiUndeleteRecord(Table1.Handle));

Метод UpdateCursorPos устанавливает основной курсор BDE на позицию курсора текущей записи, который существуют только для того, чтобы все работало правильно. Вам нужно только вызвать этот метод прямым вызовом одной из BDE API функций (такой как, например, DbiUndeleteRecord).

Ну и, наконец, чтобы все работало, поместите модули DBIPROCS и DBITYPES с список USES. 

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