Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 33
Помещение переменной в Memo-поле
Delphi 1
Если я правильно понял ваш вопрос, вам нужно сделать приблизительно так (для ПОЛУЧЕНИЯ данных):
>Memos := TStringList.Create;
>Memos.Assign(Table1Memo);
>yourvariable_0 := Memos[0];
>yourvariable_1 := Memos[1];
>……………………
>yourvariable_n := Memos[n];
>Memos.Free;
или так (для УСТАНОВКИ данных):
>Memos := TStringList.Create;
>Memos.Add(yourvariable_0);
>Memos.Add(yourvariable_1);
>……………………
>Memos.Add(yourvariable_n);
>Table1Memo.Assign(Memos);
>Memos.Free;
Индикатор прогресса выполнения запроса
Delphi 1
Невозможно.
Идея заключалась в том, чтобы с помощью объекта TQuery выполнять запросы, SQL сервер их в фоне обрабатывал бы, а мы смотрели бы на это дело на локальной машине с помощью линейки прогресса. Но из приложения никоим образом нельзя узнать, что делает TQuery, так что линейка прогресса, по идее, должна была бы получать текущую позицию непосредственно с SQL сервера. Но, поскольку большинство SQL серверов не публикуют такой информации, эту идею можно торжественно схоронить…
Если вы используете Paradox или DBase, то, я думаю, для этой цели вы можете воспользоваться функцией DBIRegisterCallback:
Использование:
Обратные вызовы (Callbacks) используются в случае, когда клиентскому приложению необходимо получить (возвратить) информацию о ходе выполнения операции. Функция DBIRegisterCallback позволяет клиенту зарегистрировать обратную связь с BDE, после чего BDE может извещать клиента о наступлении событий.
Из руководства пользователя DBE
Лично я никогда этим не пользовался, поэтому на смогу поделиться деталями.
Обновление данных БД из модальной формы
Delphi 1
Возможно следующий код позволит вам использовать ту же самую таблицу и источник данных в модальной форме, что и в вашей главной форме. Попробуйте изменить код модальной формы следующим образом:
>unit myModalF;
>interface
>{…}
>implementation
>{…}
>uses
> MainForm; {Имя файла родительской формы для вашей модальной формы}
>MyModalForm.OnCreate(Sender: TObject);
>begin
> DBGrid1.DataSource := MyMainForm.DataSource1;
>end;
Как записать в BLOB-поле большой текст (>255 байт) из Delphi?
Nomadic отвечает:
Можно так –
>var
> S: TBlobStream;
> B: pointer;
> c: integer;
>…
>Table1.Edit;
>S := TBlobStream.Create(Table1BlobField as TBlobField, bmWrite); {кажется, так}
>C := S.Write(B, C);
>Table1.Post;
>S.Destroy;
или так –
>var
> S: TMemoryStream;
> B: pointer;
> C: integer;
> …
> S := TMemoryStream.Create;
>…
>Table1.Edit;
>S.Clear;
>S.SetSize(C);
>C := S.Write(B,C);
>(Table1BlobField as TBlobField).LoadFromStream(S);
>S.Clear;
>Table1.Post;
>…
>S.Destroy;
Блокировка таблицы
…когда вы получаете эту, или аналогичную ошибку, вы можете прервать процесс следующим образом (в предположении, что вы пытаетесь запостить запись):
>try
> Table1.Post;
>except
> MessageDlg ('Ошибка постинга записи', прочее…
> Table1.Cancel;
>end;
В противном случае вы не получите ошибку в случае, если текущую запись «рассматривает» другой пользователь (если вы пользуетесь базой данных Paradox, поставляемой с Delphi), если, конечно, вы правильно это установили. Paradox сам создает в сетевом каталоге файл с именем pdxusers.lck, видимый всеми пользователями, так что каждый BDE на каждой локальной машине может запирать запись, таким образом запрещая другим пользователям постить запись до снятия блокировки. Я не знаю, каким образом вы получаете эту ошибку, поэтому существует вероятность того, что я ошибаюсь в своих предположениях.
Каким драйвером пользуется TDATABASE?
Delphi 1
Вы можете использовать вызов IDAPI dbiGetDatabaseDesc. Вот быстрая справка (не забудьте добавить DB в список используемых модулей):
>var
> pDatabase: DBDrsc:
>begin
> { pAlias – PChar, содержащий имя псевдонима}
> dbiGetDatabaseDesc(pAlias, @pDatabase);
Для получения дополнительной информации обратитесь к описанию свойства pDatabase.szDbType.
Как создать новый запрос и скопировать туда точно такие же описания полей?
Nomadic отвечает:
Копируешь FieldDefs.
Проходишь циклом по FieldDefs.Items[i].CreateField(Owner);
Запись потока в BLOB-поле
Delphi 1
Вся хитрость заключается в использовании StrPcopy (помещения вашей строки в PChar) и записи буфера в поток. Вы не сможете передать это в PChar непосредственно, поскольку ему нужен буфер, поэтому для получения необходимого размера буфера используйте