Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
ВнизВопрос Про TComponent Найти похожие ветки
← →
Демонов Е.В. (2002-09-25 14:13) [0]каким образом можно в обьекте происходящем непостредственно от класса TComponent чей OWNER=FOMR1 узнать что изменился FONT у FORM1, если я перехватываю оконную процедуру Функцией SetWindowLong ?
← →
REA (2002-09-25 16:10) [1]У Font есть событие OnChange. Его и перехвати.
← →
Демонов Е.В. (2002-09-25 16:41) [2]>>REA
А каким Образом ?
пример бы, кратенький
← →
REA (2002-09-25 16:58) [3]TForm(Component.Owner).Font.OnChange := MyChangeEventHandler;
← →
Демонов Е.В. (2002-09-25 17:09) [4]Ну А Старый Font.OnChange куда девать.
Скажешь Запускать в новом, - не это не выход у меня этих наследников TComponent на форме может быть несколько.
← →
Юрий Зотов (2002-09-25 17:13) [5]Посмотрите в модуле Controls сообщения CM_FONTCHANGED, CM_PARENTFONTCHANGED, для чего, как, кем и кому посылаются и т.д.
← →
Демонов Е.В. (2002-09-25 17:16) [6]Так они посылаются, по моему
Fro i:=0 to ControlsCount-1
do
Control[i].Perform(CM_FONTCHANGED);
А У Меня Предок TComponent.
как Тогда
← →
Юрий Зотов (2002-09-25 17:19) [7]Вы же перехватили оконную процедуру.
← →
Демонов Е.В. (2002-09-25 17:20) [8]А разве туда посылаются сообщения CM_FONTCHANGED, CM_PARENTFONTCHANGED? Помоему нет.
← →
Юрий Зотов (2002-09-25 17:27) [9]Если Perform, то нет. См. свойство WindowProc.
← →
qube (2002-09-25 17:27) [10]
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:28) [11]CM_FONTCHANGED, CM_PARENTFONTCHANGED - Это Внутринние Сообщения компонентов VCL , так что оконная процедура их не ловит.
← →
Демонов Е.В. (2002-09-25 17:29) [12]Ну Не то это , Я Же ловлю оконную процедуру функцией API SetWindowLong - А Туда Сообщения CM_FONTCHANGED, CM_PARENTFONTCHANGED Не попадают.
← →
Юрий Зотов (2002-09-25 17:31) [13]Повторяю:
Если Perform, то нет. См. свойство WindowProc.
Только Вы сначала посмотрите, а потом отвечайте, ладно?
← →
Демонов Е.В. (2002-09-25 17:35) [14]А мне смотреть некуда - я на работе а тут DElphi нет.
А использую я SetWindowLong(handle,GWL_WNDProc, ) , а про свойство WindowProc я знаю но задача такая как при SetWindowLong(handle,GWL_WNDProc, ) поймать изменения Font у Окна заданного Handle.
И Что Значит
Если Perform, то нет.
Что нет то.?
← →
Юрий Зотов (2002-09-25 17:43) [15]Если сообщение CM_xxx идет через Perform, то к Вам оно не попадет. Но переопределив WindowProc, Вы поймаете все.
← →
Старый паскалист (2002-09-25 17:51) [16]По умолчанию в Дельфях оконая ф-я имеет вид:
(пропущенная сквозь 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-26 18:23) [17]>>Старый паскалист
Очень даже всё толково обяснил.
Спасибо.:-)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c