![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
|||
|
|||
![]() Вообще, если тебе не надо соответсвие между TObject в основной программе и в доп. модулях, то можно и DLL использовать. С ими работать зачастую проще, чем с BPL.
Теперь по основной теме. Тут недавно в блогах проскакивала серия статей про создание плагинов на основе интерфейсов. Вот ссылка на последнюю из серии, остальные сам найдешь: http://www.gunsmoker.ru/2012/06/7.html Если с интерфейсами возиться не хочется и нет задачи создания полноценной системы плагинов, то можно сделать примерно так: 1. Делаем у формы обработчик события, который будет вызван в момент закрытия формы. 2. При закрытии MDIChild формы, если обработчик назначен, то вызываем его, передавая внутрь нужные данные. 3. При создании дочерней формы назначаем ей обработчик из главной формы. 4. Инициализацию (начальное присвоение значений) можно сделать через конструктор. Шаблон кода: DLL: Код:
type TParamSet = record ... // Набор переменных для передачи end; TChildCloseEvent = procedure (var PramSet : TParamSet) of object; TChildForm = class(TForm) ... private FOnChildClose : TChildCloseEvent; public constructor TChildForm.Create(AOwner : TComponent; ParamSet : TParamSet); override; OnChildClose : TChildCloseEvent read FOnChildClose write FOnChildClose; end; ... constructor TChildForm.Create(AOwner : TComponent; ParamSet : TParamSet); begin inherited Create(AOwner); FOnChildClose := Nil; end; procedure TChildForm.Close(Action : TCloseAction); // Не помню точно сигнатуру begin ParamSet.Int := 10; // для примера If Assigned(FOnChildClose) Then FOnChildClose(ParamSet); Action := caFree; end; Главный модуль: Код:
procedure TMainForm.GetMDIParams(var ParamSet : TParamSet); begin // Сохраням полученные значения end; procedure TMainForm.CreateChildForm; var Form : TChildForm; ParamSet : TParamSet; begin // Здесь грузим DLL или еще что ... Form := TChildForm.Create(Application,ParamSet); Form.OnChildClose := GetMDIParms; end; Как-то так. Код набросан только для пояснения идеи. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
sorockinalex (27.08.2012)
|
#17
|
|||
|
|||
![]() Цитата:
Но этот вопрос всё ещё в силе! |
#18
|
|||
|
|||
![]() Спасибо большое! Постараюсь разобраться завтра!!
|
#19
|
|||
|
|||
![]() Так и не разобрался что делать с ошибкой 00000058, при нажатии кнопки в bpl форме, действие подключения к ADOQuery, находящейся в DataModule возникает эта ошибка..
www.fayloobmennik.net/2148751 там exe файл уже есть и сам проект Последний раз редактировалось sorockinalex, 27.08.2012 в 22:29. |
#20
|
|||
|
|||
![]() Цитата:
Далее, map файл включил, тоже не понимаю что с ним делать? |
#21
|
|||
|
|||
![]() Фуф. Целый день искал решение проблемы:
Есть главная форма, есть юнит UDataModule, на котором есть компонент ADOQuery. Есть bpl модуль, по нажатии кнопки в котором должно происходить доступ к ADOQuery. Но вылетала ошибка, будто DataModule не существует. Наконец! Нашёл решение тут: http://www.delphikingdom.com/asp/ans...IDAnswer=73954 Цитата:
Возникает второй вопрос: Хочу один раз сделать главный exe файл и его долгое время не менять, чтобы при появлении новых плагинов они сами устанавливались и запускались просто потому, что они лежат в папке с программой. Значит не могу я знать какие ещё плагины будут в будущем и соответственно прописать их в списке рантайм пакетов тоже не могу! Как не прописывая в списке рантайм пакетов заставить работать то же самое? Последний раз редактировалось sorockinalex, 28.08.2012 в 16:46. |
#22
|
|||
|
|||
![]() Вообще если отключить опцию Build With Runtime Packages, то приложение запускается, но нет доступа к DataModule.pas, как будто он не создан... А мне как раз нужно без использования рантайм пакетов скомпилировать программу, чтобы эти пакеты bpl можно было обновлять. Точнее, с поставленной галкой, чтобы сам исполняемый файл не включал в себя пакеты bpl, но так, чтобы не прописывать в этом поле жёстко какие пакеты используются, потому, что они со временем будут прибавляться... Как это сделать?
и ещё почему-то все на форумах говорят про галочку Use Dynamic RTL, а у меня в окне Project-Options-Linker её нет вообще! Использую D7... Последний раз редактировалось sorockinalex, 28.08.2012 в 23:34. |
#23
|
|||
|
|||
![]() ребят, помогите, плиз! кстати, действие в главном по отношению к вызываемому окну решил делать с использованием sendmessage при закрытии подчинённой bpl )))
|
#24
|
|||
|
|||
![]() ![]() итак, проблема опять возникла. В Project Options выбрана галочка Build with runtime packages, указаны все пакеты DataModule, Login, Companies. В DataModule вставлен Query и DataSet. При нажатии на форме Login кнопки OK происходит подключение к базе через запрос, находящийся в DataModule. ТАк вот. При нажатии на эту кнопку опять стала возникать ошибка: ![]() в прошлый раз от этой проблемы избавился, когда добавил Login в список Build With Runtime Packages... Сейчас он там есть, но всё равно ошибка возникает... Посоветуйте что-нибудь! |
#25
|
|||
|
|||
![]() Блин, кажись понял в чём дело. Ранее DM создавался автоматически, так как был не bpl модулем.. Теперь бы его создать при создании главной формы, только как это прописать там на OnCreate????
|
#26
|
|||
|
|||
![]() Application.CreateForm(TDM, DM);
|