C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
1.Создать свою форму, 2.Перехват события формы компонентом
Deem
Отправлено: 25.02.2005, 12:08


Мастер участка

Группа: Участник
Сообщений: 327



1. Народ. Задача такая : добавить __published __property в класс формы и залить ее в repository или еще куда, чтобы создавть новую фому на основе своей и менять новые свойства в инспекторе объектов.
Пока у меня нифига не вышло: в секцию __published ничего добавить не дают. А как тогда?

2. Параллельно сделал компонент, который должен сделать необходимые изменения за форму. Но должен перехватить ее WM_ERASEBACKGROUND. Тут не знаю, как подступиться. Сама форма в этом варианте компненту ничем помагать не должна, т.к. она — стандартная/любая.
Deem
Отправлено: 02.03.2005, 12:43


Мастер участка

Группа: Участник
Сообщений: 327



Ну, с компонентом я выкрутился: подсунул родительской форме свой WndProc. Но с компонетом не очень удобно. Хотелось бы форму свою.
Неужели никто не делал форму с новыми published-свойствами?!
Bond
Отправлено: 02.03.2005, 12:49


Станционный диспетчер

Группа: Участник
Сообщений: 142



Я думаю что дружное молчание говорит само за себя smile.gif
Deem
Отправлено: 02.03.2005, 13:38


Мастер участка

Группа: Участник
Сообщений: 327



Неа, не говорит. Либо очень просто, либо — невозможно. Так как?
Ну да: еще и никто не делал. Мдя....

Отредактировано Deem — 02/03/2005, 13:39
olegenty
Отправлено: 03.03.2005, 08:10


Ветеран

Группа: Модератор
Сообщений: 2412



я так мыслю, твой компонент для обработки WM_ERASEBACKGROUND может работать только на уровне приложения в целом, т.е. намекаю на ApplicationEvents. можешь от него занаследоваться, или к нему привязаться.
Deem
Отправлено: 03.03.2005, 14:14


Мастер участка

Группа: Участник
Сообщений: 327



Усложняешь. У формы. на которую кладешь компонент, есть свойство WindowProc, которое есть указатель на функцию WndProc. Я написал свою с вызовом старой и собственной реакцией на WM_ERASEBACKGROUND.... Сперва как-то проехал такую возможность.
А потом начало получаться совсем мутно, т.к. мой компонент должен хорошо перелопатить стандартную форму (своего родителя). Было бы намного удобнее, если бы унаследованная форма все это делала. Сделал я новые свойства в унаследованной форме. Их можно менять программно. К примеру, два цвета задать для градиентной заливки можно в рантайме. А как это новые свойства воткнуть в инспектор объектов для задания их в дезайн-режиме, нигде не нашел. Так просто в __published ничего не воткнешь.
Я хочу узнать, как подсунуть билдеру свою форму, чтобы он с ней работал, как с TForm в режиме дезайна.

Отредактировано Deem — 03/03/2005, 14:16
GIZMO
Отправлено: 03.03.2005, 14:37


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Deem @ 02/03/2005, 12:43)
Ну, с компонентом я выкрутился: подсунул родительской форме свой WndProc.  Но с компонетом не очень удобно.  Хотелось бы форму свою.  
Неужели никто не делал форму с новыми published-свойствами?!

Привет!
1. Создаешь runtime пакет куда включаешь unit твоей формы в рукописном варианте без dfm. В Unit-е добавляешь свои свойства, события и т. п. Собираешь пакет. Все как обычно, типа:
CODE

//in h
class PACKAGE TExtForm : public TForm
{
__published: // IDE-managed Components

private:
   TNotifyEvent FOnEraseBkGnd;//только уведомление, если надо опр-й свой титп события
   void __fastcall SetOnEraseBkGnd(TNotifyEvent value);
   TNotifyEvent __fastcall GetOnEraseBkGnd();
   void __fastcall WMEraseBkGnd(Messages::TMessage & Message);//пусь это будет метод инициирующий событие
public:  // User declarations
   __fastcall TExtForm(TComponent* Owner):TForm(Owner){};
   __fastcall ~TExtForm(void){};
__published:
   __property TNotifyEvent OnEraseBkGnd  = { read=GetOnEraseBkGnd, write=SetOnEraseBkGnd };
protected:
   BEGIN_MESSAGE_MAP
       VCL_MESSAGE_HANDLER(WM_ERASEBKGND, Messages::TMessage, WMEraseBkGnd)
   END_MESSAGE_MAP(TForm)
};
//in cpp
#include <vcl.h>
#pragma hdrstop

