Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Вниз

Компонент   Найти похожие ветки 

 
Igor_thief   (2002-07-16 12:28) [0]

Я делаю компонент, который минимизирует форму в трей. Чтобы загнать компонент в трей, надо перехватить момент минимизации формы. Это просто, если описать обработчик в программе. А как сделать чтобы сам компонент перехватывал момент минимизации формы? А то не очень хочется из основной программы перехватывать момент минимизации и вызывать метод компонента для помещения проги в трей.


 
Сатир   (2002-07-16 16:31) [1]

для этого тебе нужно обрабатывать это событие в самом компоненте, а именно: определяешь, кто является владельцем данного компонента и если вледелец - форма, значит и неё есть событие NoMinimize. Вот и присваиваешь этому событию то, что тебе нужно, напр.:

if Self.Owner is TForm then Owner.OnMinimize:= MoveInTray,

где MoveInTray - процедура, которая отображает форму в трее




 
Сатир   (2002-07-16 18:10) [2]

...и этот кусок кода тебе нужно будет поместить в конструктор данного компонента, но один маленький момент: может получиться побочный эффект, когда в режиме дизайна при сворачивании формы, она будет сворачиваться в трей или выдавать ошибку... или всё будет нормально и без эффектов.
удачи


 
Юрий Зотов   (2002-07-16 20:16) [3]

> Сатир

Вы САМИ писали компоненты? И много ли?

Если да, то зачем давать ТАКИЕ советы. А если нет, то зачем вообще их давать?

КОМПОНЕНТЫ НЕ ИМЕЮТ ПРАВА ПОЛЬЗОВАТЬСЯ СОБЫТИЯМИ, ДОСТУПНЫМИ ИХ ЮЗЕРУ. Это аксиома.

Потому что брошу я Ваш компонент на форму и назначу этой форме СВОЙ обработчик OnMinimize (а кто мне запретит? все легально). И этот мой обработчик тут же перекроет Ваш. После чего такой компонент окажется в одном, извините, очень глубоком месте.


> Igor_thief

Вам нужно заместить оконную процедуру формы своей.

1. Введите в компонент приватное поле FWndMethod: TWndMethod и приватный метод
procedure WndMethod(var Message: TMessage);

2. В конструкторе, во-первых, ОБЯЗАТЕЛЬНО проследите, что Owner - это именно TCustomForm (а не что-то другое), и, во-вторых, что таких компонентов на ней еще нет (при невыполнении любого из этих условий прямо в конструкторе возбуждайте Exception - это СТРОГО обязательно).

3. Далее в том же конструкторе запомните старую оконную процедуру и замените ее своей:

with TCustomForm(Owner) do
begin
FWndMethod := WindowProc;
WindowProc := WndMethod;
end;

4. Теперь Ваш компонент будет получать все сообщения, адресованные форме и Вы легко сможете отследить, когда придет WM_SYSCOMMAND с SC_MINIMIZE. Это сообщение обрабатывайте, как Вам нужно, а остальные просто передавайте старой процедуре:
FWndMethod(Message);

5. В деструкторе не забудьте восстановить все назад:
with TCustomForm(Owner) do
if not (csDestroying in ComponentState) then
WindowProc := FWndMethod;


 
Юрий Зотов   (2002-07-16 20:17) [4]

> Сатир

Вы САМИ писали компоненты? И много ли?

Если да, то зачем давать ТАКИЕ советы? А если нет, то зачем вообще их давать?

КОМПОНЕНТЫ НЕ ИМЕЮТ ПРАВА ПОЛЬЗОВАТЬСЯ СОБЫТИЯМИ, ДОСТУПНЫМИ ИХ ЮЗЕРУ. Это аксиома.

Потому что брошу я Ваш компонент на форму и назначу этой форме СВОЙ обработчик OnMinimize (а кто мне запретит? все легально). И этот мой обработчик тут же перекроет Ваш. После чего такой компонент окажется в одном, извините, очень глубоком месте.


> Igor_thief

Вам нужно заместить оконную процедуру формы своей.

1. Введите в компонент приватное поле FWndMethod: TWndMethod и приватный метод
procedure WndMethod(var Message: TMessage);

2. В конструкторе, во-первых, ОБЯЗАТЕЛЬНО проследите, что Owner - это именно TCustomForm (а не что-то другое), и, во-вторых, что таких компонентов на ней еще нет (при невыполнении любого из этих условий прямо в конструкторе возбуждайте Exception - это СТРОГО обязательно).

3. Далее в том же конструкторе запомните старую оконную процедуру и замените ее своей:

with TCustomForm(Owner) do
begin
FWndMethod := WindowProc;
WindowProc := WndMethod;
end;

4. Теперь Ваш компонент будет получать все сообщения, адресованные форме и Вы легко сможете отследить, когда придет WM_SYSCOMMAND с SC_MINIMIZE. Это сообщение обрабатывайте, как Вам нужно, а остальные просто передавайте старой процедуре:
FWndMethod(Message);

5. В деструкторе не забудьте восстановить все назад:
with TCustomForm(Owner) do
if not (csDestroying in ComponentState) then
WindowProc := FWndMethod;


 
Юрий Зотов   (2002-07-16 20:20) [5]

Приношу извинения за двойной постинг - при передаче слетела связь, я повторил, а оказалось, пройти все же успело.


 
evgeg   (2002-07-16 20:24) [6]

> что Owner - это именно TCustomForm (а не что-то другое),

Наверное, вы имели в виду: "TCustomForm или его наследник"?


 
Юрий Зотов   (2002-07-16 20:48) [7]

Это одно и то же. Все наследники TCustomForm - это тоже TCustomForm. Имелось в виду обычное IS.


 
Igor_thief   (2002-07-17 12:51) [8]

>Юрий Зотов
Большое Вам спасибо за советы. Я непременно воспользуюсь ними и сообщу Вам результат.


 
Сатир   (2002-07-17 16:28) [9]

2Юрий Зотов
а чё так категорично?
...я смотрю, никто не отвечает да и думаю, вставлю свои 5 коп., а Вы сразу и оклеветали.
может, сдают нервы?:-)
с уваженим.


 
Юрий Зотов   (2002-07-17 22:04) [10]

Да, пожалуй, переборщил... наверное, и правда нервы... и жара...

Писал я это после просмотра очередной ветки на 30 постингов, из которых нужно было оставить только один (второй по номеру!). Остальные - бред.

Наверное, я чересчур эмоционален, но всегда раздражаюсь, когда вижу такие вещи. Не пойму - вот те 28 человек, которые написали уже ПОСЛЕ правильного, полного и точного ответа - они вообще зачем писали? Ведь ответ-то уже был, зачем мусорить?

Себя показать хотели, что ли? Ох, лучше б не показывали...

А потом увидел еще и эту крамолу - вот и влепил сгоряча. Не обижайтесь, ОК? Просто такие вещи для нормального разработчика компонентов - это действительно азбука.


 
MJH   (2002-07-18 02:05) [11]

а зачем собственно КОМПОНЕНТ делать? таких уже милионы!
если интересно - скачай да посмотри


 
Ketmar   (2002-07-18 04:55) [12]

а собственно хотя бы затем, дабы научиться. если все время брать чужое, то учится сложнее. Я, например, вообще такие минимальные вещи предпочитаю использовать своего производства - удобнее, и кредитов лишних в софт не надо пихать :-)

Satanas Nobiscum!
18-VII-XXXVII A.S.


 
Сатир   (2002-07-18 12:31) [13]

2Юрий Зотов ©
ок, я на Вас не в обиде


 
Сатир   (2002-07-18 12:31) [14]

2Юрий Зотов ©
ок, я на Вас не в обиде, наоборот спасибо, что исправили меня


 
Igor_thief   (2002-07-19 12:21) [15]

>MJH © (18.07.02 02:05)
На написании компонентов можно многому научиться!


 
Igor_thief   (2002-07-19 12:22) [16]

>MJH © (18.07.02 02:05)
На написании компонентов можно многому научиться! Да и одну задачу можно решать разными путями.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
1-48167
Дельфятник
2002-08-02 11:31
2002.08.15
Освобождение памяти из-под объектов.


14-48293
партизан
2002-07-22 10:35
2002.08.15
Меняются типы героев


1-48149
MikeFW
2002-08-01 15:54
2002.08.15
Как сделать выполнение функции по нажатию кнопки Enter?


6-48241
Arhangel
2002-05-31 17:41
2002.08.15
Http


4-48352
hooky-mars
2002-05-29 18:34
2002.08.15
Компоненты чужого окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский