Здравствуйте, batu, Вы писали:
B>Здравствуйте, OV_ZHARKOV, Вы писали:
B>>>Ну, и зачем понятное, и естественное "вызов метода" считать "посылкой сообщения"? Ради чего это нагромождение понятий? Только не вздумай отвечать
Это риторический вопрос.
OV_>>Кстати,был как-то спор на тему "Посылка сообщения против вызова методов".
OV_>>Сообщения обрабатываются одним заведомо известным методом(типа WndProc в WinApi).
OV_>>Преимущество,что неопознанные сообщения просто проскакивают сквозь case, не порождая никаких исключений,а вызов несуществующего метода — да.
B>И как вы считаете что лучше?
Не знаю,вроде бы уже все смешалось и нет особой разницы.
1.Скажем,в Delphi TObject — базовый класс для всех остальных,
TObject = class
...
procedure Dispatch(var Message); virtual;
procedure DefaultHandler(var Message); virtual;
...
end;
и далее
TForm = class(...)
...
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
...
end;
Т.е. послать сообщение объекту здесь-вызвать метод Dispatch(),а обработчик сообщения будет либо назначенный,либо DefaultHandler.
2.Или,например такой код:
CLASS TOleAuto
...
ERROR HANDLER OnError()
...
ENDCLASS
METHOD OnError( uParam1, uParam2, uParam3, uParam4, uParam5, uParam6 ) CLASS TOleAuto
LOCAL cMsg := __GetMessage()
LOCAL uObj
IF LEFT( cMsg, 1 ) == '_'
::Set( SUBS( cMsg, 2 ), uParam1, uParam2, uParam3, uParam4, uParam5, uParam6 )
ELSE
uObj := ::Get( cMsg, uParam1, uParam2, uParam3, uParam4, uParam5, uParam6 )
ENDIF
RETURN uObj
Здесь вызов несуществующего метода перехватывается в обработчике OnError и трактуется как посылка сообщения,
где идентификатор типа сообщения уже не число, а строка — <Имя метода>.Ну и параметры соответственно.