Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"свободный" кастинга типов?


Страницы:   1 2

Frozzen ©   (2005-11-22 09:16:00) 

День добрый! Вопрос:
вот смотрте. есть два класса наследуемые от TWinControl, например, или еще от
какого общего класса.

Объекты классов имеют общее сво-во Text, причем в родительском классе такого
сво-ва нет.
Объекты передаются функции в качестве параметра. описание функции может быть
примерно такое
function BLABLABLA (var O : TObject); или (var O : TComponent);

так вот, как в этой функции сделать так, чтобы можно было менять значение
свойства Text не прибегая к конструкции вида
if O is SomeType then SomeType(O).Text:='blablabla';

дело в том, что в функцию передаются объекты с заведомо существующим
свойством Text, но их "тип" заранее неизвестен (много их может быть, в
общем, и проверка займет кучу строк для всех возможных типов)

и как можно в такой функции определить, есть ли у переданного объекта
такое-то свойство, и если есть то изменить его???


evvcom   (2005-11-23 15:23:00) [1]


> То, что он не смог их понять - чья вина в том?

Не "не смог", а "не захотел". Это большая разница.


Джо   (2005-11-22 19:52:00) [2]


> [37] marbius   (22.11.05 19:34)

А автору с самого начала просто ЗАВАЛИЛИ вариантами решения и советами. То, что он не смог их понять - чья вина в том?


Джо   (2005-11-22 19:50:00) [3]


[37] marbius   (22.11.05 19:34)
> И такие же как там, тока беглые ссылки на нее...

Вы оплатите написание монографии?


marbius   (2005-11-22 19:34:00) [4]

Во люди... Точно как хелп в делфи...Стока символов тока для того, чтобы человек сам нашел функцию через код библиотеки! И такие же как там, тока беглые ссылки на нее...


Frozzen   (2005-11-22 18:27:00) [5]

осознал чего писали
правдо не быстро


Джо   (2005-11-22 18:25:00) [6]


>  [34] Frozzen   (22.11.05 18:23)
> >Или, как уже писали выше, оболочку для нее - IsPublishedProp
> Я из написаного выше не понял ни про какую оболочку

IsPublishedPropвызывает GetPropInfo  и сравнивает его с nil.


Frozzen   (2005-11-22 18:23:00) [7]

>Или, как уже писали выше, оболочку для нее - IsPublishedProp
Я из написаного выше не понял ни про какую оболочку


Frozzen   (2005-11-22 18:21:00) [8]

Ну да у тебя красивше, без эксепшенов работает
еще раз тебе спасибище Экспериментатор


Джо   (2005-11-22 18:21:00) [9]

Или, как уже писали выше, оболочку для нее - IsPublishedProp? Нафига тут какие-то экспепшены провоцировать?!


Джо   (2005-11-22 18:19:00) [10]


> [30] Frozzen   (22.11.05 18:16)
> А я такое решение нашел:

А предварительно GetPropInfo вызвать не судьба?


Frozzen   (2005-11-22 18:16:00) [11]

спасибо Экспериментатор, ща почитаю

А я такое решение нашел:

procedure TMyClass.OnSomeEvent(Sender: TSomeObject; ...) ;
const PropertyName='Text';
begin
 try
   GetPropValue(Sender,PropertyName);

   //все зашибись - я не знаю кто тако Sender, мне это по колено, но
   //он точно имеет св-во Text, раз исключение не возникло
   SetPropValue(sender,ProperyName, 'blablabla');
 except
   //не все зашибись - Sender скорее всего не имеет св-ва Text, ну да и шут с ним
   beep;
 end;

end;


Экспериментатор   (2005-11-22 15:34:00) [12]


> Frozzen   (22.11.05 10:56) [5]
> В эту процедуру посылаются объекты как с наличием свойства
> текст так и без него, как определить есть ли у объекта это
> свойство или какого класса объект


С другой стороны:
Каждый постебался как мог, а человек за помощью пришел.
Я ответил +/- километр на его вопрос,
если он ничего не хочет, дальше предложенного не пойдет.
А написаннное мной не поможет ему, так поможет другому.


Digitman   (2005-11-22 15:21:00) [13]


> Экспериментатор   (22.11.05 15:14) [26]


мессия прямо-таки)

вчитайся в

[14] -> [17]
[20] -> [21]

Автор палец о палец не хочет ударить, ему оно нафиг не надо, он хочет чтобы - хрясь ! - и само по себе произошло ..

а ты - "сделать надо так" да "Учите RTTI, батенька" ...)


