Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.12;
Скачать: CL | DM;

Вниз

Как в своем компоненте отследить изменение заголовка ыормы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
1-35304
Roma111
2002-07-29 15:01
2002.08.12
QRGroup в QReport


1-35303
Kurt
2002-07-29 13:35
2002.08.12
Как искать с помощью FindDialog текст только вверх??


1-35291
Aleksandr
2002-07-29 14:06
2002.08.12
Можно ли трассировать в Делфи


3-35135
Larisa Perova
2002-07-21 13:48
2002.08.12
Interbase создание триггеров


4-35506
Maximus II
2002-06-06 16:55
2002.08.12
Аналог TBitMap.LoadFromFile( xxxxx )