Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизЧто за... сообщение в Delphi XE2. Найти похожие ветки
← →
Deltas © (2012-02-15 01:55) [0]В конструкторе класса, одно из полей которого типа FIcon: TIcon, в отладке пытаюсь просмотреть значение выражения FIcon is TIcon. Компилятор сообщает: "E2010 Incompatible types: "Vcl.Graphics.TIcon" and "Vcl.Graphics.TIcon"". Что бы это могло значить?...
← →
Dimka Maslov © (2012-02-15 09:29) [1]В отладке компилятор уже ничего сообщать не может. Сообщает отладчик.
← →
brother © (2012-02-15 10:27) [2]не понял, где и что смотришь? этого не может быть, тк этого не может быть)
← →
Deltas © (2012-02-15 11:10) [3]Ctrl + F7. Вызывается окно просмотра/изменения значений переменных. В нем и просматриваю значение FIcon is TIcon.
P.S. Использую пакеты *.bpl. В пакете есть экспортируемая функция
function GetModuleInfo: IModuleInfo
...
IModuleInfo = interface(IInterface)
...
property Icon: TIcon read GetIcon;
...
end;
Вызываю из главного модуля *.exe функцию GetModuleInfo одно из bpl. И при просмотре значения ModuleInfo.Icon is TIcon получаю вот такое странное сообщение отладчика.
← →
депутатъ (2012-02-15 11:32) [4]FIcon.ClassName = "TIcon" не подойдёт?
← →
Dimka Maslov © (2012-02-15 11:45) [5]В bpl и exe классы формально разные. Потому что эта информация своя для каждого модуля. Отсюда мораль - не надо использовать bpl. Никакой практической выгоды от них нет.
← →
CRLF (2012-02-15 11:48) [6]Галка "Build with runtime packages" стоит?
← →
Deltas © (2012-02-15 13:00) [7]
> FIcon.ClassName = "TIcon" не подойдёт?
Так, конечно, можно, но проблема то глубже :) Напрмиер, метод TIcon.Assign(Source: TPersistent) не выполнится, т.к. в нем есть проверкаif (Source is TIcon)
. И, несмотря на то, что я передаю параметром класс TIcon, Source is TIcon возвращает False.
> Галка "Build with runtime packages" стоит?
В том то и дело, что не нужно мне "build with runtime packages", пакеты должны подключаться динамически (при определенных действиях пользователя) в процессе работы приложения. Когда пакеты встраиваются в исполняемый файл, то, конечно, никаких проблем не возникает.
← →
icWasya © (2012-02-15 13:33) [8]Так вот галка "Build with runtime packages" ставится тогда, когда нужно использовать пакеты как внешние DLL, а когда эта галка снята, все пакеты линкуются к EXEшнику. Поэтому вопрос CRLF (15.02.12 11:48) [6]
Галка "Build with runtime packages" стоит?
всё ещё прояснён.
← →
Deltas © (2012-02-15 13:47) [9]Галка стоит. Но некоторые пакеты подключается динамически, через LoadPackage
← →
Плохиш © (2012-02-15 14:49) [10]
> Компилятор сообщает: "E2010 Incompatible types: "Vcl.Graphics.
> TIcon" and "Vcl.Graphics.TIcon"". Что бы это могло значить?
То, что это два разных класса, один описан в вызывающем exe, а другой описан в вызываемой библиотеке.
← →
Поток (2012-02-15 15:29) [11]> Deltas © (15.02.12 13:47) [9]
А у динамически подключаемых пакетов галка тоже стоит?
← →
CRLF (2012-02-15 16:00) [12]
> А у динамически подключаемых пакетов галка тоже стоит?
У них такой галки нет, у них она всегда включена.
> Галка стоит. Но некоторые пакеты подключается динамически,
> через LoadPackage
Ну вот тебе надо поставить галку, и под ней в список runtime packages вписать как минимум rtl, vcl и твой пакет.
← →
Deltas © (2012-02-15 16:20) [13]
> То, что это два разных класса, один описан в вызывающем
> exe, а другой описан в вызываемой библиотеке.
Это один и тот же класс, описанный в Vcl.Graphics, который входит в пакет vcl.bpl. Но, похоже, для них формируется различная RTTI.
> А у динамически подключаемых пакетов галка тоже стоит?
У пакетов невозможно выставить эту опцию, т.к. пакеты никогда не встраиваются в другие пакеты, они их подгружают (секция Requires).
> Ну вот тебе надо поставить галку, и под ней в список runtime
> packages вписать как минимум rtl, vcl и твой пакет.
Это решит проблему, но цель учебной задачи не встраивать пакеты в исполняемый файл, а подгружать через LoadPackage по требованию. Если у меня 100 пакетов, но пользователь реально будет работать только с одним сегодня, зачем грузить в оперативную память 100 пакетов?
← →
Anatoly Podgoretsky © (2012-02-15 16:32) [14]> Deltas (15.02.2012 16:20:13) [13]
Почему ты думаешь, что програма будет что то грузить в оперативную память,
это не ее уровень.
← →
Inovet © (2012-02-15 16:35) [15]> [13] Deltas © (15.02.12 16:20)
> зачем грузить в оперативную память 100 пакетов?
И сам exe файл тоже не весь грузится, а по мере надобности, и выгружается за ненадобностью.
← →
Германн © (2012-02-15 16:35) [16]
> но цель учебной задачи не встраивать пакеты в исполняемый
> файл, а подгружать через LoadPackage по требованию.
Ну и получай тогда
> для них формируется различная RTTI.
← →
Плохиш © (2012-02-15 16:44) [17]
> Это решит проблему, но цель учебной задачи не встраивать
> пакеты в исполняемый файл, а подгружать через LoadPackage
> по требованию. Если у меня 100 пакетов, но пользователь
> реально будет работать только с одним сегодня, зачем грузить
> в оперативную память 100 пакетов?
Ещё один вместо изучения основ делает кривой велосипед...
← →
Германн © (2012-02-15 16:45) [18]
> Это решит проблему, но цель учебной задачи не встраивать
> пакеты в исполняемый файл, а подгружать через LoadPackage
> по требованию. Если у меня 100 пакетов, но пользователь
> реально будет работать только с одним сегодня, зачем грузить
> в оперативную память 100 пакетов?
Ты бы почитал бы про эту галку "Build with runtime packages". А то похоже ты её совсем неправильно понял.
← →
app © (2012-02-15 17:01) [19]Он не слышал, что такое виртуальная память. И как ведется управление оперативной памятью.
← →
Германн © (2012-02-15 17:06) [20]
> Он не слышал, что такое виртуальная память.
Дело не в этом, а в том что по мнению автора если включить галку, то это будет означать "встраивать пакеты в исполняемый файл".
← →
CRLF (2012-02-15 17:11) [21]
> Это решит проблему, но цель учебной задачи не встраивать
> пакеты в исполняемый файл, а подгружать через LoadPackage
> по требованию.
И ч0?
> Если у меня 100 пакетов, но пользователь реально будет работать
> только с одним сегодня, зачем грузить в оперативную память
> 100 пакетов?
Я разве где-то такое предлагал?
← →
Deltas © (2012-02-15 17:51) [22]
> Дело не в этом, а в том что по мнению автора если включить
> галку, то это будет означать "встраивать пакеты в исполняемый
> файл".
Если флажок снят, весь код пакетов встраивается в исполняемый файл. В чем я тут не прав?
← →
CRLF (2012-02-15 17:55) [23]
> Если флажок снят, весь код пакетов встраивается в исполняемый
> файл. В чем я тут не прав?
Прав. Следовательно, чтобы динамически загружать пакет, галочка должна быть установлена? Чтобы динамически загружать пакет, этот пакет должен быть в списке "невкомпиливаемых" пакетов? Ну и rtl и vcl тоже должны быть в этом списке.
← →
Германн © (2012-02-15 18:08) [24]
> Если флажок снят, весь код пакетов встраивается в исполняемый
> файл. В чем я тут не прав?
>
Так тебе то советуют флажок поставить, а не снять!
← →
Deltas © (2012-02-15 18:11) [25]Понятно. Еще один вопрос есть. В списке runtime-пакетов можно оставить только <мой пакет>.bpl, чтобы rtl.bpl и vcl.bpl встроились в приложение? Почему там обязательно должны находиться vcl.bpl и rtl.bpl?
← →
CRLF (2012-02-15 18:28) [26]
> В списке runtime-пакетов можно оставить только <мой пакет>.
> bpl, чтобы rtl.bpl и vcl.bpl встроились в приложение?
Получится именно Incompatible types: "Vcl.Graphics.TIcon" and "Vcl.Graphics.TIcon"". В приложении Graphics.TIcon у тебя будет из вкомпиленного vcl, а у пакета -- из загружаемого vcl.bpl (обрати внимание, что у тебя фактически две копии vcl в памяти, и как ты уже заметил выше, RTTI у них разные).
← →
Германн © (2012-02-15 18:30) [27]А <мой пакет>.bpl вовсе там не нужен для такой задачи.
← →
Deltas © (2012-02-15 18:36) [28]Хорошо, спасибо большое
← →
CRLF (2012-02-15 18:53) [29]
> А <мой пакет>.bpl вовсе там не нужен для такой задачи.
Так задача учебная, таковы условия :-)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 3.48 c