Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Вниз

Найти название свойства для 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.011 c
4-1130512622
Arazel
2005-10-28 19:17
2006.01.01
Почему вторая форма не получает сообщение?


14-1133768006
DDDeN
2005-12-05 10:33
2006.01.01
Создание справки формата CHM


2-1134501411
Ксардас
2005-12-13 22:16
2006.01.01
Как получить...


2-1134379571
barakuda
2005-12-12 12:26
2006.01.01
плавающая панель


3-1131694649
Карелин Артем
2005-11-11 10:37
2006.01.01
Обход ссылочной целостности в MS SQL 2000. Как сотворить?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский