Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Зависание между BeforeOpen и AfterOpen


Автор: lonelybooba 24.2.2010, 16:01
салют всем.

товарищи, я уже голову сломал, подскажите плс как реализовать следующую вещь:

в дельфях работаю с DAC for MySQL. выполняю запрос (может не прально выполняю):

Код

 QueryResForm.SQLQuery.Active:=false;
 QueryResForm.SQLQuery.SQL.Clear;
 QueryResForm.SQLQuery.SQL:=LookupForm.ReportSqlMemo.Lines;
 QueryResForm.SQLQuery.Open;


Идея такая, что когда выполняется запрос у меня появляется окошко с надписью "Выполняется запрос" и прочей лабудой (не столь важно какой). Делаю это так:

Код

procedure TQueryResForm.SQLQueryBeforeOpen(DataSet: TDataSet);
begin
 LookupForm.Visible:=false;
 QueryProc.Visible:=true;
end;

procedure TQueryResForm.SQLQueryAfterOpen(DataSet: TDataSet);
begin
 QueryProc.Visible:=false;
 QueryResForm.Visible:=true;
end;


И на этом деле, как вы поняли, всё виснет (запросы большие). Подскажите плс, как "успокоить" приложение, чтобы его можно было спокойно сворачивать и т.п. Application.Processmessages как я понял юзать нельзя, хотя пробовал, но тоже не работает. 


Заранее спасибо

Автор: CROTishka 24.2.2010, 16:07
Ответ очевиден: выполнять запрос в отдельном потоке.

Автор: lonelybooba 24.2.2010, 16:10
CROTishka, пробовал, не вышло, ибо руки кривые. подскажиет плс как сюда легче всего прикруить тред. 

з.ы. вообще по идее реализовал давно эту задачу, выводится окошко виснет на 3-4 секунды и потом его можно спокойно двигать пока выполняется запрос, но содержимого окна не видно. но эт не дело, поэтому прошу совета...

Автор: CROTishka 24.2.2010, 16:34
возможных реализаций - куча. Какой вы сделаете - зависит от вас.
самый lameпростой на мой взгляд вариант:

меняете вашу SQLQuery (хз из какого набора) на аналогичный датасет.

File -> New -> Delphi File -> Thread Object

При создании передаёте в него 2 пар-ра: условия квери и нотифай эвент, который надо вызвать по завершении. 
В экзекуте динамически создаёте кверю, вставляете ваш код, тот, что вы привели.
По завершении рекордсет, который получили в рез-те запроса, передаёте в обработчик эвента.
В обработчике эвента пихаете этот рекордсет в датасет.
-> Profit.

Автор: lonelybooba 24.2.2010, 16:38
CROTishka, добро! завтра попробую и обязательно отпишусь, спасибо smile 

Автор: lonelybooba 25.2.2010, 11:52
CROTishka, всё отлично работает, создал объект, в екзекут засунул обработку запроса. а для нормальной работы датасета все визуальные фишки засунул в отдельную процедуру и связал их Synchronize'ом. вощем разобрался. спасибо;)

Автор: CROTishka 25.2.2010, 16:08
Кушайте не обляпайтесь.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)