Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прямые преобразования, RTTI 
:(
    Опции темы
Dapo
Дата 30.9.2002, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Тут Вит запостил на мой взгляд очень интересные темы. Решил я с RTTI тоже по-экспериментировать и вот что у меня получилось (хотя для кого-то это все равно, что Америку открыть, для меня - нет). Прошу пояснить как же так получается?
Вот код:

procedure TForm1.Button2Click(Sender: TObject);
begin
TEdit(Button1).Color:=clred;
edit1.Color:=TEdit(Button1).Color;
end;

Получается, что Button1 хранит значение св-ва Color (причем вместо TEdit во второй строке можно TLabel написать), а у него такого св-ва нету... Мало того, если, например, добавить еще одну кнопку (Button3) и написать Button3:=Button1 то происходит "передача" св-ва колор.
Если в кратце не получиться, то хоть ссылку...
PM MAIL   Вверх
Le Taon
Дата 30.9.2002, 20:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Тут нет никакого РТТИ.

TEdit(Button) - это аналого reinterpret_cast из С++,
если ты понимаешь, о чём я. То есть компилятор никак не контролирует твои действия. То есть ты просто перезапишеь какие-то данные Button,
грубо говоря, испортишь объект.

RTTI имело бы место, если бы ты написал
(Button as TEdit).Color := ...;

И тогда бы ты получил EInvalidCast, что вполне справедливо.
  Вверх
MBo
Дата 30.9.2002, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 3
Всего: 18



TEdit и TButton - наследники TControl, в котором вводится свойство Color (на этом этапе иерархии оно скрыто). Некоторые наследники делают его видимым, но имеется и хранится оно у всех детей по одному адресу (новые поля у наследников добавляются в конец)
PM MAIL   Вверх
Dapo
Дата 30.9.2002, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Цитата(Guest @ 30.9.2002, 13:50)
Тут нет никакого РТТИ.
грубо говоря, испортишь объект.

Ну нет и нет. Просто в тех книгах что у меня есть в разделе про RTTI такие операции как TEdit(TSomeObject) описывались как аналог AS. Или может я читал не внимательно  ??? Что значит "испортишь объект"? А если, как написано выше Button3:=Button1, я и его "испорчу"?
PM MAIL   Вверх
Le Taon
Дата 30.9.2002, 21:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











"Испортишь объект" - значит, перезапишешь его данные левыми значениями.
Например, в поле, хранящее ссылку на другой объект  запишешь цвет.
Угадай с трёх раз, что у тебя получится при обращении по этой ссылке? -
правильно, AV.

Т.о. поведение испорченного объекта непредсказуемо.

При Button3:=Button1 вообще никакого копирования не происходит.
Просто две ссылки Button3 и Button1 будут указывать на один и тот же
объект.

А про "аналог" - действительно, эти операции в некотором роде аналогичны.
Обе они производят приведение типов.
Просто в одном случае (as) - с проверкой корректности приведения во время исполнения (с использованием RTTI), а в другом - без.

Если ты, например, уже проверил, то можешь не использовать as (оно дольше работает):

if Obj is TClass1 then
begin
 TClass1(Obj).Чего-то там;
 //Здесь можно не использовать (Obj as TClass1), т.к. проверка уже проведена,
 // и ты точно знаешь, что приведение возможно
end;
  Вверх
Vit
Дата 1.10.2002, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Что-то обычно я не встречал запорченных объектов ни после TClass1(class2) ни после class2 as TClass1. Обычно преобразования проходят если свойство происходит от общего предка (даже если его проявление "заблокировано" в потомках), и ничего страшного не происходит - например можно поменять Caption у объекта TEdit - и оно поменяется! - если сделать Docking TEdit то заголовок "докированной" формы будет именно тот на который поменян, а вот если типы не совместимы то хоть  TClass1(class2), хоть class2 as TClass1 генерят ошибку либо "Invalid typecast" либо "Abstract Error", но не AV


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Le Taon
Дата 1.10.2002, 00:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Обычно преобразования проходят если свойство происходит от общего предка (даже если его проявление "заблокировано" в потомках)


Это частный случай. В этом случае действительно всё сработает правильно.
Случай, который привёл я, с AV, - тоже частный.
Может получиться что угодно. (В случае TClass1(Obj2))

В случае же as ничего испортиться не может, это безопасное приведение типов.
  Вверх
Fantasist
Дата 1.10.2002, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Код
TEdit и TButton - наследники TControl, в котором вводится свойство Color (на этом этапе иерархии оно скрыто). Некоторые наследники делают его видимым, но имеется и хранится оно у всех детей по одному адресу (новые поля у наследников добавляются в конец)


Само по себе насколько я помню, Color - это propeprty, так что на самом деле будет вызван какой-нибудь метод типа TEdit.SetColor, где self будет указывать на тот TButton. Сам по себе этот метод не меняет кажись никаких полей, а вызывает API на соответсвующем handle(которое храниться уже как поле в TWinControl?). Так что тут никаких данных опять таки перезаписанно не будет. Вот еще одно достоинство использования property! Шутка.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 1.10.2002, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Цитата
Мало того, если, например, добавить еще одну кнопку (Button3) и написать Button3:=Button1 то происходит "передача" св-ва колор


В этом случае скажем еще раз: в Delphi переменная типа класса является указателем! Адрес ты этому указателю и задаешь, вызывая класс функцию Create, которая динамически создает объект, и возвращает указатель на этот объект.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Dapo
Дата 1.10.2002, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Спасибо, довольно исчерпывающе. Особенно про частные случаи. А то сразу - испортишь! в холодильнике хранить надо! :D Еще раз всем спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0650 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.