Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сообщения Windows

397
27 марта 2008 года
SergPas
527 / / 03.02.2007
Сообщения в среде Delphi обрабатываются стандартным образом и в классе формы объявляются так:
Код:
type
  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;

Есть и другой способ обработки сообщений, связанныйх с формой:
Код:
type
  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;

Вопрос такой: как обрабатывать сообщения формы из другого класса, то есть как сделать так, чтобы поцедура обработки сообщения находилась в классе, отличном от класса формы, и обрабатывала события?
255
27 марта 2008 года
Dart Bobr
1.4K / / 09.04.2004
Если тебе такое, нужно, то скорее всего у тебя огромная проблема в архитектуре программы.
По теме скажу самое первое, что приходит в голову, - перенаправлять сообщения..
397
27 марта 2008 года
SergPas
527 / / 03.02.2007
Цитата:
Если тебе такое, нужно, то скорее всего у тебя огромная проблема в архитектуре программы.


Почему проблемы? Просто я хочу сделать что-то вроде "черного ящика" в виде класса для конечного пользователя...

255
28 марта 2008 года
Dart Bobr
1.4K / / 09.04.2004
так что мешает описать базовыый класс обработчик, и наследовать от него свои формы? По-моему это более элегантное и гибкое решение..
5
28 марта 2008 года
hardcase
4.5K / / 09.08.2005
Не думаю, что вам удастся оторвать обработку сообщений от класса.
В Делфи обработчики сообщений - это dynamic методы (нумерация в соответствии с номерами сообщений), вызываемые через метод Dispatch. Если посмотрите в исходники VCL, то найдете цикл обработки сообщений: там небольшой case-на некоторые сообщения и в else прописан вызов Dispatch.
286
28 марта 2008 года
misha_turist
572 / / 28.11.2005
Но ведь обработчики событий эллементов формы - это методы формы.... (к первому примеру). Или TApplicationEvents тот же.


Хотя согласен с превидущими постати разносить обработку и данные ИМХО не очень верно... особенно, если допускается наследование.
397
03 апреля 2008 года
SergPas
527 / / 03.02.2007
Цитата:

так что мешает описать базовыый класс обработчик, и наследовать от него свои формы? По-моему это более элегантное и гибкое решение..


Действительно, создал класс, наследуемый от TForm, дополнил его обработчиками событий, и сделал его родительским по отношению к создаваемой форме. Всё работает, только в том случае, если обработчики событий имеют, как я уже писал, следующий формат:
[LEFT]

Код:
type
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]
5
03 апреля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: SergPas
Я только одного не пойму, почему вы так категорично относитесь к разобщению обработчиков событий от класса формы, для которой и осуществляется это разобщение. Вспомните хотя бы то, как удобно работать с компонентами: минимум усилий - максимум пользы!

Обработчики событий не есть обработчики сообщений. Это разные вещи. Не каждое сообщение приводит к генерированию события. И не каждое событие - следствие приема сообщения.

События нужны для уведомления внешних сущностей об изменениях внутри компонента. Сообщения же - это унифицированные механизмы Windows для управления работой компонентов. Потому обработчики сообщений должны быть реализованы внутри классов, к которым они относятся - логически, они являются "методами", которые вызывает Windows при работе приложения.

303
08 апреля 2008 года
makbeth
1.0K / / 25.11.2004
SergPas, если уж невтерпеж обрабатывать все в другом классе, то можно использовать для этих целей свойство WindowProc, с помощью которого можно подменить обработчик сообщений любого контрола.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог