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.