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

 
Победил Open Tools Api, Роемся в потрохах Билдера
klen
Отправлено: 03.06.2004, 17:17


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

Группа: Участник
Сообщений: 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

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