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;