Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Многомодульные программы в Delphi (http://forum.oszone.net/showthread.php?t=201557)

RasKolbas 09-03-2011 23:30 1631063

Многомодульные программы в Delphi
 
Я только начинаю изучать 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 1631072

Цитата:

Цитата RasKolbas
Оба модуля, скомпилированных в бинарный код, будут по раздельности упакованы в Project1.exe и при запуске его в памяти будут сразу два процесса или всё же код будет один? »

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

PhilB 10-03-2011 19:15 1631738

Касательно передаваемых данных между модулями.
То что объявлено в интерфейсной части модуля (переменные, функции, константы), будет доступно для всех модулей, которые его импортируют.
Варианты существуют разные, вот один из способов.
Пример.
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 1631773

Цитата:

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

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

RasKolbas 10-03-2011 20:28 1631795

Цитата:

Цитата lxa85
Для примера посмотри пример spashscreen в exmples »

Нету

lxa85 10-03-2011 20:47 1631821

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


Время: 03:25.

Время: 03:25.
© OSzone.net 2001-