Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

приведение типов (абстрактный вопрос)   Найти похожие ветки 

 
Lemur   (2005-11-12 00:06) [0]

...а вот интересно, чем отличается приведение типа
(somecontrol as tclassname) от приведения tclassname(somecontrol)?
Обычно оба варианта работают одинаково, но иногда бывают случаи, когда второй вариант работает, а первый - нет(например, при хитрых взаимодействиях с библиотеками).
В создаваемый код пока не лазил, в доках подробного объяснения отличий не нашёл....


 
Игорь Шевченко ©   (2005-11-12 00:12) [1]

В первом случае при несоответствии типов возбуждается исключение, во втором - нет. Первый случай применим только к TObject и его наследникам.


 
Lemur   (2005-11-12 00:24) [2]


> В первом случае при несоответствии типов возбуждается исключение,
>  во втором - нет. Первый случай применим только к TObject
> и его наследникам.
> <Цитата>


Если бы так просто :)
Создаю динамически форму, на ней - контрол, TEdit.
Потому нахожу этот контрол и делаю что-то типа:
s:=(f.Controls[i] as tedit).text
f - соотв. эта динамически созданная форма, f.Controls[i] - найденный контрол. f.Controls[i].classname="TEdit".
Если форма создана в главном приложении и работаю я с ней оттуда же - всё ок, работает без проблем.
Если же код, создающий форму(он находится в .exe), вызывать из подгруженной DLL(соотв. переменная f - в dll) - при попытке получить text вылезает АV(classname="TEdit", sharemem подключен, если работать с tdateedit, tspinedit - где не текст, а просто число - та же фигня).
А вот если сделать s:=tedit(f.Controls[i]).text - всё работает без проблем!


 
Lemur   (2005-11-12 00:28) [3]

пардон, не "Потому нахожу", а "Потом нахожу", конечно же...


 
Джо ©   (2005-11-12 01:53) [4]

TEdit в EXE и DLL - это разные классы, поэтому as и is использовать не имеет смысла. Если необходимо, можно использовать borland package libraries.


 
Набережных С. ©   (2005-11-12 09:20) [5]


> чем отличается приведение типа
> (somecontrol as tclassname) от приведения tclassname(somecontrol)?
>

 Первый вариант выполняется в ран-тайм. Производится проверка соответствия типов и, в случае несоответствия, возбуждается исключение. Сама проверка может выполняться разными способами, в зависимости от исходного типа. Данный вариант применим к объектам и интерфейсам, и он является полностью безопасным.
 Второй вариант выполняется на этапе компиляции. Это просто команда компилятору рассматривать переменную исходного типа как переменную целевого типа. В подаваляющем большинстве случаев компилятор не выполняет никаких проверок, а просто слепо следует приказу. При этом вся ответственность за последствия целиком ложится на программиста. Соответственно, такой вариант к полностью безопасным отнести нельзя, зато его можно применить к подавляющему большинству типов.


 
Sergey Masloff   (2005-11-12 11:19) [6]

И вообще приведение типа это только вариант 1. А вариант 2 я лично всю жизнь называл явным указанием типа. Одним словом говоришь "это TEdit" и не волнует.


 
Sergey Masloff   (2005-11-12 11:19) [7]

Ну то есть Набережных С. ©   (12.11.05 09:20) [5] уже все написал я просто не прочел сразу


 
Юрий Зотов ©   (2005-11-12 16:21) [8]

> Lemur   (12.11.05 00:24) [2]

Exe и DLL компилируются независимо друг от друга, как 2 самостоятельных проекта и один ничего не знает о другом. В результате в каждом проекте для каждого используемого в нем класса существует своя отдельная VMT.

Таким образом, для TEdit в Exe и для TEdit в DLL будут две VMT - то есть, эти два TEdit будут разными классами. Если экземпляр TEdit создан в коде EXE, то для DLL он не будет являться тем TEdit, о котором знает DLL (и наоборот). Поэтому AS и IS работать в таких случаях не будут, а вот прямое приведение типа - будет.



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.056 c
8-1120642319
zvb
2005-07-06 13:31
2005.11.27
canvas.textout с форматированием


1-1131007884
Vetalich
2005-11-03 11:51
2005.11.27
ListBox


4-1127738702
NikNet
2005-09-26 16:45
2005.11.27
Как изменить стандартные диалоги? Открыть/Закрыть.


14-1131517574
Pazitron_Brain
2005-11-09 09:26
2005.11.27
кабинет информатики, ip, net


11-1112760998
uli
2005-04-06 08:16
2005.11.27
выделение текста в EDITBOX