Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

Скорее всего, борланд отключает эти хитрости у сетевых дисков. 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

Все это я делал раньше. Я не могу вам все это показать на развернутом примере, но я дам вам идею как сделать это. Вы должны иметь таблицу, осуществляющую

взаимоотношение между людьми. Если на Peter работают Jane и Simon, вы должны иметь таблицу (RELATION) с этими двумя записями.

Master

Slave ------- имена полей

Peter Jane

Peter Simon

Если George и Elisa работают на Jane, то таблица становится такой:

Master Slave ------- имена полей

Peter Jane

Peter Simon

Jane George

Jane Elisa

и так далее.

Если в таблице RELATION необходимо создать дерево, начинающееся на Peter, то нужно добавить к дереву главный узел (запись), где Master = Peter. Затем каждая дочерняя запись располагается ниже записи Master = Peter. После добавления дочерней записи вы сразу увидите, если ребенок имеет собственного ребенка. Ребенок становится теперь, вероятно, отцом, поэтому вы должны позиционировать таблицу RELATION к первой записи, где Master = child, и так далее, рекурсивно. Такой способ гарантирует построение правильного дерева.

Пример:

AddFather('Peter')

AddChild('Peter',1)

Procedure AddFather(Name: String)

Begin

 Tree.Add(Name);

End;

Procedure AddChildr(Name: String, Index:Integer)

Begin

 Relation.FindKey([Name])while RelationMaster.AsString = Name do

 Begin

Tree.AddChild(Index,RelationSlave.AsString);

AddChild(RelationSlave.AsString,Tree.ItemsCount);

Relation.Next;

 End;

End;

По-моему, ошибок нет.

DBGrid и Memo-поля

Delphi 1

В обработчик события GetText TMemoField поместите следующую строку:

Text := GrabMemoAsString(TMemoField(Sender));

и поместите следующую функцию так, чтобы к ней можно было свободно обратиться:

function GrabMemoAsString(TheField : TMemoField): String;

begin

 if TheField.IsNull then Result := '' else with TBlobStream.Create(TheField, bmRead) do begin

if Size >= 255 then begin

Read(Result[1], 255);

Result[0] := #255;

end else begin

Read(Result[1], Size);

Result[0] := Chr(Size);

end;

Free;

while Pos(#10, Result) > 0 do Result[Pos(#10, Result)] := ' ';

while Pos(#13, Result) > 0 do Result[Pos(#13, Result] := ' ';

Поделиться с друзьями: