Использование другой процедуры обработки формы - PullRequest
1 голос
/ 25 августа 2011

Есть ли способ разрешить одной форме использовать процедуры обработки событий из другой формы?

например. У меня есть форма с именем PongForm, а другая называется ObstPongForm. На PongForm есть тикер, а на ObstPongForm - еще один. Можно ли заставить ObstPongForm использовать код из события 'tick' PongForm в своем собственном событии 'tick'? Может быть, позволяя ObstPongForm наследовать от PongForm?

Ответы [ 4 ]

5 голосов
/ 25 августа 2011

Вы можете просто назначить его по коду (если у вас есть доступ к обоим экземплярам):

ObstPongForm.Ticker.OnTick := PongForm.TickerTick;
1 голос
/ 27 августа 2011

Было бы лучше, если бы обе формы вызывали другой класс, который реализует логику, используемую обеими.Если вы пишете всю логику своей программы в обработчике событий OnTimer, вы идете по неверному пути, который многие программисты на Delphi тратят годы, чтобы понять, что это плохая идея

Так что одна форма должна вызывать ваш метод,он делает это так:

procedure TForm1.DoSomething;
begin
    DataModule1.LogicMethod;
end;

В другом месте есть таймер ...

procedure TForm2.Timer1Timer(Sender:TObject);
begin
    DataModule1.LogicMethod;
end;

А затем сам метод:

procedure TDataModule1.LogicMethod;
begin
   // Everything that you used to have in Timer1Timer goes here, except the setting of
   // UI properties in Form1 which is kept in Form1:
   Inc(FCounter);// stupid example.

   //
   if Assigned(FOnResults) then
   FOnResults(Self,  FCounter, FDataObject1); 
      // Form2 is connected to FOnResults event, and stores the 
      // result in the UI somewhere.
end;
1 голос
/ 25 августа 2011

Да, формы - это просто классы, как и любые другие, и Delphi поддерживает визуальное наследование, поэтому вы можете нормально вызывать унаследованные методы.

Если ObstPongForm является специализированной версией PongForm, тогда наследование имеет смысл, но будьте осторожны, так какObstPongForm унаследует все визуальные элементы управления от PongForm, включая все, что вы можете добавить в будущем.

Также, поскольку я предполагаю, что у вас уже есть обе формы, создание одной наследования от другой выполнимо, но требует некоторого ручного редактирования DFM, главным образомизменение

Object ObstPongForm: TObstPongForm на Inherited ObstPongForm: TObstPongForm

Если код, который вы хотите использовать повторно, может потребоваться в нескольких несвязанных формах, то перемещение кода в общую единицу, используемую этими формами, может бытьлучшее решение

0 голосов
/ 25 августа 2011

Обработчики событий - это просто обычные процедуры.Если ваш обработчик тиков ObstPongForm имеет дополнительный код, который должен запускаться в дополнение к коду PongForm, тогда вы можете при необходимости вызвать тиковый обработчик PongForm, например:

uses
  ..., PongForm;

procedure ObstPongForm.TickHandler(Sender: TObject);
begin
  ...
  PongForm.TickHandler(Self);
  ...
end;
...