Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Найти название свойства для csSubComponent через OpenToolsAPI   Найти похожие ветки 

 
Mutex   (2005-07-05 11:46) [0]

Пишу эксперт с использованием 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;


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


 
Юрий Зотов ©   (2005-07-05 12:21) [1]

Может, что-то я не так понял, но задача, ИМХО, решается проще.

Есть компоненты A и B. Известно, что у компонента A есть некое свойство, ссылающееся на компонент B. Надо найти название этого свойства.

1. Получаем список объектных свойств компонента A (GetPropList с tkClass).

2. Проходим по этому списку и смотрим, какое свойство ссылается на компонент B (GetObjectProp = B).

3. Из PropInfo этого свойства берем его имя.

И все. А уж кто там кому дочки-матери - это без разницы.

Пример. Кладем на форму Label1 и Edit1. Ставим Label1.FocusControl=Edit1. Вот код, который определяет, какое свойство Label1 ссылыется на Edit1.

uses
 TypInfo;

procedure TForm1.FormDblClick(Sender: TObject);
var
 PropList: PPropList;
 PropCount, i: integer;
begin
 PropCount := GetPropList(Label1.ClassInfo, [tkClass], nil);
 GetMem(PropList, PropCount * SizeOf(PPropInfo));
 try
   GetPropList(Label1.ClassInfo, [tkClass], PropList);
   for i := 0 to PropCount - 1 do
     if GetObjectProp(Label1, PropList^[i]) = Edit1 then
     begin
       Caption := PropList^[i]^.Name;
       Exit
     end;
     Caption := "Property not found"
 finally
   FreeMem(PropList, PropCount * SizeOf(PPropInfo))
 end
end;


 
Mutex   (2005-07-05 12:37) [2]

Юрий Зотов да с TypInfo все выходит нормально, мне же нужно через OpenToolsAPI решить эту проблему(т.к. весь эксперт через этот интерфейс работает)  ... а там IOTAComponent.GetPropValue(PropIndex, PropValue) возвращает nil для существующего дочернего компонента(там вообще полно всяких глюков, даж где то ссылка была с их описанием). Ну если что, то видимо прийдется решать данную проблему через TypInfo, спасибо:)


 
Юрий Зотов ©   (2005-07-05 13:05) [3]

> Mutex   (05.07.05 12:37) [2]

> с TypInfo все выходит нормально, мне же нужно через
> OpenToolsAPI решить эту проблему

Проблему нужно решить - раз. Желательно решить ее наиболее простым и эффективным способом - два. И если TypInfo дает такой способ - то почему его не использовать?

Хоть в эксперте, хоть где угодно. Разве обязательно, чтобы эксперт работал только через OTAPI? Совершенно необязательно. Нисколько не сомневаюсь, что очень многие эксперты используют далеко не только OTAPI - и это правильно.



Страницы: 1 вся ветка

Текущий архив: 2006.01.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.039 c
11-1116277850
Thaddy
2005-05-17 01:10
2006.01.01
coolband


2-1134822655
shoni
2005-12-17 15:30
2006.01.01
Кнопка перехода в полноекранный режым формы проекта


2-1134412154
vpavel
2005-12-12 21:29
2006.01.01
Запрет CTRL+ALT+DEL на XP


5-1120507147
Brack
2005-07-04 23:59
2006.01.01
Непонятная ошибка при создании компонента.


6-1127234353
Galiaf
2005-09-20 20:39
2006.01.01
Проверка наличия сервера на определённом порте.