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

Вниз

Изменить свойство "чужого" компонента.   Найти похожие ветки 

 
V-Isa ©   (2004-04-02 10:06) [0]

Здравствуйте!
Пишу компонент. Одним из его свойств является следующее:
property OtherComp: TComponent Read GetOtherComp Write SetOtherComp;. Необходимо в SetOtherComp узнать есть ли у передаваемого компонента свойство типа TIcon и изменить его. Как это сделать???


 
Sun bittern ©   (2004-04-02 10:36) [1]

// Свойтсво от того класса от которого нам нужно или нет
Function HasSource(Instance: TObject; APropertyName: String; AClass: TClass): Boolean;
 var
   PropInfo: PPropInfo;
begin
 PropInfo := GetPropInfo(Instance, APropertyName, tkProperties);
 Result := PropInfo<>nil;
 if Result then
   if not ((PropInfo^.PropType^.Kind = tkClass) and
           (GetTypeData(PropInfo^.PropType^).ClassType.InheritsFrom(AClass)))
   then Result := False;
end;

if HasSource(PopupMenu1, "Images", TCustomImageList) then Caption := "ddd";
// Смена TIcon
SetObjectProp()
Как проверить есть свойство или нет ссылки уже давали

http://podgoretsky.com/ddp.html

На сайте Анатолия Подгоредского есть электроный вариант книги Стива Тейксейра и Ксавье Пачеко. Там про RTTI и создание компонент


 
TUser ©   (2004-04-02 10:38) [2]

Популярная тема в послднее время, однако
http://delphimaster.net/view/1-1080711559/


 
V-Isa ©   (2004-04-02 11:05) [3]

Где находится SetObjectProp()????
В TypInfo ее нет, у мя Delphi 3.


 
Sun bittern ©   (2004-04-02 11:23) [4]

>> у мя Delphi 3.

Упс, насчет третей не скажу (у меня 7). Не разу ей не пользовался. Начинал с четверки и то мало на ней седел. Наверно придется делать UpGrade Delphi.
Я по заголовку  ([D1, D2, D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]) вижу что у тебя есть наверно 7 дельфя, посмотри как там рализовано может выйдет чего (хотя RTTI у Borland может изменятся от версии к версии и гарантий ни каких нет)


 
Defunct ©   (2004-04-02 11:34) [5]

Procedure TBLalala.SetOtherComp(OtherComp:TComponent);
Begin
 If OtherComp is (Класс который содержит TIcon) Then
 With OtherComp as (Класс который содержит TIcon) Do
  Icon := <Bla bla bla>
End;


 
Sun bittern ©   (2004-04-02 11:43) [6]

Defunct ©   (02.04.04 11:34) [5]

Это если объект произощел от некого класса, а тут речь о пропертях :)


 
Sun bittern ©   (2004-04-02 11:45) [7]

Defunct ©   (02.04.04 11:34) [5]

Это если объект произощел от некого класса, а тут речь о пропертях :) (или я чего не догоняю)


 
Defunct ©   (2004-04-02 11:59) [8]

Sun bittern ©   (02.04.04 11:45) [7]

Дык с пропертями и работаем.
Автор ведь знает с чем работает. Зачем усложнять жизнь?


 
Sun bittern ©   (2004-04-02 12:47) [9]

Defunct ©   (02.04.04 11:59) [8]
>> Автор ведь знает с чем работает

Откуда? Неизвестно точно какой компонент передается и неизвестно точно наименование свойства в котором содержится TIcon. По вопросу:
>> узнать есть ли у передаваемого компонента свойство типа TIcon и изменить его

Тогда наверно так:

procedure A(AClass: TComponent; List: TStrings; FindClass: TClass);
var
 PropList: PPropList;
 ClassTypeInfo: PTypeInfo;
 ClassTypeData: PTypeData;
 OrdTypeData: PTypeData;

 I: Integer;
begin
 ClassTypeInfo := AClass.ClassInfo;
 ClassTypeData := GetTypeData(ClassTypeInfo);
 if ClassTypeData.PropCount <> 0 then
 begin
   GetMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
   try
     GetPropInfos(AClass.ClassInfo, PropList);
     for I := 0 to ClassTypeData.PropCount - 1 do
       // Перебор свойств объекта (не свойства-события)
       if not (PropList[i]^.PropType^.Kind = tkMethod) then
       begin
         // Свойсво-объект
         if PropList[i]^.PropType^.Kind = tkClass then
         begin
           OrdTypeData := GetTypeData(PropList[i]^.PropType^);
           if OrdTypeData.ClassType = TCustomImageList then
           begin
             List.Add(AClass.Name + " > " + PropList[i]^.Name + ": " + PropList[i]^.PropType^.Name);
             SetObjectProp(AClass, PropList[i]^.Name, FImageList);
           end;
       end;
     end;
   // Чистка
   finally
     FreeMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
   end;
 end;
end;

...
A(PopupMenu1, Memo1.Lines, TCustomImageList);
...

Только у автора вопроса какието проблемы
V-Isa ©   (02.04.04 11:05) [3]


 
Sun bittern ©   (2004-04-02 13:09) [10]

опять гнустная ошибочка вышла :(

if OrdTypeData.ClassType = TCustomImageList then
на
if OrdTypeData.ClassType = FindClass then


 
Defunct ©   (2004-04-02 13:18) [11]

>> Автор ведь знает с чем работает
> Откуда?


;) Анекдот получился.

> Неизвестно точно какой компонент передается и неизвестно точно наименование свойства в котором содержится TIcon.

Ну это нам не известно, а автору известно ;) Иначе бы такой задачи не было.


 
malkolinge ©   (2004-04-02 16:32) [12]

http://bhv.ru/books/book.php?id=2735



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

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

Наверх




Память: 0.49 MB
Время: 0.023 c
3-1080139659
frozzen
2004-03-24 17:47
2004.04.18
Перекодировка из DOS в Win


3-1080034236
GAndrei
2004-03-23 12:30
2004.04.18
Проблема с использованием BCD полей


3-1079828795
DimaF
2004-03-21 03:26
2004.04.18
TIBDataSet


1-1080820739
Diver
2004-04-01 15:58
2004.04.18
Как вывести на форму текст состоящий из разных шрифтов?


1-1080923074
art-east
2004-04-02 20:24
2004.04.18
Проблема с Z-Order