Валентин Озеров - Советы по 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 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Помещение переменной в 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
Возможно следующий код позволит вам использовать ту же самую таблицу и источник данных в модальной форме, что и в вашей главной форме. Попробуйте изменить код модальной формы следующим образом:
unitmyModalF;
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 asTBlobField, 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 asTBlobField).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 непосредственно, поскольку ему нужен буфер, поэтому для получения необходимого размера буфера используйте [0] и StrLen().
Вот пример использования TMemoryStream и записи его в Blob-поле:
var
cString: String;
oMemory: TMemoryStream;
Buffer: PChar;
begin
cString := 'Ну, допустим, хочу эту строку!';
{ СОздаем новый поток памяти }
oMemory := TMemoryStream.Create;
{!! Копируем строку в PChar }
StrPCopy(Buffer, cString);
{ Пишем =буфер= и его размер в поток }
oMemory.Write(Buffer[0], StrLen(Buffer));
{Записываем это в поле}
.LoadFromStream(oMemory);
{ Необходимо освободить ресурсы}
oMemory.Free;
end;
Как я могу выбрать на клиента только часть данных с определенной позиции из набора данных на сервере?
Nomadicотвечает:
Наиболее приемлемым является использование TQueryи Provider.SetParams.
Но также Вы можете сделать это иначе:
Сперва на клиенте Вам нужно считать с сервера только метаданные для набора данных. Это можно сделать, установив PacketRecords в 0, и затем вызвав Open. Затем Вы должны вызвать метод сервера (Вы должны определить этот метод на сервере), который спозиционирует курсор на первую нужную запись. И, наконец, установите PacketRecords в нужное значение, большее нуля, и вызовите GetNextPacket.
Отследить изменение данных?
Предположим, что пользователь изменил строковое поле в Null. Как тогда я в обработчике OnUpdateData смогу определить, изменилось ли это поле на строку Null, или поле просто не было изменено?
Nomadicотвечает:
Используйте свойство NewValue класса TField при чтении второй записи (той, которая содержит изменения). Если возвращаемое значение (variant) пусто или не назначено, тогда поле не было модифицировано. Здесь немного иллюстрирующего кода:
varNewVal: Variant;
begin
NewVal := DataSet.FieldByName('MyStrField').NewValue;
ifVarIsEmpty(NewVal) thenShowMessage('Field was not edited')
Интервал:
Закладка: