Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос Про 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. Его и перехвати.


Наверх

Титульная страница Поиск, карта сайта Написать письмо