Однажды назад я начал переписывать один из моих старых компонентов и решил улучшить его читабельность.
Мой компонент - это типичный TWinControl
, который переопределил WndProc
для обработки множества моих собственных сообщений. Для каждого сообщения существует так много кода, и мне стало трудно читать код.
Итак, в поисках решения для улучшения кода внутри WndProc
я организовал эти большие фрагменты кода в процедурах, которые вызываются каждый раз, когда соответствующее сообщение доставляется в WndProc
. Вот как это выглядит сейчас:
procedure TMyControl.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_WINDOWPOSCHANGED:
WMWINDOWPOSCHANGED(Message);
WM_DESTROY:
WMDESTROY(Message);
WM_STYLECHANGED:
WMSTYLECHANGED(Message);
// lots of the same procedures for Windows messages
// ...
MM_FOLDER_CHANGED:
MMFOLDERCHANGED(Message);
MM_DIRECTORY_CHANGED:
MMDIRECTORYCHANGED(Message);
// lots of the same procedures for my own messages
// ...
else
Inherited WndProc(Message);
end;
end;
К сожалению Inherited
слово в этих процедурах больше не работает!
Важное примечание: в некоторых сообщениях WM_XXX я не звонил Inherited
, чтобы выполнить собственную обработку такого сообщения, поэтому приведенный ниже код сломает мои усилия по реализации некоторых функций.
procedure TMyControl.WndProc(var Message: TMessage);
begin
Inherited WndProc(Message);
case Message.Msg of
WM_WINDOWPOSCHANGED:
WMWINDOWPOSCHANGED(Message);
// further messages
// ...
end;
end;
Я также хочу не вставлять Inherited
после каждого идентификатора сообщения, как показано ниже, потому что это выглядит ужасно, и я думаю, что существует более элегантный способ переопределить WndProc
.
procedure TMyControl.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_WINDOWPOSCHANGED:
begin
Inherited WndProc(Message);
WMWINDOWPOSCHANGED(Message);
end;
// further messages
// ...
end;
end;
Итак, мой вопрос:
как правильно переопределить WndProc
, чтобы иметь возможность использовать код, сгруппированный в процедурах, и иметь возможность вызывать исходную оконную процедуру только для некоторых сообщений?