#include "ExtForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
static inline void ValidCtrCheck(TExtForm *)
{
       new TExtForm(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TExtForm::SetOnEraseBkGnd(TNotifyEvent value)
{
   if(FOnEraseBkGnd != value) {
       FOnEraseBkGnd = value;
   }
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TExtForm::GetOnEraseBkGnd()
{
   return FOnEraseBkGnd;
}
//---------------------------------------------------------------------------
void __fastcall TExtForm::WMEraseBkGnd(Messages::TMessage & Message)
{
   //TODO: Add your source code here
   TForm::Dispatch(&Message);
   if (FOnEraseBkGnd) FOnEraseBkGnd(this);
}

2. Собираешь designtime пакет в нем только одна функция:
CODE

namespace Register
{
   void __fastcall PACKAGE Register()
   {
     RegisterCustomModule(__classid(TExtForm),__classid(TCustomModule));
   }
}

В Requires добавляешь ExtPackage.bpk. Устанавливаешь пакет в палитру.
3. Далее несколько волшебных операций:
На любой пустой форме, любого проекта (ну можно создать заново проект и добавить к нему новую форму), делаешь руками следующее:
CODE

#include <Forms.hpp>
#include "ExtForm.h" //<<<<<<<<<<<<<<<<<<<<<<<
//------------------------------------------------------------
//in h
class TForm1 : public TExtForm //вместо public TForm
{
...
//in cpp
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TExtForm(Owner)  //вместо TForm(Owner)
{
...

Затем правый клик по Form1 — View as Text и назад View as Form. В инспекторе объектов должно появиться событие OnEraseBkGnd. Затем еще раз правый клик по Form1 и Add to Repository — дать толковое название, описание, сохранить...
Теперь File|New|Forms там твоя форма и производные от которой теперь будут иметь событие OnEraseBkGnd.
Где-то была статья по теме. но не могу вспомнить...
Да не WM_ERASEBACKGROUND, а WM_ERASEBKGND.
GIZMO
Отправлено: 04.03.2005, 10:13


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Deem @ 02/03/2005, 12:43)
а) Ну, с компонентом я выкрутился: подсунул родительской форме свой WndProc. Но с компонетом не очень удобно. б) Хотелось бы форму свою.
Неужели никто не делал форму с новыми published-свойствами?!

а) Хотелось-бы взглянуть на компонент, интересно как ты ищешь WndProc формы?

б) + к пред. посту, подумал:
void __fastcall WMEraseBkGnd(Messages::TMessage & Message);
добавить virtual и перенести в секцию protected:
Deem
Отправлено: 05.03.2005, 15:32


Мастер участка

Группа: Участник
Сообщений: 327



>>а) Хотелось-бы взглянуть на компонент, интересно как ты ищешь
>>WndProc формы?
При "попадании" компонента на форму получаю родителя.
Свойство формы-родителя WindowProc. Сохраняю старый указатель у компонента, а кладу указатель на функцию компонента, в которой идет вызов старой и реакция на восстановление фона окна.

А про подсовывание своей формы  — оч. интересно. Буду пробовать. Хочу, знаешь ли, сделать форму по функциям и виду не похожей на тоталитарные окна винды: хошь — зеленую, хошь — синюю, ато и полосатую.... smile.gif Спасибо.
GIZMO
Отправлено: 09.03.2005, 10:04


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Deem @ 05/03/2005, 15:32)
При "попадании" компонента на форму получаю родителя.


...это интересно
1. Родителя или владельца?
2. Если родитель не форма, а панель напр.?
Deem
Отправлено: 09.03.2005, 17:32


Мастер участка

Группа: Участник
Сообщений: 327



Да-да, владельца. Я его в ParentForm сохраняю, вот и прицепилось.
Да, сделал с новой формой усе, как дохтур прописал. Однако в инстпекторе свойства новые не появились. Они есть, я с ними работаю в программе. Смотрю форму как тест и дописываю инициализацию своих свойств, но при возврате к форме — ругня, что таких свойств нет.
Переделывал все по новой несколько раз. Нифига. sad.gif
GIZMO
Отправлено: 10.03.2005, 09:48


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Deem @ 09/03/2005, 17:32)

Да, сделал с новой формой усе, как дохтур прописал.  Однако в инстпекторе свойства новые не появились.   Они есть, я с ними работаю в программе.   Смотрю форму как тест и дописываю инициализацию своих свойств, но при возврате к форме — ругня, что таких свойств нет.
Переделывал все по новой несколько раз.  Нифига.  sad.gif

Чего-то не пойму как имадж прицепить...
user posted image
Так видно?
Deem
Отправлено: 10.03.2005, 10:39


Мастер участка

Группа: Участник
Сообщений: 327



Не видно. А что там? Дуля? smile.gif
GIZMO
Отправлено: 11.03.2005, 10:30


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Deem @ 10/03/2005, 10:39)
Не видно. А что там? Дуля? smile.gif

См. аттач...
+ Научите глупого катринку вставлять?

Присоединить изображение

Присоединить изображение

Deem
Отправлено: 15.03.2005, 10:47


Мастер участка

Группа: Участник
Сообщений: 327



То GIZMO
Да я и так поверил бы. smile.gif
Попробую все проделать снова.

Вернуться в Вопросы программирования в C++Builder