Сообщения Windows
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Есть и другой способ обработки сообщений, связанныйх с формой:
TForm1 = class(TForm)
procedure Create(var msg: TMessage); message WM_CREATE;
procedure Destroy(var msg: TMessage); message WM_DESTROY;
procedure Paint(var msg: TMessage); message WM_PAINT;
procedure Resize(var msg: TMessage); message WM_SIZE;
procedure Show(var msg: TMessage); message WM_SHOWWINDOW;
private
{ Private declarations }
public
{ Public declarations }
end;
Вопрос такой: как обрабатывать сообщения формы из другого класса, то есть как сделать так, чтобы поцедура обработки сообщения находилась в классе, отличном от класса формы, и обрабатывала события?
По теме скажу самое первое, что приходит в голову, - перенаправлять сообщения..
Почему проблемы? Просто я хочу сделать что-то вроде "черного ящика" в виде класса для конечного пользователя...
В Делфи обработчики сообщений - это dynamic методы (нумерация в соответствии с номерами сообщений), вызываемые через метод Dispatch. Если посмотрите в исходники VCL, то найдете цикл обработки сообщений: там небольшой case-на некоторые сообщения и в else прописан вызов Dispatch.
Хотя согласен с превидущими постати разносить обработку и данные ИМХО не очень верно... особенно, если допускается наследование.
так что мешает описать базовыый класс обработчик, и наследовать от него свои формы? По-моему это более элегантное и гибкое решение..
Действительно, создал класс, наследуемый от TForm, дополнил его обработчиками событий, и сделал его родительским по отношению к создаваемой форме. Всё работает, только в том случае, если обработчики событий имеют, как я уже писал, следующий формат:
[LEFT]
surface = class(TForm)
procedure Create(var msg: TMessage); message WM_CREATE;
procedure Destroy(var msg: TMessage); message WM_DESTROY;
procedure Paint(var msg: TMessage); message WM_PAINT;
procedure Resize(var msg: TMessage); message WM_SIZE;
procedure Show(var msg: TMessage); message WM_SHOWWINDOW;
private
{ Private declarations }
public
{ Public declarations }
end;
Я только одного не пойму, почему вы так категорично относитесь к разобщению обработчиков событий от класса формы, для которой и осуществляется это разобщение. Вспомните хотя бы то, как удобно работать с компонентами: минимум усилий - максимум пользы![/LEFT]
Обработчики событий не есть обработчики сообщений. Это разные вещи. Не каждое сообщение приводит к генерированию события. И не каждое событие - следствие приема сообщения.
События нужны для уведомления внешних сущностей об изменениях внутри компонента. Сообщения же - это унифицированные механизмы Windows для управления работой компонентов. Потому обработчики сообщений должны быть реализованы внутри классов, к которым они относятся - логически, они являются "методами", которые вызывает Windows при работе приложения.