Одно- и многооконные приложения в Delphi, или Сколько кожи на человеке

Многие приложения имеют несколько дополнительных окон (форм) - для показа справки помощи, ведения протокола, загрузки файлов с диска и по другим причинам. По отношению к главному окну программы они могут вести себя по-разному. 

 

Однодокументный интерфейс в Delphi

Иначе - SDI (SingleDocumentInterface). Все проекты Delphi по умолчанию имеют именно такой интерфейс (свойство FormStyleравно fsNormal). Од­нодокументные приложения содержат одну главную форму и любое коли­чество дочерних, которые могут запускаться как из главной формы, так и из других дочерних. При этом дочерние формы могут располагаться в лю­бом месте экрана и перекрывать главную форму.

 

Главной обычно является та форма, которая создаётся первой, но в диало­говом окне ProjectOptions(открывается по команде Главного меню Pro­ject> Options.) вы можете перепоручить эту роль любой другой форме проекта. Дочерние формы создаются автоматически при старте приложе­ния или программно (список тех и других форм также можно отредакти­ровать в диалоговом окне ProjectOptions). Если дочерняя форма выво­дится на экран методом ShowModal, то нельзя перейти на другие окна приложения, пока она не закрыта. При сворачивании главного окна за­крываются и все дочерние.

 

Формы в SDI-приложении связаны между собой через данные и элементы управления, для чего они должны быть объявлены в модуле той формы, в которой есть ссылка на элементы (компоненты, переменные и так далее) другой формы.  

 

Кожа да кости! Требование Славы Зайцева к моделям

 

Не лезьте из кожи! Царевна Лягушка

Продолжим составлять познавательные программы.

 

Давайте вычислим площадь поверхности человеческого тела (кожи). С точки зрения геометрии, фигура человека весьма «вычурна», поэтому не существует точных формул для определения площади тела. Мы воспользуемся формулой Бойде, которая позволяет приближённо вычислить нужную величину (не пугайтесь - формула заковыристая):

delphi

где Р - вес человека в кг, Н - его рост в см.

 

Так как для вычисления площади тела нужно знать рост и вес человека, то за основу нашей программы возьмём предыдущее наше творение, убрав из него всё лишнее. После чего форма программы будет выглядеть вот так

 Delphi

Несколько исправлений придётся внести и в модуль формы. Сотрите все ссылки на ненужные элементы, измените название процедуры и добавьте модуль math, без которого невозможно провести вычисления по нашей страшной формуле:

 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, math; type TForm1 = class(TForm) Panel1: TPanel; lblRost: TLabel; Label4: TLabel; lblVes: TLabel; Label5: TLabel; sbRost: TScrollBar; sbVes: TScrollBar;
procedure sbVesChange(Sender: TObject);
procedure sbRostChange(Sender: TObject); procedure FormShow(Sender: TObject); private  { Private declarations } procedure Kozha;   public   { Public declarations } end;  
var  Form1: TForm1;  rost, ves: integer;  
Вычислять площадь тела мы будем в процедуре: //ВЫЧИСЛИТЬ ПЛОЩАДЬ ТЕЛА  
procedure TForm1.Kozha;   var  s: Extended;  begin  s:= (log10(1 / ves)+ 35. 75) / 53.2; //вычислить площадь тела :
s:= power((ves * 1000), s) * power(rost, 0.3) / 0.31182;
Form2.lblKozha.Caption:= Format('%5.0f',  )
end; 

  

Переводим формулу Бойде на математический диалект дельфийского языка и выводим на экран площадь тела в квадратных сантиметрах (от­брасываем десятичные знаки с помощью функции Format): как говорил Удав, «А в попугаях я гораздо длиннее!».

 

Добавим к главной форме одну дочернюю (форма-заставка нам здесь не понадобится, поэтому исключите её из проекта, а из модуля проекта уда­лите все строчки, где она упоминается). Делаем это, как обычно, а самой форме придаём нужный вид (не забудьте записать новый проект в папку KOZHA!)

Delphi

Убираем кнопки из заголовка - в свойстве BorderIconsвсе значения уста­навливаем в False: BorderIcons= []. Оставляем только заголовок (Border- Style= bsDialog, Caption = ' '), чтобы форму можно было передвинуть на удобное место. Так как эта форма всегда должна быть на виду, задаём зна­чение FormStyle= fsStayOnTop.

 

Вычисленную величину выводим в метке lblKozha:

 Font.Color = clRed Font.Height = -40 Font.Style = [fsBold]. Подправляем процедуры, доставшиеся нам в наследство: //ЗАДАТЬ РОСТ procedure TForm1.sbRostChange(Sender: TObject); begin //рост: Rost:= sbRost.Position; //вывести значение на экран: lblRost.Caption:= inttostr(Rost); //вычислить площадь кожи: Kozha end; //ЗАДАТЬ BEC procedure TForm1.sbVesChange(Sender: TObject);
begin //вес: ves:= sbVes.Position; //вывести значение на экран: lblVes.Caption:= inttostr(Ves); //вычислить площадь кожи: Kozha end; Процедуру FormCreateзаменим процедурой FormShow, так как теперь нам нужно дождаться, пока будет создана и дочерняя форма, иначе мы не сможем вывести значение площади кожи, вычисленное по установленным движкам. procedure TForm1.FormShow(Sender: TObject);
begin //снять значения со скроллеров: Rost:= sbRost.Position; Ves:= sbVes.Position;
//вычислить площадь кожи: Kozha; //выводим главную форму в центре экрана: left:= (screen.width - width) div 2; top:= (screen.height - height) div 2; //а дочернюю - справа от неё: Form2.Left:= left+width; Form2.Top:= top; Form2.Show; end;

Если вы теперь запустите программу, то на экране возникнет такое сооб­щение

Delphi

Форма Formlссылается на форму Form2, объявленную в модуле Unit2, ко­торого нет в списке USES. Хотите ли вы добавить его? Смело нажимайте кнопку Yes, и Delphi«позаботится» о вас, дописав в модуль главной формы выделенную строку (конечно, этот «текст» вы можете впечатать и сами, не обременяя Delphi):

 implementation uses Unit2; {$R *.DFM} 

А вот сейчас жмите на RUNс полной силой - ожидания не обманут вас: на экране во всей красе предстанут обе формы:

Delphi

С их помощью вы сможете вычислить площади всех доступных вам тел, к вящему удовольствию их «владельцев» (если они ещё не потеряли вкус к жизни после первых трёх экспериментов).

������� ������ ��� dle ������� ��������� ������

Помоги проекту! Расскажи друзьям об этом сайте: