Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 30

стр.

>

>  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, я передаю запись, в противном случае делаю отмену.