Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.016 c
14-1131054381
Германн
2005-11-04 00:46
2005.11.27
У меня сегодня юбилей


14-1131304107
Gero
2005-11-06 22:08
2005.11.27
Бесплатная программа для виртуальных CD-приводов


1-1130935984
BobbyDigital
2005-11-02 15:53
2005.11.27
Полосы прокрутки в Combobox


2-1131695811
Al_Ba
2005-11-11 10:56
2005.11.27
Как программно установить атрибуты файла при его создании


4-1127474961
вп
2005-09-23 15:29
2005.11.27
Запись CD-R/RW в XP





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