Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 23 24 25 26 27 28 29 30 31 ... 123

Примечание: Файл 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

1 ... 23 24 25 26 27 28 29 30 31 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий