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
|
Я думаю что дружное молчание говорит само за себя
|
|
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. Сохраняю старый указатель у компонента, а кладу указатель на функцию компонента, в которой идет вызов старой и реакция на восстановление фона окна.
А про подсовывание своей формы — оч. интересно. Буду пробовать. Хочу, знаешь ли, сделать форму по функциям и виду не похожей на тоталитарные окна винды: хошь — зеленую, хошь — синюю, ато и полосатую.... Спасибо.
|
|
GIZMO |
Отправлено: 09.03.2005, 10:04 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Deem @ 05/03/2005, 15:32) | При "попадании" компонента на форму получаю родителя.
|
...это интересно
1. Родителя или владельца?
2. Если родитель не форма, а панель напр.?
|
|
Deem |
Отправлено: 09.03.2005, 17:32 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
Да-да, владельца. Я его в ParentForm сохраняю, вот и прицепилось.
Да, сделал с новой формой усе, как дохтур прописал. Однако в инстпекторе свойства новые не появились. Они есть, я с ними работаю в программе. Смотрю форму как тест и дописываю инициализацию своих свойств, но при возврате к форме — ругня, что таких свойств нет.
Переделывал все по новой несколько раз. Нифига.
|
|
GIZMO |
Отправлено: 10.03.2005, 09:48 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Deem @ 09/03/2005, 17:32) |
Да, сделал с новой формой усе, как дохтур прописал. Однако в инстпекторе свойства новые не появились. Они есть, я с ними работаю в программе. Смотрю форму как тест и дописываю инициализацию своих свойств, но при возврате к форме — ругня, что таких свойств нет.
Переделывал все по новой несколько раз. Нифига. |
Чего-то не пойму как имадж прицепить...
Так видно?
|
|
Deem |
Отправлено: 10.03.2005, 10:39 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
Не видно. А что там? Дуля?
|
|
GIZMO |
Отправлено: 11.03.2005, 10:30 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Deem @ 10/03/2005, 10:39) | Не видно. А что там? Дуля? |
См. аттач...
+ Научите глупого катринку вставлять?
Присоединить изображение
|
|
Deem |
Отправлено: 15.03.2005, 10:47 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
То GIZMO
Да я и так поверил бы.
Попробую все проделать снова.
|
|