Главная страница
    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.48 MB
Время: 0.034 c
14-1080214113
Kerk
2004-03-25 14:28
2004.04.18
Подскажите конфигурацию


14-1080125675
isko
2004-03-24 13:54
2004.04.18
apacer агитирует за NT:)


8-1071501250
kopcap
2003-12-15 18:14
2004.04.18
Перерисовка кадров


3-1080025357
Лысый
2004-03-23 10:02
2004.04.18
Разработка ИС


7-1076436171
Pat
2004-02-10 21:02
2004.04.18
Delphi+FineReader





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский