Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

События дочерних форм Mdi приложения

323
29 июля 2004 года
Sergun
228 / / 20.09.2000
Как отловить события открытия/закрытия (активации/деактивации) дочерних форм в MDI приложении..?
294
30 июля 2004 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by Sergun
Как отловить события открытия/закрытия (активации/деактивации) дочерних форм в MDI приложении..?


Посылай свои сообщения (типа "дочернее окно 1 активировано") из дочерних окон родительскому.

323
30 июля 2004 года
Sergun
228 / / 20.09.2000
Цитата:
Originally posted by Plisteron

Посылай свои сообщения (типа "дочернее окно 1 активировано") из дочерних окон родительскому.



а постандартней никак нельзя?

310
30 июля 2004 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Sergun


а постандартней никак нельзя?


Разве что попробовать создать VCL-обработчки стандартный WM_MDI-сообщений.

294
31 июля 2004 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by Sergun
а постандартней никак нельзя?


Куда уж стандартнее -- пользоваться стандартным механизмом сообщений Windows...

323
01 августа 2004 года
Sergun
228 / / 20.09.2000
а какие конкретно сообщения там надо обрабатывать? можно примерчик если не трудно?
294
02 августа 2004 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by Sergun
а какие конкретно сообщения там надо обрабатывать? можно примерчик если не трудно?



Что-то в таком духе.

В MDIForm.cpp пишем:

Код:
void __fastcall TMainForm::ChildActivated(int FormObj)
{
    TMDIChild *c = (TMDIChild*)FormObj;
    if(c != NULL)
        ShowMessage(AnsiString("Активирован MDIChild ") + c->Caption);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ChildDeactivated(int FormObj)
{
    TMDIChild *c = (TMDIChild*)FormObj;
    if(c != NULL)
        ShowMessage(AnsiString("Дективирован MDIChild ") + c->Caption);
}


В MDIForm.h в описании класса:
Код:
void __fastcall ChildActivated(int FormObj);
    void __fastcall ChildDeactivated(int FormObj);
    virtual void __fastcall Dispatch(void *Message)
    {
        PMessage m = (PMessage)Message;
        switch(m->Msg)
        {
            case WM_USER + WM_I_HAVE_ACTIVATED:
                ChildActivated(m->LParam);
                break;
            case WM_USER + WM_I_HAVE_DEACTIVATED:
                ChildDeactivated(m->LParam);
                break;
            default:
                TForm::Dispatch(Message);
                break;
        }
    };


Не забыть написать где-нибудь:
 
Код:
#define WM_I_HAVE_ACTIVATED   601
#define WM_I_HAVE_DEACTIVATED 602


В CildWin.cpp:
 
Код:
void __fastcall TMDIChild::FormActivate(TObject *Sender)
{
    PostMessage(MainForm->Handle,WM_USER + WM_I_HAVE_ACTIVATED, 0, (int)this);
}
//---------------------------------------------------------------------------

void __fastcall TMDIChild::FormDeactivate(TObject *Sender)
{
    PostMessage(MainForm->Handle,WM_USER + WM_I_HAVE_DEACTIVATED, 0, (int)this);
}


Вот такой скромный пример.
323
02 августа 2004 года
Sergun
228 / / 20.09.2000
Цитата:
Originally posted by Plisteron
Вот такой скромный пример.



Все конечно хорошо, я этот вариант уже рассматривал когда нужно обрабатывать сообщения Windows приходящие к дочерним окнам... причем там есть уже предусмотренные сообщения (без использования WM_USER).
Однако, если в приложении будет сотник окон к примеру, обрабатывать сообщения для каждого окна не совсем красиво, хочется обрабатывать какое-то сообщение родительского окна, что что-то показалось/скрылось/активировалось/деактивировалось итд итп... вот какая задача стоит:)

323
02 августа 2004 года
Sergun
228 / / 20.09.2000
забыл сказать - дочерние формы MDI-приложения вызываются из DLL, не хотелось бы туда вставлять какие-то обработчики по этому поводу:)
294
03 августа 2004 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by Sergun
забыл сказать - дочерние формы MDI-приложения вызываются из DLL, не хотелось бы туда вставлять какие-то обработчики по этому поводу:)



Хех... Как будто их там нет... Всё виндовое межмордие -- сплошные обработчики сообщений, так что не комплексуй. Запусти какой-нибудь WinSpy и посмотри, например, сколько мессаг M$ Excel сам себе посылает.

323
03 августа 2004 года
Sergun
228 / / 20.09.2000
Цитата:
Originally posted by Plisteron


Хех... Как будто их там нет... Всё виндовое межмордие -- сплошные обработчики сообщений, так что не комплексуй. Запусти какой-нибудь WinSpy и посмотри, например, сколько мессаг M$ Excel сам себе посылает.



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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог