Пятница, 26.04.2024, 09:00

Delphi

Приветствую Вас Гость

Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня были:
Самые активные пользователи

Меню сайта
Категории каталога
Основы [8]
Исходники [2]
Наш опрос
Чему уделять больше внимания?
Всего ответов: 64
Главная » Статьи » MIDletPascal » Основы

Использование процедур и функций.
Итак, сегодня мы научимся тому, как использовать процедуры и функции в МР.
Начнем с процедур.
Что такое процедура? Процедура - это ограниченый кусок кода, который выполняет какое-либо действие.
Для чего нужна процедура? Пусть, например, одна процедура будет служить для реализации игры, другая будет для реализации меню игры, которая будет вызывать процедуру самой игры. Надеюсь что смысл понятен.
Чтобы объявить процедуру, используют зарезервированое слово procedure.
Синтаксис процедуры такой (код на Паскаль):
procedure имя_процедуры ([входящие параметры]);
Раздел объявления переменных;
begin
Операторы;
end;

Для примера напишем процедуру вывода времени:

procedure time_text;
var time: integer;
  text: string;
begin
  time:=getCurrentTime;
  text:='Time: '+getHour(time)+':'+getMinute(time);
  drawText(text,0,10);
  repaint;
  delay(5000);
end; 


Вот вам пример процедуры, выводящая на экран текущее время. Ну чтобы вывести это всё на экран, процедуру нужно вызвать. Как это сделать? А вот как (код на Паскаль):

program runtime;
procedure time_text;
var time: integer;
  text: string;
begin
  time:=getCurrentTime;
  text:='Time: '+getHour(time)+':'+getMinute(time);
  drawText(text,0,10);
  repaint;
  delay(5000);
end;
begin
  time_text;
end.




В этом примере главная программа вызывает процедуру time_text. Ну о работе вывода времени на экран думаю, что вам не придется.
И вот что самое главное в объявлении процедур - процедура всегда должна стоять выше главной программы, но никак не после неё. Иначе будет ошибка компиляции.
Если 1-ая процедура будет вызывать 2-ую процедуру, то 2-ая процедура должна стоять выше 1-ой.
Для примера обозначим первую процедуру буквой "a", а вторую процедуру - буквой "b". И для примера будет код (код на Паскале):

program example_procedure;
procedure b;
begin
  . . . . .
end;
procedure a;
begin
  . . . . . . .
  b;
  . . . . . . .
end;

begin
  a;
end.


Здесь главная программа вызывает процедуру "а", а та в свою очередь вызывает процедуру "b". 
Бывает так, что процедура стоящая выше, должна вызвать процедуру ниже. В таком случае нужно использовать опережающие процедуры. Для этого после строки объявления процедур нужно вставить зарезервированое слово forward. Это слово показывает программе что процедура находится где то в конце программы.
Вот тот же пример но с опережающей процедурой: 

program example_procedure;
{опережающая процедура}
procedure a; forward;
procedure b;
begin
  if (какое либо событие) then a; // вызываем процедуру "а"
  . . . . .
end;
procedure a;
begin
  . . . . . . .
  b;
  . . . . . . .
end;

begin
  a;
end.

Возможно кто то из вас сталкивался с такой проблемой, как реализацией меню с в котором используются подменю. Например, те кто хотел сделать шпоргалки на экзамен, где как раз нужна подкатегория определеной тематики. Для примера напишем небольшую программку, которая будет иметь меню с подкатегориями:

Program example;
var ok,clicked: command;