Экспериментатор   (2005-11-22 15:17:00) [14]

До кучи уж тогда:

procedure SetIntegerProperty(AComp: TComponent; APropName: String;
 AValue: Integer);
var
 PropInfo: PPropInfo;
begin
 PropInfo := GetPropInfo(AComp.ClassInfo, APropName);
 if PropInfo <> nil then
 begin
   if PropInfo^.PropType^.Kind = tkInteger then
     SetOrdProp(AComp, PropInfo, AValue);
 end;
end;

procedure SetEnumProperty(AComp: TComponent; APropName: String;
 AValue: Integer);
var
 PropInfo: PPropInfo;
begin
 PropInfo := GetPropInfo(AComp.ClassInfo, APropName);
 if PropInfo <> nil then
 begin
   if PropInfo^.PropType^.Kind = tkEnumeration then
     SetOrdProp(AComp, PropInfo, AValue);
 end;
end;

procedure SetObjectProperty(AComponent: TComponent; APropName: String;
 AValue: TObject);
var
 PropInfo: PPropInfo;
begin
 PropInfo := GetPropInfo(AComponent.ClassInfo, APropName);
 if PropInfo <> nil then
 begin
   if PropInfo^.PropType^.Kind = tkClass then
     SetObjectProp(AComponent, PropInfo, AValue);
 end;
end;

procedure SetBooleanProperty(AComp: TComponent; APropName: String;
 AValue: Boolean);
var
 PropInfo: PPropInfo;
begin
 PropInfo := GetPropInfo(AComp.ClassInfo, APropName);
 if PropInfo <> nil then
 begin
   if PropInfo^.PropType^.Kind = tkEnumeration then
     SetOrdProp(AComp, PropInfo, Integer(AValue));
 end;
end;

procedure SetStringProperty(AComp: TComponent; APropName: String;
 AValue: String);
var
 PropInfo: PPropInfo;
 TK: TTypeKind;
begin
 PropInfo := GetPropInfo(AComp.ClassInfo, APropName);
 if PropInfo <> nil then
 begin
   TK := PropInfo^.PropType^.Kind;
   if (TK = tkString) or (TK = tkLString) or (TK = tkWString) then
     SetStrProp(AComp, PropInfo, AValue);
 end;
end;

procedure SetMethodProperty(AComp: TComponent; APropName: String;
 AMethod: TMethod);
var
 PropInfo: PPropInfo;
begin
 PropInfo := GetPropInfo(AComp.ClassInfo, APropName);
 if PropInfo <> nil then
 begin
   if PropInfo^.PropType^.Kind = tkMethod then
     SetMethodProp(AComp, PropInfo, AMethod);
 end;
end;


Не забудьте TypInfo в uses добавить


Экспериментатор   (2005-11-22 15:14:00) [15]

Давайте покажем лучше пример, чем столько спорить
сделать надо так:

procedure SetStringProperty(AComp: TComponent; APropName: String;
 AValue: String);
var
 PropInfo: PPropInfo;
 TK: TTypeKind;
begin
 PropInfo := GetPropInfo(AComp.ClassInfo, APropName);
 if PropInfo <> nil then
 begin
   TK := PropInfo^.PropType^.Kind;
   if (TK = tkString) or (TK = tkLString) or (TK = tkWString) then
     SetStrProp(AComp, PropInfo, AValue);
 end;
end;

вызывай
SetStringProperty(MyWinCustomComponent, 'Text', 'Какой-то текст!!!');
и если свойство такое есть, оно установиться
Учите RTTI, батенька!  RTTI - это сила.


evvcom   (2005-11-22 14:43:00) [16]


> ну так бы сразу и сказали - НЕЗЯ батенька :) и все ок

МОНА! Чукча не читатель, чукча писатель! См. [2] и [7] и делай выводы.


Frozzen   (2005-11-22 13:42:00) [17]

ну так бы сразу и сказали - НЕЗЯ батенька :) и все ок


Leonid Troyanovsky   (2005-11-22 13:24:00) [18]


> Digitman ©   (22.11.05 13:20) [22]

> сама собой только манна небесная на голову сваливается).
> .. и то если только очень попросить известно кого)


Для этого, IMHO, еще требуется быть известно кем.

--
Regards, LVT.


Digitman   (2005-11-22 13:20:00) [19]


> Frozzen   (22.11.05 13:13) [21]


сама собой только манна небесная на голову сваливается)... и то если только очень попросить известно кого)


Frozzen   (2005-11-22 13:13:00) [20]

:))


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо