|
Учебник по Delphi
Процедуры, возвращающие значение.
Процедуры в Delphi тоже могут возвращать значение. И даже не одно! Из-за этого,
конечно, стирается грань между процедурами и функциями. В Delphi различия
между процедурами и функциями главным образом есть лишь на уровне синтаксиса.
Существует мнение, что процедуры занимают меньше места и чуть быстрее
работают. Но не думаю, что на практике эта разница будет заметна.
Чтобы процедура возвращала значение, в ее заголовке перед каждой переменной,
которая должна возвращать значение, нужно указывать слово var:
procedure TForml.Otchet(var summa:Int64; var skidka:Int64);
Как это все работает, лучше посмотреть на примере. Некоторые мои знакомые почему-то
не помнят, в каком месяце сколько дней. Напишем программу, которая
будет подсказывать эти ценные сведения. Причем количество дней как раз и будет
передаваться как возвращаемое в переменной значение.
Создайте в Delphi новый проект: File > New > Application. На форму поместите компоненты
ComboBox и этикетки Labell и Label2. В качестве значений свойства Items
компонента ComboBox укажите названия месяцев: Январь, Февраль, Март, Апрель,
Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь. Именно так, не Иcкажайте.
Такую программу можно реализовать разными способами. Способ, который мы
применим, предполагает, что месяцы можно вписывать в любом порядке, но сами
названия должны быть написаны с большой буквы без ошибок (чтобы совпадали
с текстом программы). Теперь приступим непосредственно к написанию программы.
Перейдите в Object Inspector на вкладку Events и дважды щелкните мышью на событии
OnChange, чтобы открыть редактирование процедуры ComboBoxlChange.
Из этой процедуры будем вызывать процедуру WhatMonth (именно процедуру, а не
функцию), которой будем сообщать выбранный месяц, а из нее будут возвращаться
два параметра: номер месяца и количество дней в нем. Эти значения будем выводить на Labell и Label2.
Пишем процедуру WhatMonth (ее можно расположить до или после ComboBoxlChange).
Нужно либо вписать ее в класс формы вручную, либо щелкнуть на заголовке процедуры
правой кнопкой мыши и выбрать Complete class at cursor.
Листинг 6.4
procedure TForml.WhatMonth.(s: String; var nm, days: Integer);
// определение номера месяца и количества дней
begin
if з=Январь then begin nm := 1; days := 31; end;
if з=Февраль then begin nm := 2; days := 28; end;
if s=Mapr then begin nm := 3; days := 31; end;
if з=Апрель then begin nm := 4; days := 30; end;
if з=Май then begin nm := 5; days := 31; end;
if з=Июнь then begin nm := 6; days := 30; end;
if з=Июль then begin nm := 7; days := 31; end;
if з=Август then begin nm := 8; days := 31; end;
if з=Сентябрь then begin nm := 9; days := 30; end;
if з=0ктябрь then begin nm := 10; days := 31; end;
if з=Ноябрь then begin nm := 11; days := 30; end;
if з=Декабрь then begin nm := 12; days := 31; end;
end;
Удобнее было бы применить здесь оператор case, но, увы, он не работает с переменными
типа string. Обратите внимание на заголовок процедуры. В нее передается
переменная s. Результат работы процедуры возвращается через переменные
nm и days, поэтому перед ними стоит ключевое слово var.
Процедуру будем вызывать из ComboBoxlChange. Так что подбор количества дней
будет выполняться тогда, когда пользователь поменяет месяц в списке.
Листинг 6.5
procedure TForml.ComboBox1Change(Sender: TObject);
var
k1, K2: Integer;
begin
WhatMonth(ComboBox1.Text,k1,k2);
LabeИ.Caption := Номер месяца в году + IntToStr(kl);
Label2.Caption := Количество дней в этом месяце + lntfoStr(k2);
end;
Значения переменных nm и days в процедуре whatMonth возвращаются в переменные kl и k2.
Можете запустить программу и посмотреть, что все работает: значения подбираются
в процедуре WhatMonth, передаются в ComboBoxlChange и уже оттуда выводятся на экран.
|
|
|