Авторизироваться
Меню сайта
Категории раздела
Для начинающих [16]
С этих статей вырасли все, кто сейчас программирует на MP. Именно с этих статей надо начинать новичку, качество у них не всегда хорошее, но почитать стоит.
Разбираем.Обьясняем [1]
В этой категории обьясняем, разьясняем библиотеки,примеры,мидлеты и т.д.
Прочее [4]
Прочее, что не касается программирования: как настроить MP, что нужно для работы и др...
Наш опрос
На чем вы хотите создавать игры для телефона?
Всего ответов: 321
Мини-чат
210
Статистика

Онлайн : 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Midlet Pascal » Для начинающих

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

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;  

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

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". И для примера будет код (код на Паскале):

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

begin
  a;
end.

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

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

begin
  a;
end.

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

Code
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;

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

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

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

Code
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 для получения времени. Тут всё очень просто.
Теперь поговорим о параметрах функций и процедур.Некоторым функциям нужны какие нибудь параметры для выполнения, например чтобы решить квадратное уравнение, то функция должна принять три параметра, т.е. числа.

Code
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 и так далее.

Code
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

Категория: Для начинающих | Добавил: 133_Mhz (10.02.2009)
Просмотров: 4338 | Комментарии: 2 | Рейтинг: 5.0/3
Всего комментариев: 1
09.05.2009 в 15:01 Спам
Ага smile
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]