Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 14 15 16 17 18 19 20 21 22 ... 123

 FDatabase := DataBase;

 FQuery := Query;

 FDataSource := Datasource;

 FreeOnTerminate := True; // Устанавливаем флаг освобождения потока после его завершения

 Resume;                  // Продолжение выполнения потока

end;

procedure TQueryThread.Execute;

begin

 try

{ Выполняем запрос и подключаем источник данных к компоненту TQuery, вызывая ConnectDataSource из основного потока(для этой цели используем Synchronize)}

  FQuery.Open;

  Synchronize(ConnectDataSource);

 except

{ Ловим исключение (если оно происходит) и его дескриптор в контексте основного потока (для этой цели используемSynchronize). }

  FQueryException := ExceptObject as Exception;

  Synchronize(ShowQryError);

 end;

end;

procedure TQueryThread.ConnectDataSource;

begin

FDataSource.DataSet := FQuery;  // Подключаем DataSource к TQuery

end;

procedure TQueryThread.ShowQryError;

begin

Application.ShowException(FQueryException); // Обрабатываем исключение

end;

procedure RunBackgroundQuery(Session: TSession; DataBase: TDataBase; Query: TQuery; DataSource: TDataSource);

begin

{ Создаем экземпляр TThread с различными параметрами. }

 TQueryThread.Create(Session, Database, Query, DataSource);

end;

{$R *.DFM}

procedure TForm1.GoBtn1Click(Sender: TObject);

begin

{ Запускаем два отдельных запроса, каждый в своем потоке }

 RunBackgroundQuery(Session1, DataBase1, Query1, Datasource1);

 RunBackgroundQuery(Session2, DataBase2, Query2, Datasource2);

end;

end.

Метод TForm1.GoBtn1Click является обработчиком события нажатия кнопки. Данный обработчик события дважды вызывает процедуру RunBackgroundQuery, это случается при каждой передаче новых параметров компонентам для работы с базой данных. RunBackgroundQuery создает отдельный экземпляр класса TQueryThread, передает различные компоненты для работы с базой данных в его конструктор, который, в свою очередь, назначает их закрытым полям TQueryThread.

TQueryThread содержит две определенные пользователем процедуры: ConnectDataSource и ShowQryError. ConnectDataSource связывает FDataSource.DataSet с FQuery. Тем не менее, это делается в первичном потоке с помощью метода TThread.Synchronize. ShowQryError обрабатывает исключение в контексте первиного потока, также используя метод Synchronize. Конструктор Create и метод Execute снабжены подробными комментариями.

Получение физического пути к таблице

Delphi 2

Тема: Получение физического пути к таблице

Отправлено: Август 13, 1996

Автор: Xavier Pacheco

Если ссылка на таблицу получена через псевдоним, получить физический путь к ней не так просто. Для получения этого пути необходимо использовать функцию BDE DbiGetDatabaseDesc. Данной функции в качестве параметров передаются имя псевдонима и указатель на структуру DBDesc. Структура DBDesc будет заполнена информацией, относящейся к этому псевдониму. Определение структуры:

pDBDesc = ^DBDesc;

DBDesc = packed record 2{ Описание данной базы данных }

 szName    : DBINAME; { Логическое имя (или псевдоним) }

 szText    : DBINAME; { Описательный текст }

 szPhyName : DBIPATH; { Физическое имя/путь }

 szDbType  : DBINAME; { Тип базы данных }

end;

Физическое имя/путь будет содержаться в поле szPhyName структуры DBDesc.

Возможные значения, возвращаемые функцией DBIGetDatbaseDesc:

DBIERR_NONE Описание базы данных для pszName было успешно извлечено. DBIERR_OBJNOTFOUND База данных, указанная в pszName, не была обнаружена.

Приведенный ниже пример кода показывает как можно получить физический путь для компонента TTable, использующего псевдоним DBDemos:

var

 vDBDesc: DBDesc;

 DirTable: String;

begin

 Check(DbiGetDatabaseDesc(PChar(Table1.DatabaseName), @vDBDesc));

 DirTable := Format('%s%s', [vDBDesc.szPhyName, Table1.TableName]);

 ShowMessage(DirTable);

end

Cancel в связанных таблицах

Delphi 1

В книге 'Delphi unleashed' на странице 520 автор написал:

