Главная страница
    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.012 c
4-1127685241
Delphi_is_cool
2005-09-26 01:54
2005.11.27
OpenDialog и SaveDialog


1-1130843177
keonid
2005-11-01 14:06
2005.11.27
Скроллер в DBGrid не движется


3-1128610440
Weare
2005-10-06 18:54
2005.11.27
Как хранить форматированный текст в полях записи


2-1131391908
AndreyLi
2005-11-07 22:31
2005.11.27
Node, Nodes. Разукрашивание. TCanvas. Глюк?


4-1127888849
Igi
2005-09-28 10:27
2005.11.27
Заблокировать клавиатуру





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