Машинист паровоза
Группа: Участник
Сообщений: 239
|
Где то с неделю назад я постил вопрос как выловить событие IDE по изменению в дизайнере форм имени компонента на форме или модуле данных. Неделя не прошла даром. Выворочен на изнанку весть ToolsApi.hpp.
Так я еще не рылся ... всегда доку удавалась найти.
Практическая ценность — может понадобится тем кто пишет РЕДАКТОРЫ компонентов, задача которых управление состоянием других компонент на форме (например компонент сохранения свойств других компанент, в RX такой есть), для правильной работы компонента он допустим хранит имена сохраняеймых компонент на форме. Была трудность — при изменении имени какоголибо сохраняемого компанента, нужно было изменить его и в свойстве-списке сохраняемых команент сохраняющего компанента. Но редактор создается в момент нажатия мышью на компонент и разрушается средой когда закрывается окно редактора ккомпонента, поэтому в момент когда изменяются имена сохраняемых компонент он не активен (его нет в это время) и откорректировать список он не может. Выход — создание пакета времени разработки который сдержит не только сам редактор но и мастер(в термина C++Builder и Delphi) который подсоеденяет нотификатор к редактору исходника (объект IDE), он то и отслеживает активность программиста на форме и незаметно для него вызывает редактор компанента на коррекцию списка по результатам воздействия программита на форму.
Тут исходничек как добратся до редактора модуля(тоже в терминах IDE)
к которому нотификатор можно подцепить.
CODE |
// получаем интерфейс службы модулей среды (IDE)
_di_IOTAModuleServices ModuleService;
BorlandIDEServices -> Supports ( ModuleService );
// список редакторов юнитов, несущих форму
TList* Editors = new TList ();
_di_IOTAEditor SourceEditor;
// сканируем все активные модули, загруженные cредой (IDE)
for ( int ModuleIndex = 0; ModuleIndex < ModuleService -> ModuleCount; ModuleIndex ++ )
{
// получаем один из активных модулей
_di_IOTAModule Module = ModuleService -> Modules[ ModuleIndex ];
// класс-обертка СОМ-интерфейса IOTAFormEditor,
// необходим для проверки модуля на наличие формы
_di_IOTAFormEditor FormEditor;
// сканируем все редакторы модуля
for (int i = 0; i < Module->ModuleFileCount; ++i)
{
// получаем один из редакторов модуля
_di_IOTAEditor Editor = Module->ModuleFileEditors[i];
// проверяем редактор на наличие интерфейса IOTAFormEditor
if (Editor->Supports(FormEditor))
{
// редактор поддерживает СОМ-интерфейс IOTAFormEditor :
// значит является редактором юнита, несущего форму
Editors -> Add ( Editor );
}
}
}
// создаем класс-обертку СОМ-интерфейса IOTAFormNotifier,
// выполняющего нотификацию изменения состояния
// формы и сомпонентов на ней
_di_IOTAFormNotifier a = new TFormNotifier ( Editors );
Внутри конструктора нотификатор приатачивается ко всем редакторам функцией _di_IOTAEditor::AddNotifier(...) djn nfr Editor -> AddNotifier ((_di_IOTAFormNotifier)this)
delete Editors;
|
Я думаю хоть одному из тыщщи понадобится такое и мой опыт поможет сохранит времяэ
Отредактировано klen — 03/06/2004, 18:20 |