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

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

Как в своем компоненте отследить изменение заголовка ыормы [D6, WinXP]


BOPOH ©   (2002-07-30 08:35:00) 

Вчера модераторы мой вопрос удалили, может сегодня кто нибудь поможет...
Вопрос такой:
моему компоненту нужно отследить изменение заголовка у формы на которой он лежит, я вот что сделал:
//------------------------------------------------------------------------------
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 ?


BOPOH   (2002-07-30 12:35:00) [1]

Большое спасибо, господа, за участие.
>>Alx2 © (30.07.02 09:44)
>> Ну а так - работает в некоторых случаях :)
Почему в некоторых? У меня нормально работает.


Alx2   (2002-07-30 09:44:00) [2]

Да, как и сказал Юрий Зотов, до переопределенной процедуры окна при изменении св-ва 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;


Starkom   (2002-07-30 09:31:00) [3]

а что есть FParentForm?
К сожалению не помогло - а что пытался сделать то?


Юрий Зотов   (2002-07-30 09:29:00) [4]

У формы есть свойство WindowProc. Оно указывает на ее WndProc. В кострукторе компонента пропишите туда адрес своего метода (запомнив старый), а деструкторе восстановите все назад. В самом методе можете вызывать старую WndProc по запомненной ссылке.

Только аккуратно! Не забудьте о том, что юзер может бросить на форму НЕСКОЛЬКО Ваших компонентов, а потом удалить ЛЮБЫЕ из них, в любом порядке.

Лучше всего, когда Ваш компонент прямо в конструкторе проверяет, единственный ли такой он на форме и если нет - то ничего не делает, а возбуждает исключение (при этом он будет автоматически уничтожен).


BOPOH   (2002-07-30 09:18:00) [5]

to Starkom (30.07.02 08:50) К сожалению не помогло...


Starkom   (2002-07-30 08:50:00) [6]

В исходниках TCustomForm - Unit Forms
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
она вызывается при Form.Caption:=... Может, поможет.

Unit Controls;
const
CM_BASE = $B000;
CM_TEXTCHANGED = CM_BASE + 18;


Наверх

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