Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.008 c
14-35454
Digitalloops
2002-07-17 21:56
2002.08.12
Сколько стоит монитор?


1-35368
wonder_boy
2002-07-29 12:19
2002.08.12
HTML HELP через API


3-35214
Tornado
2002-07-24 09:38
2002.08.12
как объеденить??


3-35183
alextov
2002-07-23 10:41
2002.08.12
Как присвоить TField.NewValue значение null ?


7-35474
Dizer
2002-05-28 14:53
2002.08.12
Про COM-port




   Наверх