'…, вы можете делать откат все время до тех пор, пока прямо или косвенно не сделаете постинг данных.'

Моя проблема дважды возникала в случае ExTable.Edit в различных процедурах. Код был примерно таким:

Procedure1 …

begin

 ExTable.Edit;

 ExTable.FieldByName('').asstring := ;

 …

end;

procedure2

begin

 ExTable.Edit;

 …

end;

Процедура CancelSpdBtnClick была вызвана после этих двух процедур. Действительно, прежде, чем делать откат, постинг был косвенно вызван между двумя вызовами ExTable.Edit. Теперь после такой модификации все работает как часы. 

Отображение формы ввода в БД CUSTOMER из рабочей формы ORDER

Delphi 1

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

В обработчике события OnClick я создаю форму ввода данных и вывожу ее командой .ShowModal. Затем я проверяю результат .ModalResult – и, если он равен mrOk, я передаю запись, в противном случае делаю отмену.

Я поместил имя модуля с формой ввода данных в список используемых модулей главной формы. Вот базовая схема моего кода: 

procedure TFrmItemNav.BtnChangeLocClick(Sender: TObject);

{var DlgItemLoc: TDlgItemLoc;}

begin

 DlgItemLoc := TDlgItemLoc.Create(FrmItemNav);

 DlgItemLoc.ShowModal;

 if DlgItemLoc.ModalResult = mrOk then

  {делаем все, что необходимо для постинга данных}

 else

  {очищаем и делаем Cancel};

 DlgItemLoc.Free;

end

Отображение определенных полей БД

Delphi 1

Вот что можно сделать во время выполнения программы: 

Table1.FieldByName(RemovedFieldName).Visible := False;

или 

Table1.Field[removedFieldNumber-1].Visible := false; 

Из базы данных в переменные

Delphi 1

Примерно так вы можете программным путем извлечь содержимое поля: 

aValue := TMyTable.FieldByName('SomeField').AsText;

или 

aValue := TMyTable.FieldByName('SomeField').AsInteger;

или 

aValue := TMyTable.Fields[1].AsFloat;

В действительности здесь вы получаете объект TField от объекта TTable (или TQuery), и затем вызываете соответствующий метод объекта TField для получения самих данных. Вы можете также изменить значение самого поля, но только в случае, если объект TTable находится в режиме вставки (Insert) или редактирования (Edit). Члены AsFloat, AsInteger, AsDateTime и AsString в действительности являются свойствами, и как таковые также могут принимать значения. С помощью Редактора Полей (Fields Editor, для вызова которого достаточно дважды щелкнуть на объекте TTable или TQuery) также возможно создание объектов-полей. Эти объекты могут быть использованы вместо получения их каждый раз от объекта TTable или TQuery.

Получение информации о таблице

Вам нужно воспользоваться свойством FieldDefs. В следующем примере список полей и их соответствующий размер передается компоненту TMemo (расположенному на форме) с именем Memo1:

procedure TForm1.ShowFields;

var

 i : Word;

begin

 Memo1.Lines.Clear;Table1.FieldDefs.Update; { должно быть вызвано, если Table1 не активна }

 for i:= 0 to Table1.FieldDefs.Count - 1 do With Table1.FieldDefs.Items[i] do Memo1.Lines.Add(Name + ' - ' + IntToStr(Size));

 Memo1.Lines.Add(Name + ' – ' + IntToStr(Size));

end;

Если вам просто нужны имена полей (FieldNames), то используйте метод TTable GetFieldNames:

GetIndexNames для получения имен индексов:

var FldNames, IdxNames : TStringList

begin

 FldNames := TStringList.Create;

 IdxNames := TStringList.Create;

 If Table1.State = dsInactive then Table1.Open;

 Table1.GetFieldNames(FldNames);

 Table1.GetIndexNames(IdxNames);

 {…… используем полученную информацию ……}

 FldNames.Free; {освобождаем stringlist}

 IdxNames.Free;

end;

Для получения информации об определенном поле вы должны использовать FieldDef. 

Обмен данными между TMemoField и TMemo

Delphi 1

Procedure TMemoToTMemoField;

begin

 TMemoField.Assign(TMemo.Lines);

end;

Procedure TMemoFieldToTMemo;

VAR aBlobStream : TBlobStream;

begin

1 ... 14 15 16 17 18 19 20 21 22 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий