Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 27.08.2012, 02:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,093
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, если тебе не надо соответсвие между 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  
Старый 27.08.2012, 16:31
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Цитата:
Сообщение от sorockinalex
http://www.fayloobmennik.net/2146952

Спасибо большое за готовность помочь! Прикрепил файл.

Но этот вопрос всё ещё в силе!
Ответить с цитированием
  #18  
Старый 27.08.2012, 21:49
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
Хорошо

Спасибо большое! Постараюсь разобраться завтра!!
Ответить с цитированием
  #19  
Старый 27.08.2012, 22:25
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Так и не разобрался что делать с ошибкой 00000058, при нажатии кнопки в bpl форме, действие подключения к ADOQuery, находящейся в DataModule возникает эта ошибка..
www.fayloobmennik.net/2148751
там exe файл уже есть и сам проект

Последний раз редактировалось sorockinalex, 27.08.2012 в 22:29.
Ответить с цитированием
  #20  
Старый 27.08.2012, 23:17
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
В обычной ситуации для этого используется меню "Search" -> "Find Error..." (Приложение при этом должно быть запущено в отладчике).
Но в твоём случае ошибка возникает внутри bpl. Тут сложнее. Во-первых нужно узнать с какого адреса загрузилась bpl-ка, а во-вторых откомпилировать её с включённой генерацией Map-файла: "Options" -> "Linker" -> "Map file" -> "Detailed"
Или прикрепи исходники проекта, я дома посмотрю.

Ну я не говорил, что ошибка пропадёт. Просто в том месте у меня "глаз споткнулся". Вот зачем в том месте используется PChar вместо string?
Search Error не помогает, строку нашёл в поиске в 16-ричном редакторе и что с ней делать?
Далее, map файл включил, тоже не понимаю что с ним делать?
Ответить с цитированием
  #21  
Старый 28.08.2012, 16:38
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
Вопрос

Фуф. Целый день искал решение проблемы:
Есть главная форма, есть юнит UDataModule, на котором есть компонент ADOQuery. Есть bpl модуль, по нажатии кнопки в котором должно происходить доступ к ADOQuery. Но вылетала ошибка, будто DataModule не существует.

Наконец! Нашёл решение тут:
http://www.delphikingdom.com/asp/ans...IDAnswer=73954

Цитата:
Проблему решил благодаря найденным вопросам с похожей ситуацией. Возможно, как я понял, это баг делфи, но в общем обязательно необходимо, чтобы пакеты BPL были runtime-only. В свойствах основного проекта главной формы необходимо указать их в списке рантайм пакетов. Спасибо всем участникам обсуждений на форуме за высокоинформативные вопросы и ответы.

Возникает второй вопрос: Хочу один раз сделать главный exe файл и его долгое время не менять, чтобы при появлении новых плагинов они сами устанавливались и запускались просто потому, что они лежат в папке с программой. Значит не могу я знать какие ещё плагины будут в будущем и соответственно прописать их в списке рантайм пакетов тоже не могу! Как не прописывая в списке рантайм пакетов заставить работать то же самое?

Последний раз редактировалось sorockinalex, 28.08.2012 в 16:46.
Ответить с цитированием
  #22  
Старый 28.08.2012, 23:10
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Вообще если отключить опцию Build With Runtime Packages, то приложение запускается, но нет доступа к DataModule.pas, как будто он не создан... А мне как раз нужно без использования рантайм пакетов скомпилировать программу, чтобы эти пакеты bpl можно было обновлять. Точнее, с поставленной галкой, чтобы сам исполняемый файл не включал в себя пакеты bpl, но так, чтобы не прописывать в этом поле жёстко какие пакеты используются, потому, что они со временем будут прибавляться... Как это сделать?

и ещё почему-то все на форумах говорят про галочку Use Dynamic RTL, а у меня в окне Project-Options-Linker её нет вообще! Использую D7...

Последний раз редактировалось sorockinalex, 28.08.2012 в 23:34.
Ответить с цитированием
  #23  
Старый 30.08.2012, 00:35
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

ребят, помогите, плиз! кстати, действие в главном по отношению к вызываемому окну решил делать с использованием sendmessage при закрытии подчинённой bpl )))
Ответить с цитированием
  #24  
Старый 04.09.2012, 16:46
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию


итак, проблема опять возникла. В Project Options выбрана галочка Build with runtime packages, указаны все пакеты DataModule, Login, Companies.
В DataModule вставлен Query и DataSet. При нажатии на форме Login кнопки OK происходит подключение к базе через запрос, находящийся в DataModule. ТАк вот. При нажатии на эту кнопку опять стала возникать ошибка:

в прошлый раз от этой проблемы избавился, когда добавил Login в список Build With Runtime Packages... Сейчас он там есть, но всё равно ошибка возникает...

Посоветуйте что-нибудь!
Ответить с цитированием
  #25  
Старый 04.09.2012, 16:49
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Блин, кажись понял в чём дело. Ранее DM создавался автоматически, так как был не bpl модулем.. Теперь бы его создать при создании главной формы, только как это прописать там на OnCreate????
Ответить с цитированием
  #26  
Старый 04.09.2012, 16:55
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Application.CreateForm(TDM, DM);
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:40.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025