Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ToolAPI:найти название свойства для csSubComponent 
:(
    Опции темы
<Spawn>
Дата 5.7.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Пишу эксперт с использованием OpenToolsAPI. Возникла очень нехорошая проблема: для дальнейшей обработки свойства дочернего компонента мне необходимо определить название свойства родительского компонента, связанного с ним. Для примера буду рассматривать Action - TFileOpen. У него есть свойство Dialog, значением которого является экземпляр класса TOpenDialog. Как в Borland все это дело проектировали я вообще ума не приложу - с точки зрения OpenToolsAPI дочерний компонент является независимым компонентом, а с точки зрения функций TypInfo он, как и положено, дочерний. Теперь посмотрим на это дело через OpenToolsAPI:
1)имеем ссылку на этот дочерний компонент
2)необходимо найти название свойства родительского компонента

Думал решить проблему таким кодом:

Код

(*
 PropertyList - наследник TList, хранящий ссылки на PPropertyInfo

 PPropertyInfo = ^TPropertyInfo;
 TPropertyInfo = record
   Component: IOTAComponent;
   PropertyIndex: integer;
   ParentList: TParentPropertyList;
   PropertyStates: TPropertyStates;
   TranslatedWord: PAnsiChar;
 end;
*)

var
 CurrentPropertyIndex, CurrentOwnerPropertyIndex: integer;
 VCLComponent: TComponent;
 OTAComponent, OwnerPropertyOTAComponent: IOTAComponent;

//Собственно проблемный код
for CurrentPropertyIndex := 0 to PropertyList.Count - 1 do
 with PropertyList[CurrentPropertyIndex]^ do
 begin
   VCLComponent := TComponent(Component.GetComponentHandle);
   if csSubComponent in VCLComponent.ComponentStyle then
   begin
     if Assigned(VCLComponent.Owner) then
       //Коллекции обрабатывать не нужно
       if not (TPersistent(VCLComponent.Owner) is TCollection)then
       try
         //FindComponent - статический метод для поиска ссылки на IOTAComponent с учетом формы или модуля
         OTAComponent := FindComponent(OTAFormEditor, VCLComponent.Owner.Name);

         if Assigned(OTAComponent) then
         begin
           for CurrentOwnerPropertyIndex := 0 to OTAComponent.GetPropCount - 1 do
           begin
             if OTAComponent.GetPropType(CurrentOwnerPropertyIndex) = tkClass then
             begin
               OTAComponent.GetPropValue(CurrentOwnerPropertyIndex, OwnerPropertyOTAComponent);

               //Этот код ни когда не выполнится, т.к. для свойства такого типа GetPropValue всегда возварщает nil, по совершенно непонятной причине!!!!!
               if Assigned(OwnerPropertyOTACompnent) then
                 if OwnerPropertyOTAComponent.GetComponentHandle = Component.GetComponentHandle then
                 begin
                   //Чего то делаем...
                 end;
             end;
           end;
         end;
       finally
         OTAComponent := nil;
       end;
   end;
 end;


Как можно обойти данную проблему?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.