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, но их "тип" заранее неизвестен (много их может быть, в
общем, и проверка займет кучу строк для всех возможных типов)

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


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


> Leonid Troyanovsky ©   (22.11.05 12:49) [15]


да не хочет он никаких лишних телодвижений делать ! в том-то и соль) ..

он хочет, чтобы все по взмаху волшебной палочки само собой делалось, а ля

procedure TMyClass.OnSomeEvent(Sender: TSomeObject; ...) ;
begin
 try
   Sender.Text := 'bla-bla-bla';
//все зашибись - я не знаю кто тако Sender, мне это по колено, но он точно имеет св-во Text, раз исключение не возникло
 except
//не все зашибись - Sender скорее всего не имеет св-ва Text, ну да и шут с ним
 end;
end;


TUser   (2005-11-22 13:04:00) [22]

JavaScript, в отличае от Delphi проверит существование св-ва Text на стадии исполнения. Если такого нет - то вызовется исключение. А на паскале все проверяется заранее, токов язык. Как обойти такое требование уже сказали - используя механиз RTTI.


Digitman   (2005-11-22 13:04:00) [23]


> Frozzen   (22.11.05 12:55) [17]


тогда ты не тот огород окучиваешь.

олей-серверы автоматизации тебя спасут.


Frozzen   (2005-11-22 12:55:00) [24]

> Digitman©  (22.11.05 12:47) [14]

ДА


Ega23   (2005-11-22 12:50:00) [25]


> Тебе уже несколько раз сказали, что надо делать для published
> свойств.


Не надо, а можно.


Leonid Troyanovsky   (2005-11-22 12:49:00) [26]


> Frozzen   (22.11.05 09:16)  

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


Если искомое (метод, свойство) заведомо находится в Protected,
например, Text, то:

type
 THackControl = class (TControl);

 if Sender is TControl then
  THackControl(Sender).Text := 'New text';


--
Regards, LVT.


Digitman   (2005-11-22 12:47:00) [27]


> Frozzen   (22.11.05 12:35) [11]


ты скажи по-русски - что ты хочешь-то ?

получив параметром некий объект обратиться к некоему потенциально ожидаемому св-ву этого объекта безо всяких проверок на класс объекта и на существование у него этого св-ва ?

не выполнять никаких приведений типов и при этом не ожидая от компилятора отлупа ?


Думкин   (2005-11-22 12:42:00) [28]

> Frozzen   (22.11.05 12:35) [11]

Тебе уже несколько раз сказали, что надо делать для published свойств.
Читать будешь?


Ega23   (2005-11-22 12:40:00) [29]


> если еще не совсем забыл синтаксис, то выглядит так. а вот
> как такое сделать на делфи, чтобы не быть привязанным к
> конкретному типу/классу при условии что породить наследника
> от класса с переопределенными свойствами нельзя?


AFAIK, в java всю информацию о классе можно из RTTI получить.


Frozzen   (2005-11-22 12:35:00) [30]

Но дело не упирается же в св-во Text! это только лишь как пример штоли.
Другими словами скажу,
JavaScript:

function setValue(Obj,Prp)
{       Obj[Prp]='blablabla';
}

если еще не совсем забыл синтаксис, то выглядит так. а вот как такое сделать на делфи, чтобы не быть привязанным к конкретному типу/классу при условии что породить наследника от класса с переопределенными свойствами нельзя?


Anatoly Podgoretsky   (2005-11-22 11:21:00) [31]

Но если посмотреть внимательнее, то в некоторых местах справки ошибка, по одним сведеньям опубликовано, по другим в секции Protected


Anatoly Podgoretsky   (2005-11-22 11:19:00) [32]

Frozzen   (22.11.05 09:16)  
Если по твоим утверждениям они наследуются от TWinControl, то дальнейшии утверждения неверны, поскольку данное свойство наследуется еще раньше от TControl.Text и оно опубликовано.


jack128   (2005-11-22 11:13:00) [33]

type
 ITestControl = interface
 ['{61191874-1E23-4333-A3EC-5A87C85B2C86}']
   function GetText: string;
   procedure SetText(const Value: string);
   property Text: string read GetText write SetText;
 end;


и реализовывать этот интерфейс, где тебе нужно.

Ну и в процедуре соответственно
var
 intf: ITextControl;
begin
 if Sender.GetIterface(ITextControl, intf) then
   intf.Text := 'bla-bla-bla';
end;


Digitman   (2005-11-22 11:03:00) [34]


> как определить есть ли у объекта это свойство


для этого св-во должно быть published

при таком условии см. TypInfo.IsPublishedProp(Sender, 'Text');


> какого класса объект


см. Sender.ClassName/ClassType


Ega23   (2005-11-22 10:59:00) [35]

Унаследуй все классы со свойством Text от одного предка. И потом на as проверяй.
В смысле на is.


Frozzen   (2005-11-22 10:56:00) [36]

В эту процедуру посылаются объекты как с наличием свойства текст так и без него, как определить есть ли у объекта это свойство или какого класса объект


Digitman   (2005-11-22 10:44:00) [37]


> дело в том что они не напрямую идут от TWinControl


так ведь и в приведенном мной примере тоже не напрямую, а от общего предка, определившего св-во текст для любых потенциальных его наследников !


> функция вызывается по событию именно вида (Sender : TObject)


ну и что ?

мне непонятно, чем плох традиционный вариант :

if Sender is TMyBaseControl then
 TMyBaseControl(obj).Text := 'blablabla';


Frozzen   (2005-11-22 10:37:00) [38]

> почему бы не сделать это св-во у родителя ?

дело в том что они не напрямую идут от TWinControl. Это визуальные
компоненты. проще будет кучу if ... is ... then поставить

функция вызывается по событию именно вида (Sender : TObject)
могу ставить свой класс вместо TObject?


evvcom   (2005-11-22 09:31:00) [39]

Смотри TypInfo.pas, в нем GetPropInfo, SetStrProp и другие


Digitman   (2005-11-22 09:25:00) [40]


> причем в родительском классе такого
> сво-ва нет


а почему бы не сделать это св-во у родителя ?

TMyBaseControl = class(TWinControl)
 function GetText: String; virtual; abstract;
 procedure SetText(Value: String); virtual; abstract;
..
 property Text: String read GetText write SetText;
..
end;

TMyBaseControlDescendant1 = class(TMyBaseControl)
..
 function GetText: String; override;
 procedure SetText(Value: String); override;
..
end;

TMyBaseControlDescendant2 = class(TMyBaseControl)
..
 function GetText: String; override;
 procedure SetText(Value: String); override;
..
end;

function BLABLABLA (Obj: TMyBaseControl);
begin
 obj.Text := 'blablabla';
end;


Страницы:   1 2

Наверх

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