FAQ - Вопросы - ответы - советы - Базы данных
Вопрос:
[DBF] Как можно открыть DBF-файл с признаком индекса, если индексный файл отсутствует?
Ответ:
С помощью BDE CALLBACKS. Пример для DELPHI 2.0, на первом не проверял:
UNIT CALLBACK;
INTERFACE
USES BDE, CLASSES, FORMS, DB, DBTABLES;
TYPE
TFORM1 = CLASS(TFORM)
TABLE1: TTABLE;
PROCEDURE FORMCREATE(SENDER: TOBJECT);
PROCEDURE FORMDESTROY(SENDER: TOBJECT);
PRIVATE
CBACK: TBDECALLBACK; // определение BDE CALLBACK
CBBUF: CBINPUTDESC; // просто буфер
FUNCTION CBFUNC(CBINFO: POINTER): CBRTYPE; // CALLBACK-функция
PUBLIC
END;
VAR FORM1: TFORM1;
IMPLEMENTATION
{$R *.DFM}
PROCEDURE TFORM1.FORMCREATE(SENDER: TOBJECT);
BEGIN
SESSION.OPEN; // В это время сессия ещё не открыта
CBACK := TBDECALLBACK.CREATE(SESSION {Например},NIL,CBINPUTREQ,@CBREGBUF,
SIZEOF(CBBUF),CBFUNC,FALSE); // Определили CALLBACK
TABLE1.OPEN;
//^^^^^^^^^^^ - здесь возможна ошибка с индексом, ETC.
END;
PROCEDURE TFORM1.FORMDESTROY(SENDER: TOBJECT);
BEGIN
CBACK.FREE; // Освобождаем CALLBACK
END;
FUNCTION TFORM1.CBFUNC(CBINFO: POINTER): CBRTYPE;
BEGIN
WITH PCBINPUTDESC(CBINFO)^ DO
CASE ECBINPUTID OF
CBIMDXMISSING {, CBIDBTMISSING - можно ещё и очищать BLOB-поля}:
BEGIN
ISELECTION := 3; // Номер варианта ответа (1-й - открыть только //
для чтения, 2-й - не открывать, 3-й - отсоединить индекс).
// Возможный источник неприятностей: а вдруг в последующих версиях
// BDE номера будут другими?
RESULT := CBRCHKINPUT; // Обрабатывать введённый ответ
END;
END;
END;
END.
PS: конечно, это лишь пример, делающий минимум необходимого. В рамках данного письма невозможно дать какое-то описание BDE CALLBACKS. Информацию я взял из BDE32.HLP, BDE.INT и DB.PAS. В VCL.HLP совсем ничего нет по этому поводу.
Вообще, руки бы оторвал тем, кто писал справку по Дельфям: я неделю мучался с сабжем, пока случайно не набрёл на CALLBACKS.
