![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
приведение типов (абстрактный вопрос)
Lemur © (2005-11-12 00:06:00)...а вот интересно, чем отличается приведение типа
(somecontrol as tclassname)от приведенияtclassname(somecontrol)?
Обычно оба варианта работают одинаково, но иногда бывают случаи, когда второй вариант работает, а первый - нет(например, при хитрых взаимодействиях с библиотеками).
В создаваемый код пока не лазил, в доках подробного объяснения отличий не нашёл....
Юрий Зотов (2005-11-12 16:21:00) [1]> Lemur (12.11.05 00:24) [2]
Exe и DLL компилируются независимо друг от друга, как 2 самостоятельных проекта и один ничего не знает о другом. В результате в каждом проекте для каждого используемого в нем класса существует своя отдельная VMT.
Таким образом, для TEdit в Exe и для TEdit в DLL будут две VMT - то есть, эти два TEdit будут разными классами. Если экземпляр TEdit создан в коде EXE, то для DLL он не будет являться тем TEdit, о котором знает DLL (и наоборот). Поэтому AS и IS работать в таких случаях не будут, а вот прямое приведение типа - будет.
Sergey Masloff (2005-11-12 11:19:00) [2]И вообще приведение типа это только вариант 1. А вариант 2 я лично всю жизнь называл явным указанием типа. Одним словом говоришь "это TEdit" и не волнует.
Sergey Masloff (2005-11-12 11:19:00) [3]Ну то есть Набережных С. © (12.11.05 09:20) [5] уже все написал я просто не прочел сразу
Набережных С. (2005-11-12 09:20:00) [4]
> чем отличается приведение типа
> (somecontrol as tclassname) от приведения tclassname(somecontrol)?
>
Первый вариант выполняется в ран-тайм. Производится проверка соответствия типов и, в случае несоответствия, возбуждается исключение. Сама проверка может выполняться разными способами, в зависимости от исходного типа. Данный вариант применим к объектам и интерфейсам, и он является полностью безопасным.
Второй вариант выполняется на этапе компиляции. Это просто команда компилятору рассматривать переменную исходного типа как переменную целевого типа. В подаваляющем большинстве случаев компилятор не выполняет никаких проверок, а просто слепо следует приказу. При этом вся ответственность за последствия целиком ложится на программиста. Соответственно, такой вариант к полностью безопасным отнести нельзя, зато его можно применить к подавляющему большинству типов.
Джо (2005-11-12 01:53:00) [5]TEdit в EXE и DLL - это разные классы, поэтому as и is использовать не имеет смысла. Если необходимо, можно использовать borland package libraries.
Lemur (2005-11-12 00:28:00) [6]пардон, не "Потому нахожу", а "Потом нахожу", конечно же...
Lemur (2005-11-12 00:24:00) [7]
> В первом случае при несоответствии типов возбуждается исключение,
> во втором - нет. Первый случай применим только к 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- всё работает без проблем!
Игорь Шевченко (2005-11-12 00:12:00) [8]В первом случае при несоответствии типов возбуждается исключение, во втором - нет. Первый случай применим только к TObject и его наследникам.