Форум: "Начинающим";
Текущий архив: 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