Форум: "Основная";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
ВнизКак в своем компоненте отследить изменение заголовка ыормы Найти похожие ветки
← →
BOPOH (2002-07-30 08:35) [0]Вчера модераторы мой вопрос удалили, может сегодня кто нибудь поможет...
Вопрос такой:
моему компоненту нужно отследить изменение заголовка у формы на которой он лежит, я вот что сделал:
//------------------------------------------------------------------------------
procedure TOVFlatTitlebar.Loaded;
begin
inherited Loaded;
if not (csDesigning in ComponentState) and (FParentForm <> nil) then begin
FWndProc := MakeObjectInstance(TitlebarWndProc);
FDefProc := SetWindowLong(FParentForm.Handle, GWL_WNDPROC, LongInt(FWndProc));
end;
end;
//------------------------------------------------------------------------------
procedure TOVFlatTitlebar.TitlebarWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_SETTEXT: Invalidate;
end;
Message.Result := CallWindowProc(Pointer(FDefProc), FParentForm.Handle, Message.Msg, Message.WParam, Message.LParam)
end;
//------------------------------------------------------------------------------
но компонент реагирует только если заголовок меняется функцией SetWindowText, а если заголовок меняется Form1.Caption := ... то тут обработка WM_SETTEXT не помогает. Что надо сделать чтобы отследить изменение свойства Caption ?
← →
Starkom (2002-07-30 08:50) [1]В исходниках TCustomForm - Unit Forms
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
она вызывается при Form.Caption:=... Может, поможет.
Unit Controls;
const
CM_BASE = $B000;
CM_TEXTCHANGED = CM_BASE + 18;
← →
BOPOH (2002-07-30 09:18) [2]to Starkom (30.07.02 08:50) К сожалению не помогло...
← →
Юрий Зотов (2002-07-30 09:29) [3]У формы есть свойство WindowProc. Оно указывает на ее WndProc. В кострукторе компонента пропишите туда адрес своего метода (запомнив старый), а деструкторе восстановите все назад. В самом методе можете вызывать старую WndProc по запомненной ссылке.
Только аккуратно! Не забудьте о том, что юзер может бросить на форму НЕСКОЛЬКО Ваших компонентов, а потом удалить ЛЮБЫЕ из них, в любом порядке.
Лучше всего, когда Ваш компонент прямо в конструкторе проверяет, единственный ли такой он на форме и если нет - то ничего не делает, а возбуждает исключение (при этом он будет автоматически уничтожен).
← →
Starkom (2002-07-30 09:31) [4]а что есть FParentForm?
К сожалению не помогло - а что пытался сделать то?
← →
Alx2 (2002-07-30 09:44) [5]Да, как и сказал Юрий Зотов, до переопределенной процедуры окна при изменении св-ва Caption дело не доходит (вызывается CallWindowProc с "казенным" wndproc).
Ну а так - работает в некоторых случаях :)
FWndProc:TWndMethod;
procedure TOVFlatTitlebar.Loaded;
begin
inherited Loaded;
if not (csDesigning in ComponentState) and (FParentForm <> nil) then begin
FDefProc := FParentForm.WindowProc;
FParentForm.WindowProc := TitlebarWndProc;
end;
end;
← →
BOPOH (2002-07-30 12:35) [6]Большое спасибо, господа, за участие.
>>Alx2 © (30.07.02 09:44)
>> Ну а так - работает в некоторых случаях :)
Почему в некоторых? У меня нормально работает.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c