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

ЖАНРЫ

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

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

Шрифт:

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 непосредственно, поскольку ему нужен буфер, поэтому для получения необходимого размера буфера используйте <BufferName>[0] и StrLen.

Вот пример использования TMemoryStream и записи его в Blob-поле: 

var

 cString: String;

 oMemory: TMemoryStream;

 Buffer: PChar;

begin

 cString := 'Ну, допустим, хочу эту строку!';

 { СОздаем новый поток памяти }

 oMemory := TMemoryStream.Create;

 {!! Копируем строку в PChar }

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