Работа с собственными bpl в Delphi
2. TfrmClients является наследником TPersistent?
1. В свойствах основного проекта и bpl-ки включена борландовская bpl-ка, в которой содержится модуль Classes?
2. TfrmClients является наследником TPersistent?
TfrmClients является наследником от TForm (ответ на второй вопрос да).
Обе bpl содержат формы (наследники от TForm какая точно bpl должна быть включена не знаю, но почти уверен что включена (Classes есть в строке Uses в обоих проектах)
Classes есть в строке Uses в обоих проектахэтого мало, модуль Classes будет вкомпилен в твою bpl-ку, если ты не укажешь нужную настройку.
Вроде Classes должна быть в RTL, соответственно убедись, что в настройках проекта на вкладке Packages стоит галка "Build with runtime packages" и в списке имеется rtl (кстати, обрати внимание, после включения этой опции размеры получаемых файлов будут меньше, но тебе придётся за собой тащить соответствующие bpl-ки (например, если у тебя D7, то rtl70.bpl). И не забудь тоже самое сделать у основного проекта.
Так как ты используешь формы, я бы посоветовал также туда включить vcl, т.к. при регистрации класса происходит также регистрация всех предков, так что желательно, чтобы они все были свои. НО тут есть один нюанс. (сказанное далее касается D7, относительно других версий не в курсе) Дело в том, что при старте vcl70.bpl происходит инициализация модуля Forms. Не знаю, почему, но я испытывал проблемы с неадекватным поведением некоторых окошек (например, деактивация приложения при закрытии диалога) в связи с тем, что объект Application создаётся в bpl-ке, а не в основном модуле. Решалась проблема следующей модификацией dpr-файла:
....
var AppSave: TApplication;
begin
AppSave:=Application;
Application:=TApplication.Create;
Application.Inicialize;
....//тут идёт создание форм, задание Application.Title и прочее
Application.Run;
Application.Free;
Application:=AppSave;
end.
Дело было в следующем:
процедура RegisterClass добавляет класс в некий TList (FGroups в объекте TRegGroups модуля classes).
Точнее не в него, т.к. он сам является списком списков, а в один из содержащихся в нем списков.
При включении в строке Uses вместо модуля Forms модуля QForms, происходит какое-то "переключение" активного списка в FGroups. При этом функция RegisterClass корректно отрабатывает, а вот GetClass найти не может. (Переключение происходит каждый раз при инициализации модуля, в котором юзается QForms, GetClass ищет не в том списке, где был зарегистрирован класс).
Т.о. замена QForms на Forms помогла в моем случае. Хотелось бы понять, может мой результат поможет кому вспомнить, что там происходит и из-за чего твориться этот бардак.
To
все мои bpl компилятся без RunTime Packages (кстати, там галка почему-то неактивна)
PS Я работаю тоже в D7
кстати, там галка почему-то неактивнаЭто как? Ни разу такого не встречал.
Я в своё время был вынужден включить сборку с vcl ради того, чтобы не появлялось исключение из-за несоответствия классов DLL.TFont и EXE.TFont при показе хинта в окошке из dllки.
Оставить комментарий
BArter
Возник один очень интересный вопрос. Работаю с проектом, который разделен на BPL. Классы, которые дергаются из основной программы регистрируются, а главная через GetClass дергает их и создает экземпляры.Тут возникла одна тяжелая проблема, решить которую пока не получается. Некоторые классы при вызове
Classes.RegisterClass(TMyClass) не регистрируется. В чем проблема, понять никак не удается. Есть одна компонента собственной разработки, опытным путем выяснили, что ее присутствие не позволяет регистрировать. В последний раз в bpl добавил 3 форму(пустую) и следующий код
выводит сообщение.
Если кто сталкивался с похожей проблемой, подскажите.
Если кто-то знает литературу, где работа с bpl и процесс регистрации классов хорошо описан, порекомендуйте.