Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
1-35261
Daiz13
2002-07-31 10:39
2002.08.12
Чем создать патч


3-35144
Devid
2002-07-20 20:41
2002.08.12
Простой да ужаса вопрос


3-35202
Genry
2002-07-23 15:21
2002.08.12
Проверка значений в DBGrid e


14-35430
Wild Wizard
2002-07-17 10:30
2002.08.12
Я тоже поступил


7-35469
[ KgB ] GENERAL
2002-05-25 00:03
2002.08.12
Люди помогите, ну очень надо...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский