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

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

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

4 ответа

Решение

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

ObstPongForm.Ticker.OnTick := PongForm.TickerTick;

Было бы лучше, если бы обе формы вызывали другой класс, который реализует логику, используемую обеими. Если вы пишете всю логику своей программы в обработчике событий 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;

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

uses
  ..., PongForm;

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

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

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

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

Object ObstPongForm: TObstPongForm вInherited ObstPongForm: TObstPongForm

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

Другие вопросы по тегам