Procedure menu; forward;
Procedure menu1; forward;
{square}
procedure square;
begin
ShowCanvas;
while true do begin
setColor(random(255),random(255),random(255));
DrawRect(random(getWidth),random(getHeight),random(getWidth),random(getHeight));
repaint;
if getkeyclicked=ke_key0 then begin break; menu1; end;
end; 
{подменю}
procedure menu1;
var p:array[0..2] of integer;
begin
ShowForm;
ShowMenu('Menu');
p[0]:=menuAppendString('Квадратики');
p[1]:=menuAppendString('На главную');
p[2]:=menuAppendString('Выход');
Ok:=createCommand('ok',cm_ok,0);
AddCommand(ok);
repeat
Delay(100);
Clicked:=getClickedCommand;
until clicked=ok;
If menuGetSelectedIndex = p[0] then square;
If menuGetSelectedIndex = p[1] then menu;
If menuGetSelectedIndex = p[2] then halt;
menu1;
end; 
{главное меню}
procedure menu;
var p:array[0..1] of integer;
begin
ShowForm;
ShowMenu('Menu');
p[0]:=menuAppendString('Подменю');
p[1]:=menuAppendString('Выход');
Ok:=createCommand('ok',cm_ok,0);
AddCommand(ok);
repeat
Delay(100);
Clicked:=getClickedCommand;
until clicked=ok;
If menuGetSelectedIndex = p[0] then menu1;
If menuGetSelectedIndex = p[1] then halt;
menu;
end; 
{главная программа}
Begin
Menu;
End.




Если это всё скомпилировать и запустить на эмуляторе, то появится главное меню из двух пунктов: "подменю" и "выход". 
Если выбрать первое, то появится подменю с пунктами: "квадратики","в главное меню" и "выход". Если так же выбрать первое, то мы увидим как экран будет заполнять разноцветные прямоугольники, если выбрать второй пункт, то процедура вызовет опережающаю процедуру "menu" и мы увидим главное меню. Вот так вот работает этот пример, и на основе этого можно написать какую нибудь шпоргалку на экзамен, ну...если повезет, то получить за списаный ответ с вашей шпоргалки хорошую оценку.

Функции


Теперь поговорим о функциях.
Функция - это тоже такой же участок кода. В отличии от процедур, функция может возвращать какое либо значение.
Чтобы объявить функцию, используют зарезервированое слово function. 
Синтаксис функции такой:

function имя_функции[(список параметров)]: тип_возвращаемого_значения;
begin
  операторы;
end;


Для понимания напишем небольшой пример функции, которая будет возвращать текущее время:

function getTime: string; // возвращаемое значение в виде строки
var time: integer;
begin
  time:=getCurrentTime;
getTime:=''+getHour(time)+':'+getMinute(time)+getSecond(time);
end;


Вот вам простой пример функции, возвращающей текущее время оформленой в виде строки. Теперь для наглядности работы функции можно написать такой код:

program example;
function getTime: string; // возвращаемое значение в виде строки
var time: integer;
begin
  time:=getCurrentTime;
getTime:=''+getHour(time)+':'+getMinute(time)+getSecond(time);
end;
begin
repeat
delay(500);
drawText(getTime,3,10);
repaint;
until getKeyClicked=ke_key5;
end.


Здесь процедура DrawText использует нашу функцию getTime для получения времени. Тут всё очень просто.
Теперь поговорим о параметрах функций и процедур.Некоторым функциям нужны какие нибудь параметры для выполнения, например чтобы решить квадратное уравнение, то функция должна принять три параметра, т.е. числа.


function getSqText(a,b,c: real):string;
var d,x1,x2: real;
begin
d:=sqr(b)-4*a*c; // дескременант...
x1:=(-b)-sqrt(d)/2*a;
x2:=(-b)+sqrt(d)/2*a;
getSqText:='Дескременант '+d+' корень1 '+x1+' корень2 '+x2;
end;


Запрос функции можно так же отобразить через DrawText.

........
DrawText(getSqText(2,6,4),2,10);
........

В процедурах так же можно использовать входящие параметры.
Так же можно сделать и такое действие. Допустим функция получает параметр равное одному, то функция возвращает например модель телефона, если - 2, то версию MIDP и так далее.


program parametr;
function info(v: integer):string;
begin
If v=0 then info:=getProperty('microedition.platform');
If v=1 then info:=getProperty('microedition.encoding');
If v=2 then info:=getProperty('microedition.locale');
If v=3 then info:=getProperty('microedition.profiles');
If v=4 then info:=getProperty('microedition.configuration');
end;
begin
drawText(info(0),0,0);
drawText(info(1),0,12);
drawText(info(2),0,24);
drawText(info(3),0,36);
drawText(info(4),0,48);
repaint;
delay(10000);
End.


Автор статьи: 133 Mhz, http://mobilepascal.ucoz.ru/

Категория: Основы | Добавил: Ivin3152 (24.11.2009)
Просмотров: 3087 | Рейтинг: 0.0/0 |