Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Вызов процедуры на форме из потока


Автор: KAnAn 24.7.2009, 08:36
Доброе время суток.
Delphi 7.0
При нажатии кнопки заряжается поток который на сервере крутит долгоиграющий запрос, (при этом все компоненты формы типа кнопок делаю неактивными, чтобы не смущать пользователя).
В потоке все как обычно, но после отработки нужно активизировать компоненты которым Enabled делал False.
Скорей всего выход в создании на форме процедуры (без параметров) которая при вызове должна пройти по компонентам формы которые блокированы и активизировать их, но как это сделать из потока ?

Т.е. нужно каким-то образом передать процедуру в поток, а затем нужно в классе потока, реализовать возможность вызова процедуры на форме:

Код

procedure TMyThread.Execute;
begin
  ActiveQuery(MyDataSet);
  Synchronize(а вот здесь чего-то, что запустит процедуру активации компонентов на форме)
end;


Выручайте (по возможности с примером).

Спасибо.

Автор: CodeMonkey 24.7.2009, 10:07
Если только одну процедуру и только при завершении потока, то можно так:

Код
type
  TForm1 = 
   ...
     procedure ThreadDone(Sender: TObject);
  end;

  Thread.OnTerminate := ThreadDone;


Если хотите передавать явно, то:

Код
type
  TMakeActionProc = procedure of object;

type
  TForm1 = 
   ...
     procedure MakeAction;
  end;

...

type
  TMyThread = 
    FMakeAction: TMakeActionProc;
  ...
    constructor Create(CreateSuspended: Boolean; AMakeAction: TMakeActionProc);
  end;


procedure TForm1.MakeAction;
begin
  Button1.Enabled := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Enabled := False;
  Thread := TMyThread.Create(False, MakeAction);
end;

...

procedure TMyThread.Execute;
begin
  ...
  if Assigned(FMakeAction) then
    Synchronize(FMakeAction);
  ...
end;


Но если действий много, то замучаетесь.
Проще всего - передавать саму форму (как TForm или TForm1) в поток (в примере выше замените TMakeActionProc на TForm).
Как более красивый вариант последнего способа - передавать в поток интерфейс, реализуемый формой.

Добавлено через 1 минуту и 6 секунд
И почитайте ещё http://forum.vingrad.ru/forum/topic-60076.html.

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