Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 10.02.2008, 20:19   #1
Хоб
Новичок
Джуниор
 
Регистрация: 10.02.2008
Сообщений: 1
По умолчанию Pascal, нужна помощь с меню заданной конфигурации

Задание:
Написать модуль, который формирует меню заданной конфигурации с возможностью задания пунктов, уровней вложенности
Башка не варит окончательно, попытка написать самому не удалась, программа компилируется, но вместо рабочего меню вылазит какая-то непотребность... Программы сложнее 'Happy, world' раньше не писал, поэтому надеюсь на чужую помощь - хотя бы просто обьясните в чем я дурак...

Что есть на данный момент:
Код:
uses crt;
type
element=object
public
raskr:boolean;
name:char;
menuopen:integer;
procedure init(num:integer);
end;

menu=object
public
kolvopunktov:integer;
name:string[10];
punkts:array[1..10] of ^element;
procedure initmenu;
end;

var
menus:array[0..100] of ^menu;
kolvosozdmenu:integer;
activemenu:integer;
chooseelem:integer;
i,j:integer;
az:integer;
whichmenu:integer;
mb:menu;

procedure element.init(num:integer);
var
tint:integer;
tbool:boolean;
tstring:string;
ij:char;
begin
write('Введите имя ',num,'го элемента: ');
readln(name);
write('Этот элемент раскрывается (1-да,0-нет): ');
readln(tint);
if tint=1 then raskr:=true;
if tint=0 then raskr:=false;
end;

procedure menu.initmenu;
var
tint:integer;
tbool:boolean;
t:integer;
begin
write('Введите количество пунктов в ',kolvosozdmenu,'м меню (не больше 10ти): ');
readln(kolvopunktov);
for t:=1 to kolvopunktov do begin
new(punkts[t]);
punkts[t]^.init(t);
end;
for t:=1 to kolvopunktov do begin
if punkts[t]^.raskr=true then
begin
kolvosozdmenu:=kolvosozdmenu+1;
punkts[t]^.menuopen:=kolvosozdmenu;
new(menus[kolvosozdmenu]);
menus[kolvosozdmenu]^.initmenu;
end;
end;
end;

procedure menucreation(whichmenu:integer);
var cmenu:char;
{whichmenu:byte;}
point:array[1..10] of string;
spoint:byte;
c,v,b:byte;
begin
spoint:=1;
repeat
clrscr;
for c:=0 to menus[0]^.kolvopunktov do begin
if c=spoint then textcolor(10) else textcolor(15);
writeln(menus[whichmenu]^.punkts[c]^.name);
end;
cmenu:=readkey;
case cmenu of
#72:begin spoint:=spoint-1; if spoint<1 then spoint:=1; end;
#80:begin spoint:=spoint+1; if spoint>menus[whichmenu]^.kolvopunktov then spoint:=menus[whichmenu]^.kolvopunktov; end;
#13:begin
if menus[whichmenu]^.punkts[spoint]^.raskr=true then
whichmenu:=spoint;
menucreation(whichmenu);
end;
#27:begin
if whichmenu>0 then menucreation(whichmenu) else exit;
end;
end;
for c:=1 to menus[whichmenu]^.kolvopunktov do begin
if c=spoint then textcolor(10) else textcolor(15);
writeln(menus[whichmenu]^.punkts[c]^.name);
end;
until false;
end;

procedure mainmenu;
begin
whichmenu:=0;
menucreation(whichmenu);
end;

begin
mb.initmenu;
mainmenu;
end.


PS кроме интернет-форумов надеятся больше не на что, помогите студенту! =(

Последний раз редактировалось Хоб; 10.02.2008 в 20:24.
Хоб вне форума Ответить с цитированием
Старый 12.02.2008, 09:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
надеятся больше не на что, помогите студенту!
Лады, подскажу. Вот один из способов вывода на экран меню и его обработки: Здесь работают стрелочки вверх-вниз. Результат функции номер выбранного элемента меню. Координаты - координаты вывода меню

Код:
uses crt;
var s:string;
function menu(s:string;x,y:integer):integer;
var c:char;res,cnt,ay,w,i:integer;e,k:string;
begin k:=s; gotoxy(x,y);ay:=y;res:=1;c:=' ';cnt:=1;
 repeat
  w:=pos(' ',k)   ;
   e:=copy(k,1,w);
   delete(k,1,w);
   gotoxy(x,ay);

   if res=cnt then begin
    textcolor(white);
    textbackground(red);
   end else begin
    textcolor(white);
    textbackground(blue);
   end;
   write(e);
   if w=0 then
    begin k:=s;ay:=y;cnt:=1; end
   else begin
    ay:=ay+1;inc(cnt);
   end;
   if keypressed then  c:=readkey;
   if c=#80 then begin inc(res);c:=' ';end;
   if c=#72 then begin dec(res);c:=' ';end;
{   gotoxy(1,1);write(res,' ',ord(c));}
 until c=#13;
 menu:=res;
end;

begin
 clrscr;
 s:='first second third fourth 0';
 writeln(menu(s,10,10));

end.
По поводу вложенности, сам придумай какие еще меню вызывать при выборе нужных пунктов, комбинируя этот код
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь с сортировкой односвязных списков на Pascal Lesowik Помощь студентам 2 22.05.2011 05:14
Задача Pascal на массив (нужна помощь) STIG_E70 Помощь студентам 4 18.06.2008 19:19
Нужна помощь Pascal SweetOpium Помощь студентам 13 28.05.2008 17:11
Помощь во время экзамена [Pascal] Crazy Macho Фриланс 4 05.01.2008 13:23


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя