KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

Примечание: Файл PARADOX.LCK необходим только для доступа к таблицам Paradox for DOS, так что вы можете его удалить.

5. Вам осталась сделать только одну последнюю вещь: скопировать оставшийся файл (PDOXUSRS.LCK) в образ CD-ROM. Естественно, ваши таблицы будут только для чтения.

Примечание: Если вы собираетесь довольно часто пользоваться данной утилитой, то для удобства вы можете изменить свойство Text компонента Edit на ваш «любимый» каталог, а свойство Caption кнопки поменять на что-нибудь более «интеллектуальное».

Вот окончательная версия кода:

unit Unit1;


interface


uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DB, StdCtrls, FileCtrl,

{$IFDEF WIN32}

 BDE;

{$ELSE}

 DbiProcs, DbiTypes, DbiErrs;

{$ENDIF }


type TForm1 = class(TForm)

 Edit1: TEdit;

 Button1: TButton;

 Database1: TDatabase;

 procedure Button1Click(Sender: TObject);

private { Private declarations }

public { Public declarations }

 function ChkPath : Boolean;

end;


var Form1: TForm1;


implementation


{$R *.DFM}


function TForm1.ChkPath : Boolean;

var s: array[0..100] of char;

begin

 If DirectoryExists(Edit1.Text) then begin

  DataBase1.DatabaseName:= 'TempDB';

  DataBase1.DriverName:= 'Standard';

  DataBase1.LoginPrompt:= false;

  DataBase1.Connected := False;

  DataBase1.Params.Add('Path=' + Edit1.Text);

  DataBase1.Connected := TRUE;

  Result := TRUE;

 end else begin

  StrPCopy(s,'Каталог : ' + Edit1.text + ' не найден');

  Application.MessageBox(s, 'Ошибка!', MB_ICONSTOP);

  Result := FALSE;

 end;

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

 if ChkPath then Check(DbiAcqPersistTableLock(Database1.Handle, 'PARADOX.DRO','PARADOX'));

end;


end

Нечувствительный к регистру поиск в первичном индексе Paradox

Delphi 1 

К сожалению, это невозможно. Вы можете создать другой (вторичный) индекс, нечувствительный к регистру, для того же поля (или полей), для которых был создан первичный индекс, но как вы можете догадаться, этот путь потребует дополнительного программирования. 

Создание таблицы Paradox

Delphi 1 

Вот маленький кусочек кода для создания таблицы Paradox:

with TTable.create(self) do begin

 DatabaseName := 'C:temp';

 TableName := 'FOO';

 TableType := ttParadox;

 with FieldDefs do Begin

  Add('Age', ftInteger, 0, True);

  Add('Name', ftString, 25, False);

  Add('Weight', ftFloat, 0, False);

 End;

 IndexDefs.Add('MainIndex','IntField', [ixPrimary, ixUnique]);

 CreateTable;

End

DBEdit и реальные значения

При работе с реальными числами, хранимые в таблице Paradox, вы уверены в том, что вы используете тип Real как тип ваших данных? Если так, то попробуйте использовать тип Double. Double – 8-байтовое (64-битное) реальное число, которое нормально работает с BDE, тогда как Real – 6-байтовая версия и подходит только для Delphi и BP. Или попробуйте использовать Extended, занимающий 10 байтов.  

Почему при создании таблицы Paradox с первичным нечувствительным к регистру индексом вываливается ошибка?

Пара строк

Nomadic отвечает:

В Парадоксе первичный индекс всегда CaseSensitive. 

Как сменить пароль (master password) для таблицы Paradox?

Nomadic отвечает:

Пожалуйста: 

var

 db : TDatabase;

 Desc : CRTblDesc;

begin

 db := PriceTable.OpenDatabase;

 FillChar(Desc, SizeOf(Desc), #0 );

 StrCopy(Desc.szTblName, PChar(PriceTable.TableName));

 StrCopy(Desc.szTblType, szParadox);

 StrCopy(Desc.szPassword, 'password');

 Desc.bProtected := TRUE;

 Check(DbiDoRestructure(db.Handle, 1, @Desc, nil, nil, nil, FALSE));

end

Что нужно сделать для нормальной работы в одноранговой сети с базами Paradox?

Nomadic отвечает:

BDE Config/Admin – нa вкладке System устaнови LOCAL SHARE в TRUE!

Здесь комментарий –

В Help параметр LOCAL SHARE описан как:

AA> === Cut ===

AA> The ability to share access to local data between an active BDE

AA> application and an active non-BDE application. Set to TRUE if you need to

AA> work with the same files through both a BDE and a non-BDE application at

AA> the same time. (It is not necessary to set LOCAL SHARE to TRUE if you do

AA> not need to have both applications open at the same time.) Default: FALSE.

AA> === Cut ===

Дак читал я вышеизложенное, и расцениваю его кaк туманопускательство. А подозреваю, что просто у BDE для скорости есть свой внутренний кэш (или, может, мехaнизм блокировок в пaмяти), и для двух приложений на одном компьютере оно всё делает хорошо, a вот если приложение находится на другом компьютере (и лезет в БД через другую копию BDE), то у него есть доступ только к файлам нa диске (как и у non-BDE application).

Скорее всего, борланд отключает эти хитрости у сетевых дисков. Hо для локального дискa, который рaсшарен по сети, он этого, похоже, не сделaл :(

И BDE нa файл-сервере не заботится о правильных индексaх и блокировках нa диске (т.е. не ожидает, что кто-то мог исправить индекс, пока оно ворон считaло).

А этa установка заставляет его работать по старым парадоховым соглашениям.

Что и требовалось.

PS. Иначе говоря, следует считать, что network is non-BDE application, и тогда это не есть бага :) 

Переиндексирование файлов Paradox в пределах моей программы

Delphi 1 

Попытаемся это сделать с помощью прямых вызовов функций BDE. На некоторых Интернет-серверах я видел описание этих функций. Некоторые «писатели» даже превращают свои трактаты в некое подобие файлов помощи. Поскольку я не хочу перегружать канал, то пошлю это по почте тому, кто пришлет мне запрос (т.е. кому это действительно нужно).

…сейчая я пишу небольшое приложение, которое может оказаться полезным для восстановления «разбитых» таблиц. Аллен, я пошлю тебе полный список шагов, как только смогу перевести их (это писал итальянец, я же только перевожу это), но уже сейчас я могу сказать как это проблему я решил для себя. Один из наших клиентов всегда разбивал таблицы paradox, поскольку они у него всегда были очень большими (в Blob-полях хранились WAV-файлы – оцифрованный голос). Решение заключалось в создании маленьких таблиц, включенных в отношение справочной целостности, и загрузки больших blob-полей в эти отдельные таблицы. Ненужно никаких BDE функций, единственное условие – вы не должны вручную удалять индексные файлы (все .x00, .y01 и т.д., они все имеют маску .x?? и .y??, не трогайте других файлов!), в противном случае вы НЕ СМОЖЕТЕ ОТКРЫТЬ ТАБЛИЦУ, даже с помощью DBD!

…затем я вручную восстанавливал все индексы (затем я что-то забыл, и приложение вылетело с ошибкой…). Если приложение, которое я тебе пришлю, не заработает, я думаю единственным решением будет физическое уничтожение индексов и пересоздание их с помощью соответствующих вызовов BDE. 

Разное 

Помещение Memo-файла с ASCII-разделителем в Memo-поле таблицы

Вам нужно использовать процедуру getTextBuf. Вот пример из электронной справки:

Данный пример при нажатии пользователем на кнопку копирует текст из поля редактирования в строку с терминирующим нулем, и помещает эту строку в другое поле редактирования.

procedure TForm1.Button1Click(Sender: TObject);

var

 Buffer: PChar;

 Size: Byte;

begin

 Size := Edit1.GetTextLen;      {Получаем длину строки в Edit1}

 Inc(Size);                     {Добавляем место для терминирующего нуля}

 GetMem(Buffer, Size);          {Создаем динамическую переменную Buffer}

 Edit1.GetTextBuf(Buffer,Size); {Помещаем Edit1.Text в Buffer}

 Edit2.Text := StrPas(Buffer);  {Преобразуем Buffer в строку паскалевского типа}

 FreeMem(Buffer, Size);         {Освобождаем память, распределенную для Buffer}

end

Почему не всегда верно обновляются IndexDefs по Update?

Пара строк 

Nomadic отвечает:

Ошибка в VCL.

А помогает добавление fUpdated:=false; в теле процедуры TIndexDefs.Update.

Или убиением владельца через Free, и пересозданием.

БД-дерево взаимоотношений

Delphi 1

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*