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

ЖАНРЫ

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

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

Шрифт:

begin

 inherited Create(True); // Создаем поток c состоянием suspendend

 FSession := Session; // подключаем все privat-поля

 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 автор написал:

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

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