При разработке MDI-приложения на Delphi с использованием многих дочерних форм, одна из которых предназначена для отображения отчетов, может возникнуть проблема с динамическим связыванием типов компонентов, которые находятся в DLL. Это приводит к ошибке EInvalidCast при попытке приведения типов в коде, выполняющемся в библиотеке.
Описание проблемы
Разработчик столкнулся с проблемой при работе с компонентами, импортированными из DLL, в частности с компонентом TcxLookupComboBox. При попытке получить доступ к свойству Text этого компонента в цикле, перебирающем все компоненты формы, возникает ошибка EInvalidCast. Это происходит из-за того, что в DLL и основной программе существуют разные версии классов компонентов, что приводит к несоответствию типов.
Пример кода, вызывающего ошибку
procedure GetReportParams(Form: TForm); stdcall;
var
i: Integer;
str, cbstr: string;
b: Boolean;
begin
for i := 0 to Form.ComponentCount - 1 do
begin
// ...
if (Form.Components[i] is TcxLookupComboBox) then
begin
// cbstr:=(Form.Components[i] as TcxDBLookupComboBox).Text; // Вызовет ошибку EInvalidCast
// ...
end;
// ...
end;
// ...
end;
Подходы к решению
Использование статического приведения типов
Если уже выполнено проверка типа с помощью оператора is, то можно использовать статическое приведение типов с помощью конструктора класса. Однако, это не решит проблему в контексте DLL, так как классы в DLL и основной программе будут разными.
Использование runtime packages
Для корректной работы с классами в DLL необходимо использовать runtime packages. Это позволит объединить типы из DLL и основной программы, сделав их совместимыми. Важно убедиться, что все необходимые пакеты включены в список runtime packages.
Компиляция всего кода в один исполняемый файл
Вместо использования DLL можно скомпилировать все компоненты в один исполняемый файл, что исключит проблему несовместимости классов.
Рекомендации
Проверьте список runtime packages на наличие всех необходимых пакетов, включая пакеты DevExpress.
Убедитесь, что все компоненты, используемые в приложении, скомпилированы в один или несколько пакетов.
Рассмотрите возможность использования интерфейсов для абстракции классов, если это возможно.
Заключение
Проблема EInvalidCast при динамическом связывании типов в Delphi MDI-приложении связана с несовместимостью классов в DLL и основной программе. Решение заключается в использовании runtime packages или компиляции всего кода в один исполняемый файл. Важно тщательно настроить список runtime packages, чтобы включить все необходимые пакеты, включая пакеты сторонних библиотек, таких как DevExpress.
Проблема в MDI-приложении на Delphi связана с ошибкой `EInvalidCast` при динамическом связывании типов из-за несоответствия версий классов компонентов в DLL и основной программе.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS