Форум: "Потрепаться";
Текущий архив: 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.007 c