PDA

Показать полную графическую версию : Многомодульные программы в Delphi


RasKolbas
09-03-2011, 23:30
Я только начинаю изучать Delphi. Сначала попробовал создать консольную программу. Тут всё просто, в точности как в знакомом мне Паскале. Сейчас разбираюсь как GUI-программы пишутся. Изучаю по книге В. В. Фаронова "Delphi. Программирование на языке высокого уровня". Насколько я понял, когда я создаю графическую форму, вместе с ней создаётся модуль, без модуля форма работать не может. То есть, GUI-программа по-любому будет многомодульной, минимум два модуля в ней будут: Unit1.pas и основная программа Project1.dpr (чтобы не путаться оставляю имена умолчальными). Что произойдёт после компиляции? Оба модуля, скомпилированных в бинарный код, будут по раздельности упакованы в Project1.exe и при запуске его в памяти будут сразу два процесса или всё же код будет один?

А как передавать значения переменных между модулями? Допустим у меня в основной программе вычисляется 36 в степени 3:

result:=Exp(3*Ln(36));

А в модуле результат выводится путём присваения Caption метки Label1:

procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:=FloatToStr(result);
end;

Как сделать, чтобы значение переменной result передавалось из основной программы в модуль?

Извините, если глупость спрашиваю, я всего лишь новичок. Дайте правильное направление мысли.

lxa85
09-03-2011, 23:51
Оба модуля, скомпилированных в бинарный код, будут по раздельности упакованы в Project1.exe и при запуске его в памяти будут сразу два процесса или всё же код будет один? »
Будет один код. dpr нужен для начальной инициализации и связывания модулей воедино. В нем так же может исполняться код. Для примера посмотри пример spashscreen в exmples где-нибудь. (Если устанавливал) Объяснение дал поверхностное, на всякий случай спроси у гугла.
Для меж.модульного взаимодействия, пропиши название модуля в uses. Вызов, как при работе с объектом
Unit1.Form1.Label1.Caption := "test"; к примеру.
В основном многомодульные программы появляются в случае многооконных приложений.

PhilB
10-03-2011, 19:15
Касательно передаваемых данных между модулями.
То что объявлено в интерфейсной части модуля (переменные, функции, константы), будет доступно для всех модулей, которые его импортируют.
Варианты существуют разные, вот один из способов.
Пример.
Unit1
...
interface
function a():double; // делаем функцию доступной извне
...
implementation
function a():double; // собственно реализация функции
begin
result:=Exp(3*Ln(36));
end;
...

Unit2
...
implementation
procedure TForm1.FormCreate(Sender: TObject); // этот код выполняется во время создания окна
begin
Label1.Caption:=FloatToStr(Unit1.a()); // вызов функции
end;
...

Любезный
10-03-2011, 20:03
А как передавать значения переменных между модулями?

Ничего сложного. Для этого можно объявить глобальные переменные внутри какого-либо модуля, а в других модулях, которые будут обращаться к этим переменным, прописать название этого модуля в секции Uses. В проектах посложнее я специально создаю отдельный модуль только для общих переменных и методов. Но при этом следует следить, чтобы имена этих глобальных переменных не совпадали с именами переменных и методов в других модулях. В этом случае обращаться к такой переменной из другого модуля можно просто по имени, без указания модуля-родителя.

Кстати, ни в коем случае не используйте имя result в качестве имени переменной, ибо это слово зарезервировано и в функциях присваивает значение переменной, которая будет возвращаться в качестве результата работы функции.

RasKolbas
10-03-2011, 20:28
Для примера посмотри пример spashscreen в exmples »
Нету

lxa85
10-03-2011, 20:47
RasKolbas, ЕМНИП было в Delphi 6. Сейчас развернуть среду программирования пока некуда, как появится возможность, скину пример.




© OSzone.net 2001-2012