Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Application.MessageBox(s, 'Ошибка!', MB_ICONSTOP);
Result := FALSE;
end;
end;
procedureTForm1.Button1Click(Sender: TObject);
begin
ifChkPath thenCheck(DbiAcqPersistTableLock(Database1.Handle, 'PARADOX.DRO','PARADOX'));
end;
end.
Нечувствительный к регистру поиск в первичном индексе Paradox
Delphi 1
К сожалению, это невозможно. Вы можете создать другой (вторичный) индекс, нечувствительный к регистру, для того же поля (или полей), для которых был создан первичный индекс, но как вы можете догадаться, этот путь потребует дополнительного программирования.
Создание таблицы Paradox
Delphi 1
Вот маленький кусочек кода для создания таблицы Paradox:
withTTable.create(self) do begin
DatabaseName := 'C:\temp';
TableName := 'FOO';
TableType := ttParadox;
withFieldDefs 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. Вот пример из электронной справки:
Данный пример при нажатии пользователем на кнопку копирует текст из поля редактирования в строку с терминирующим нулем, и помещает эту строку в другое поле редактирования.
procedureTForm1.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
Все это я делал раньше. Я не могу вам все это показать на развернутом примере, но я дам вам идею как сделать это. Вы должны иметь таблицу, осуществляющую взаимоотношение между людьми. Если на Peter работают Jane и Simon, вы должны иметь таблицу (RELATION) с этими двумя записями.
Читать дальшеИнтервал:
Закладка: