Форум: "Компоненты";
Текущий архив: 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