Контрольное взвешивание, или Веское приложение в Delphi XE

Хорошего человека должно быть много.

Коварное заблуждение

 

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

Некоторые, так называемые, специалисты считают, что здоровый человек должен иметь идеальный вес, который можно определить по формуле

 P= (3 xA- 450 + Bx 0,25 + 45                - для   мужчин, P= (3 xA - 450 + Bx 0,225 + 40,4            -    для женщин, 

 

где под загадочными буквами А и В скрываются рост (в сантиметрах) и возраст (в годах).

 

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

 

Какой же должна быть программа, основанная на этих незамысловатых формулах? Ясно, что главную роль в ней должна играть функция, вычис­ляющая идеальный вес по заданным параметрам - полу «подопытного ин­дивидуума», его возрасту и росту. С написанием функции проблем не бу­дет, ведь достаточно перевести на «дельфийский» язык обычные матема­тические выражения. Чтобы функция «знала» исходные величины, введём переменные, в которых будем хранить текущие значения возраста и роста.

Нам нужно позаботиться о том, чтобы пользователь мог быстро и удобно передавать в программу необходимые величины. Так как пол может быть либо мужской, либо женский, то логично поставить два переключателя: нажмёшь один - выключится другой, и наоборот. И в программе нетрудно будет узнать, какой переключатель включен в настоящий момент.

 

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

выводить на экран с помощью хорошо нам уже известного компонента - метки.

 

Вот, пожалуй, и вся премудрость. Осталось только воплотить мечту в ре­альность.

 

Откроем новый проект.

 

В заголовке формы напишем Вес, то есть свойству Captionприсвоим зна­чение 'Вес'.

 

Из свойств Borderlconsмы оставим только biSystemMenuи biMinimize, а для BorderStyleвыберем bsSingle, чтобы размеры формы нельзя было из­менять в работающей программе.

 

Для выбора пола «клиента» установим компонент RadioGroupсо страни­цы StandardПалитры компонентов (щёлкните дважды на значке TGroupBox)

 

Он позволяет очень быстро сформировать набор переключа- TGroupBox

 

телей. В его рамке выведем соответствующую надпись жирным шрифтом (Caption= ' Пол ', Font.Style= [fsBold]),

установим форму курсора в виде руки (Cursor= crHandPoint) - прозрачный намёк на то, что здесь нужно приложить руки. Дважды щёлкните на окошке свойства Itemsи в рас­крывшемся редакторе StringListEditorнаберите две строки:

Контрольное взвешивание, или Веское приложение в Delphi XE

Нажмите кнопку ОК - и у компонента появятся два переключателя с этими надписями. Свойство Itemlndexпоказывает, какой из переключателей выбран (первоначально его значение равно 0 - по умолчанию пол предпо­лагается мужской; суфражистки, феминистки и подкаблучники могут из­менить последовательность строк или установить ItemIndex=1).

Чтобы придать интерфейсу элегантный вид, установим на форму компо­нент TPaneL, а уже на нём разместим два скроллера TScrollBar

 

Первый (Name= sbAge) будет отвечать за возраст, второй (Name= sbRost) - за рост. Выберем по изложенным выше причинам для обоих ползунков курсор в виде руки (Cursor= crHandPoint). Дополнительно сделаем под­сказки (Hint= 'Возраст' и Hint= 'Рост', ShowHint= True). Будем считать, что возраст изменяется в пределах от 0 до 100 (Min= 0, Max= 100, значе­ние по умолчанию Position= 20), а рост от 60 до 220 (Min= 60, Max= 220, значение по умолчанию Position= 160).

 

Справа от скроллеров разместим две метки (lblAgeи lblRost), в которые будем выводить текущие значения возраста и веса. Шрифт установим по­крупнее (Font.Height= -16), потолще (Font.Style= [fsBold]) и поярче (Font.Color= clRed). В каждой метке напишем значения по умолчанию (Caption= '20' и Caption= '160'). Чтобы числа всегда были расположены строго друг под другом, установите Alignment= taRightJustifyи AutoSize= False. Осталось справа от них поместить две метки, поясняющие назначе­ние скроллеров. Забегая немного вперёд, мы должны увидеть такую кар­тину 

 Контрольное взвешивание, или Веское приложение в Delphi XE

 

Осталось самое «главное» - установить на форме пару меток для вывода вычисленного значения идеального веса:

 Метка lblVes: Caption = '52', Font.Color = clRed, Font.Height = -32, Font.Style= [fsBold] Метка Label2: Caption = 'Идеальный вес =', Font.Height = -19, Font.Style =[fsBold]. 

 

С визуальной частью интерфейса мы справились неплохо, можно браться за функциональную.

 

Как мы уже выяснили, нам потребуются две переменные для хранения введённых значений возраста и веса. Объявим их сразу перед разделом implementation:

 var Form1: TForm1; age, rost: integer; Рядышком объявим функцию, которая по «учёным» формулам будет вы­числять вес: private { Private declarations } function Ves: single; Что до самой формулы, то исключительно вручную наберите её код: //ВЫЧИСЛИТЬ ИДЕАЛЬНЫЙ ВЕС  function TForm1.Ves: single;  begin  if RadioGroup1.ItemIndex= 0 then //мужской пол Result:= (rost*3 - 450 + age) * 0.25 + 45 else  //женский пол Result:= (rost*3 - 450 + age) * 0.225 + 40.4; //скорректировать отрицательные значения: if Result< 0 then Result:= 4; end; 

 

Действует-злодействует (сказочное выражение) она так. По номеру нажа­того переключателя (отсчёт начинается с нуля!) определяется пол «персо­нажа», в соответствии с которым выбирается одна из двух формул. По­следняя строчка заменяет отрицательное значение на более осмысленное. Это вызвано тем, что данные формулы не универсальны, то есть действи­тельны только для разумных сочетаний параметров, поэтому идеальный вес Кощея Бессмертного или дядьки Черномора по ней вычислять нельзя.

Мы поступим правильно, если при запуске программы сразу же выведем значение веса по установкам скроллеров (в Инспекторе объектов перей­дите на страницу Eventsи дважды щёлкните на окошечке события OnCreate, а затем в заготовке процедуры обработки напишите следующие строки):

 //СОЗДАТЬ ФОРМУ procedure TForm1.FormCreate(Sender: TObject); begin //снять значения со скроллеров: age:= sbAge.Position; Rost:= sbRost.Position; //вычислить вес: lblVes.Caption:= inttostr(round(ves)) end; 

 

Конечно, можно сразу же во всех метках вывести согласованные значения, но если вы потом измените одно из них, то либо придётся исправлять и вес, либо при запуске программы вес не будет соответствовать положени­ям движков. Ничего страшного в этом нет - вряд ли вы угадаете возраст и рост пользователя, он всё равно будет двигать ползунки, - но лучше при­учить себя всё доводить до ума.

 

Запустив эту программу, «клиент» будет вводить свои данные, то есть пол, возраст и вес. Чтобы не заставлять его нажимать после этого кнопку для вычисления веса, будем «публиковать» его сразу после каждого изменения параметров. Например, пользователь сменил пол (к счастью, только в про­грамме), и тут же выводится новое значение веса:

 //ВЫБРАТЬ ПОЛ procedure TForm1.RadioGroup1Click(Sender: TObject); begin //вычислить вес: lblVes.Caption:= inttostr(round(ves)) end; Аналогично поступаем и при изменении положения ползунка скроллера: //ЗАДАТЬ ВОЗРАСТ procedure TForm1.sbAgeChange(Sender: TObject); begin //возраст: age:= sbAge.Position; //вывести значение на экран: lblAge.Caption:= inttostr(age); //вычислить вес: lblVes.Caption:= inttostr(round(ves)) end; //ЗАДАТЬ РОСТ procedure TForm1.sbRostChange(Sender: TObject); begin //рост: Rost:= sbRost.Position; //вывести значение на экран: lblRost.Caption:= inttostr(Rost); //вычислить вес: lblVes.Caption:= inttostr(round(ves)) end; 

 

Значения возраста и роста определяем по положению ползунка (свойство Positionкомпонента ScrollBar), вычисляем вес, округляем его до целого числа (формулы, естественно, не настолько точны, чтобы рассчитывать ещё и граммы), которое преобразуем в строку и выводим на экран.

 

Перед тем как предлагать эту программу другим людям, очень полезно испытать её на себе. Запустите программу, подвигайте ползунки, оцените все достоинства и недостатки интерфейса:

Контрольное взвешивание, или Веское приложение в Delphi XE



Последний штрих

Вы можете продолжить свои исследования рода человеческого с помощью компьютера. Немного подправив нашу программу Вес, вы легко определи­те жирность тела любого гражданина (или гражданки).

Дотошная наука выяснила, что тело молодых здоровых мужчин содержит около 15%, а тело женщин - 22% жира. Жирность произвольно выбранно­го тела приблизительно оценивается по формуле:

Ж = (Вес - Р) : Вес х 100 + 15          - для мужчин,

Ж = (Вес - Р) : Вес х 100 + 22          - для женщин,

где Р - идеальный вес, который определяется по предыдущим формулам.

Не будем целиком переписывать всю программу Вес, а адаптируем её к «новым реалиям». Для этого создадим новую папку Zhir, в которую пере­пишем файлы формы и программы (Главное меню File> Saveas..., затем File> SaveProjectas.). В файле модуля формы добавим ещё одну пере­менную - для хранения веса тела:

var Form1: TForm1; age, rost, ves: integer;

Также нужно исправить название функции - теперь мы будем вычислять не вес тела, а его жирность:

private { Private declarations } function Zhir: single;

Основательно поработаем и над самой функцией:

     //ВЫЧИСЛИТЬ ЖИРНОСТЬ ТЕЛА  function TForm1.Zhir: single;  var  v: single;    begin      if RadioGroup1.ItemIndex= 0 then   begin //мужской пол   v:= (rost*3 - 450 + age) *0.25 + 4 5;   Result:= (ves - v) / ves *100+ 15 end else    begin  //женский пол    v:= (rost*3 - 450 + age)*0.225+ 4 0.4;   Result:= (ves - v) / ves*100 +22   end; //скорректировать значения   if Result< 0 then Result:=0;    if Result> 100 then Result=100;    end;  

 

Сначала, как и раньше, мы находим идеальный вес тела, а затем его жир­ность. Так как она вычисляется в процентах, то следует выправить курь­ёзные значения.

На форму «придётся» добавить ещё один скроллер - для ввода истинного веса тела:

 Name = sbVes  Cursor = crHandPoint  Hint = ’Вес’ Max = 200  Min = 3  Position = 60  ShowHint = True и метку: Name = lblVes Alignment = taRightJustify  AutoSize = False  Caption = ’100’ Font.Color = clRed  Font.Height = -16  Font.Style = [fsBold] 

 

Остальные изменения внесите сами, поглядывая на картинку:

Контрольное взвешивание, или Веское приложение в Delphi XE

Не забудьте прежнюю метку IblVesпереименовать в lblZhir. Осталось подправить код модуля (выделенные строки):

 //СОЗДАТЬ ФОРМУ procedure TForm1.FormCreate(Sender: TObject); begin //снять значения со скроллеров: age:= sbAge.Position; Rost:= sbRost.Position; Ves:= sbVes.Position; //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; //ВЫБРАТЬ ПОЛ procedure TForm1.RadioGroup1Click(Sender: TObject); begin //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; //ЗАДАТЬ ВОЗРАСТ procedure TForm1.sbAgeChange(Sender: TObject); begin //возраст: age:= sbAge.Position; //вывести значение на экран: lblAge.Caption:= inttostr(age); //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; //ЗАДАТЬ РОСТ procedure TForm1.sbRostChange(Sender: TObject); begin //рост: Rost:= sbRost.Position; //вывести значение на экран: lblRost.Caption:= inttostr(Rost); //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; //ЗАДАТЬ BEC procedure TForm1.sbVesChange(Sender: TObject); begin //вес: ves:= sbVes.Position; //вывести значение на экран: lblVes.Caption:= inttostr(Ves); //вычислить жирность: lblZhir.Caption:= inttostr(round(zhir)) end; 

 

Протестируйте программу на ком только сможете. Наверное, это доставит и вам, и всем испытуемым массу удовольствия и запомнится на всю жизнь.

 

Если для вас это настоящая докука - из элементарных формул делать не очень простые программы, то дельфопланеризм - не ваша стихия, поста­райтесь найти себя в других областях нескучных развлечений.

 

Но если Вы чувствуете, что это самое то что вам нужно, то Вы можете освоить в совершенстве язык программирования Delphi прямо сейчас вот тут.

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

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