Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.025 c
9-1065961007
Larrel
2003-10-12 16:16
2004.04.18
2D Isometric Engine для RPG


9-1065789563
Ketmar
2003-10-10 16:39
2004.04.18
изометрия + вокселы


11-1062341908
Кладов
2003-08-31 18:58
2004.04.18
Версия 1.84


7-1077017287
Kremen
2004-02-17 14:28
2004.04.18
МАС-адрес


3-1079687625
Denis_Visma
2004-03-19 12:13
2004.04.18
Вставка записей в Представление




   Наверх