Многие приложения имеют несколько дополнительных окон (форм) - для показа справки помощи, ведения протокола, загрузки файлов с диска и по другим причинам. По отношению к главному окну программы они могут вести себя по-разному.
Однодокументный интерфейс в Delphi
Иначе - SDI (SingleDocumentInterface). Все проекты Delphi по умолчанию имеют именно такой интерфейс (свойство FormStyleравно fsNormal). Однодокументные приложения содержат одну главную форму и любое количество дочерних, которые могут запускаться как из главной формы, так и из других дочерних. При этом дочерние формы могут располагаться в любом месте экрана и перекрывать главную форму.
Главной обычно является та форма, которая создаётся первой, но в диалоговом окне ProjectOptions(открывается по команде Главного меню Project> Options.) вы можете перепоручить эту роль любой другой форме проекта. Дочерние формы создаются автоматически при старте приложения или программно (список тех и других форм также можно отредактировать в диалоговом окне ProjectOptions). Если дочерняя форма выводится на экран методом ShowModal, то нельзя перейти на другие окна приложения, пока она не закрыта. При сворачивании главного окна закрываются и все дочерние.
Формы в SDI-приложении связаны между собой через данные и элементы управления, для чего они должны быть объявлены в модуле той формы, в которой есть ссылка на элементы (компоненты, переменные и так далее) другой формы.
Кожа да кости! Требование Славы Зайцева к моделям
Не лезьте из кожи! Царевна Лягушка
Продолжим составлять познавательные программы.
Давайте вычислим площадь поверхности человеческого тела (кожи). С точки зрения геометрии, фигура человека весьма «вычурна», поэтому не существует точных формул для определения площади тела. Мы воспользуемся формулой Бойде, которая позволяет приближённо вычислить нужную величину (не пугайтесь - формула заковыристая):
где Р - вес человека в кг, Н - его рост в см.
Так как для вычисления площади тела нужно знать рост и вес человека, то за основу нашей программы возьмём предыдущее наше творение, убрав из него всё лишнее. После чего форма программы будет выглядеть вот так
Несколько исправлений придётся внести и в модуль формы. Сотрите все ссылки на ненужные элементы, измените название процедуры и добавьте модуль 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!)
Убираем кнопки из заголовка - в свойстве 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;
Если вы теперь запустите программу, то на экране возникнет такое сообщение
Форма Formlссылается на форму Form2, объявленную в модуле Unit2, которого нет в списке USES. Хотите ли вы добавить его? Смело нажимайте кнопку Yes, и Delphi«позаботится» о вас, дописав в модуль главной формы выделенную строку (конечно, этот «текст» вы можете впечатать и сами, не обременяя Delphi):
implementation uses Unit2; {$R *.DFM}
А вот сейчас жмите на RUNс полной силой - ожидания не обманут вас: на экране во всей красе предстанут обе формы:
С их помощью вы сможете вычислить площади всех доступных вам тел, к вящему удовольствию их «владельцев» (если они ещё не потеряли вкус к жизни после первых трёх экспериментов).