Как делить переменные между библиотеками в Delphi 2009? - PullRequest
0 голосов
/ 28 ноября 2009

Я пытаюсь разделить свое монолитное приложение Delphi-Win32 по библиотекам, поэтому у меня возникают вопросы о том, как распределять глобальные переменные и объекты между моими библиотеками с помощью Delphi 2009. Например, у меня есть 3 глобальных объекта (полученных из TObject): для информации о пользователе, для текущей информации о сеансе, а также для хранения активного соединения с базой данных и управления операциями с этой базой данных. Мои библиотеки требуют работы с этими объектами. Более того, некоторые библиотеки предоставляют объект, полученный из TForm, для размещения другого родительского элемента управления в основной форме. Каждый объект, полученный из TForm, переданный главной форме, имеет свои собственные методы и свойства, то есть их классы отличаются друг от друга.

Я думаю поместить глобальные объекты в отдельную библиотеку, но думаю, что это усложнит ситуацию, но подумайте об этом, пожалуйста.

Как заставить работать эту ситуацию?

Еще один вопрос, который лучше использовать: статическая или динамическая загрузка для библиотек? Можете ли вы порекомендовать несколько книг или сайтов, чтобы узнать больше об этом?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 28 ноября 2009

В прошлом мы делали переменные между модулями (мы использовали BPL), чтобы передать их через общий TStringList. Вообще говоря, лучше иметь глобальный общий объект со всеми вашими общими переменными.

Все, на что будет ссылаться более чем одна библиотека, должно быть в ее собственной библиотеке . Совет Мэйсона был верным .

Работайте со статической загрузкой, если вам действительно не нужна динамика по какой-то конкретной причине (на что это не похоже). Позвольте диспетчеру памяти Windows выгрузить ненужные библиотеки из памяти.

Один совет от того, кто управлял большим приложением, разбитым на несколько библиотек. У нас были наши компоненты в пакетах, VCL, некоторые общие подпрограммы приложения, а затем библиотека для каждого «экрана» или сегмента приложения. Для изменений на экранах можно было просто выпустить одну обновленную библиотеку, но для изменений в любом из других типов библиотек мы обнаружили, что обычно пришлось заново развертывать все. Так что было редко, мы пользовались преимуществом от конфигурации.

1 голос
/ 28 ноября 2009

Кажется, что под "библиотеками" вы подразумеваете пакеты BPL, поэтому вот рекомендации:

Каждый BPL, когда он загружается, загружает все модули в нем. Ни один блок не может быть загружен более одного раза. Это означает, что если более чем одному пакету требуется доступ к одному из глобалов, то он должен быть либо в одном пакете, который есть у других в списке Требуется , либо в отдельном пакете, который все остальные требуют.

Что касается статической и динамической загрузки, если ваша программа в этом абсолютно нуждается, сделайте ее статически связанной. Динамическая загрузка предназначена для дополнительных функций, таких как плагины. (Если вы хотите пойти по этому пути, взгляните на JVPlugin в JVCL. Это очень полезная система.)

0 голосов
/ 28 ноября 2009

Я НЕ понимаю, почему люди упоминают версию Delphi для простого вопроса, подобного этому, ответ - да, лучше поместить общие переменные в отдельный модуль перед ключевым словом реализации. Каждый объект (форма, класс, элемент управления) является производным от TObject, даже если вы определяете класс, такой как

type TMyClass = class
  // no inheritance ?
end;

вышеуказанный класс все еще является производным от TObject (см. Справку по Delphi). Ваши глобальные переменные могут быть объявлены с типом TObject или Pointer, и при обращении к ним используйте жесткую приведение TForm (MyPointerVariable) .Method, т.е.

var MyPointerVariable: Pointer; // I presume it is already initialized and is a pointer to a TForm descendant
...
begin
     TForm(MyPointerVariable).Caption := 'Stack Overflow';
end;

Для получения дополнительной информации прочитайте учебник Delphi в моем блоге, он должен быть очень простым для понимания.

...