![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос Про TComponent
Демонов Е.В. © (2002-09-25 14:13:00)каким образом можно в обьекте происходящем непостредственно от класса TComponent чей OWNER=FOMR1 узнать что изменился FONT у FORM1, если я перехватываю оконную процедуру Функцией SetWindowLong ?
Демонов Е.В. (2002-09-26 18:23:00) [1]>>Старый паскалист
Очень даже всё толково обяснил.
Спасибо.:-)
Старый паскалист (2002-09-25 17:51:00) [2]По умолчанию в Дельфях оконая ф-я имеет вид:
(пропущенная сквозь MakeObjectInstance, конечно)
procedure TWinControl.MainWndProc(var Message: TMessage);
begin
try
try
WindowProc(Message);
// property WindowProc: TWndMethod read FWindowProc write FWindowProc;
finally
FreeDeviceContexts;
FreeMemoryContexts;
end;
except
Application.HandleException(Self);
end;
end;
Соответственно, Дельфи считает, что оконная ф-я всегда
вызывает WindowProc (св-во процедурного типа), и в случае
с Perform направляет сообщение не в оконную процедуру, а прямо в WindowProc.
Когда ты устанавливаешь оконную процедуру через SetWindowLong,
ты рассогласовываешь реальность с представлениями Дельфи,
и у тебя получаются две оконные ф-и - та, которую видит Виндовс (указатель на к-рую хранится в оконной структуре), и та, которую видит Дельфи - св-во WindowProc, хранящееся в компоненте.
Поэтому вместо установки новой ок.ф-и через
SetWindowLong тебе лучше изменить св-во WindowProc,
к-рое специально для этих целей и предназначено.
Юрий Зотов (2002-09-25 17:43:00) [3]Если сообщение CM_xxx идет через Perform, то к Вам оно не попадет. Но переопределив WindowProc, Вы поймаете все.
Демонов Е.В. (2002-09-25 17:35:00) [4]А мне смотреть некуда - я на работе а тут DElphi нет.
А использую я SetWindowLong(handle,GWL_WNDProc, ) , а про свойство WindowProc я знаю но задача такая как при SetWindowLong(handle,GWL_WNDProc, ) поймать изменения Font у Окна заданного Handle.
И Что Значит
Если Perform, то нет.
Что нет то.?
Юрий Зотов (2002-09-25 17:31:00) [5]Повторяю:
Если Perform, то нет. См. свойство WindowProc.
Только Вы сначала посмотрите, а потом отвечайте, ладно?
Демонов Е.В. (2002-09-25 17:29:00) [6]Ну Не то это , Я Же ловлю оконную процедуру функцией API SetWindowLong - А Туда Сообщения CM_FONTCHANGED, CM_PARENTFONTCHANGED Не попадают.
Демонов Е.В. (2002-09-25 17:28:00) [7]CM_FONTCHANGED, CM_PARENTFONTCHANGED - Это Внутринние Сообщения компонентов VCL , так что оконная процедура их не ловит.
Юрий Зотов (2002-09-25 17:27:00) [8]Если Perform, то нет. См. свойство WindowProc.
qube (2002-09-25 17:27:00) [9]
function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
var
Message: TMessage;
begin
Message.Msg := Msg;
Message.WParam := WParam;
Message.LParam := LParam;
Message.Result := 0;
if Self <> nil then WindowProc(Message);
Result := Message.Result;
end;
Демонов Е.В. (2002-09-25 17:20:00) [10]А разве туда посылаются сообщения CM_FONTCHANGED, CM_PARENTFONTCHANGED? Помоему нет.
Юрий Зотов (2002-09-25 17:19:00) [11]Вы же перехватили оконную процедуру.
Демонов Е.В. (2002-09-25 17:16:00) [12]Так они посылаются, по моему
Fro i:=0 to ControlsCount-1
do
Control[i].Perform(CM_FONTCHANGED);
А У Меня Предок TComponent.
как Тогда
Юрий Зотов (2002-09-25 17:13:00) [13]Посмотрите в модуле Controls сообщения CM_FONTCHANGED, CM_PARENTFONTCHANGED, для чего, как, кем и кому посылаются и т.д.
Демонов Е.В. (2002-09-25 17:09:00) [14]Ну А Старый Font.OnChange куда девать.
Скажешь Запускать в новом, - не это не выход у меня этих наследников TComponent на форме может быть несколько.
REA (2002-09-25 16:58:00) [15]TForm(Component.Owner).Font.OnChange := MyChangeEventHandler;
Демонов Е.В. (2002-09-25 16:41:00) [16]>>REA
А каким Образом ?
пример бы, кратенький
REA (2002-09-25 16:10:00) [17]У Font есть событие OnChange. Его и перехвати.