Помощь - Поиск - Пользователи - Календарь
Полная версия: меню с кнопо4ками, вроде даже ООП
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
HoOpe
задание:
1) разработать интерфейсное меню, состоящее из кнопок вида ромба и квадрата
2)кнопки должны размещаться на панели и иметь объемный вид
3) текущей является кнопка серого цвета, неактивная - зеленая
4) перемещение по кнопкам производиться с помощью клавиш навигации, выбор кнопка-энтер
5) по нажатию каждой кнопки создается эффект вогнутости и выполняется действия:
на дополнительную панель внизу экрана вывести задание на лабу;
развернуть панель и вернуть ее в исходное состояние;
увеличить объемность панели...

uses crt,graph;
type 
 
knopka=object
	cz,cl,w,h,x1,y1,r1,r2,x2,y2:integer;ac:boolean;
  procedure init(x0,y0,x4,y4,cli,cza:integer;act:boolean);
  procedure init2(x0,y0,rx,ry,cli,cza:integer;act:boolean);
  procedure draw1;
  procedure draw2;
  procedure draw_dawn;
  procedure draw_up;
	end;
panel=object(knopka)
  procedure initp(x00,y00,x44,y44,cl0,cz0:integer);
  procedure drawp;
	end;
 
  procedure knopka.init;
	begin
	  x1:=x0;y1:=y0;x2:=x4;y2:=y4;cl:=cli;cz:=cza;ac:=act;
	end;
  procedure knopka.init2;
	begin
	  x1:=x0;y1:=y0;r1:=rx;r2:=ry;cz:=cza;cl:=cli;act:=ac;
	end;
  procedure knopka.draw1; {моя кнопо4ка-квадрат}
	begin
	  setcolor(2);
	  if ac=true then begin
		setfillstyle(1,8);
		setcolor(15);line(x1-1,y1,x2+1,y1);line(x1,y1+2,x1,y2);
		setcolor(0);line(x1+1,y2,x2,y2);line(x2,y1+1,x2,y2);
		setcolor(7);line(x1+3,y2-3,x2-3,y2-3);line(x2-3,y1+3,x2-3,y2-3);
		bar(x1+2,y1+2,x2-3,y2-3);
	  end 
	  else  begin 
		setfillstyle(1,2); 
		setcolor(15);line(x1-1,y1,x2+1,y1);line(x1,y1+2,x1,y2);
		setcolor(0);line(x1+1,y2,x2,y2);line(x2,y1+1,x2,y2);
		setcolor(7);line(x1+3,y2-3,x2-3,y2-3);line(x2-3,y1+3,x2-3,y2-3);
		bar(x1+2,y1+2,x2-3,y2-3);
	  end;
   end;
  procedure knopka.draw_dawn;
	begin
	  setfillstyle(1,2);
	  setcolor(8);line(x1,y1,x2,y1);line(x1,y1+3,x1,y2);
	  setcolor(15);line(x1+3,y2,x2,y2);line(x2,y1+3,x2,y2-3);
	  setcolor(7);line(x1+3,y1+3,x2-3,y1+3);line(x1+3,y1+3,x1+3,y2-3);
	  bar(x1+4,y1+4,x2-3,y2-3);delay(5000);
	end;
  
 
 
 
procedure knopka.draw2;{а вот тут должна быть кнопка-ромб}
begin
setcolor(2);
if ac=true
then begin
setfillstyle(1,8);
setcolor(15);line(x2--1,(y2-y1) div 2,(x2-x1) div 2-1,y1);line(x2,(y2-y1) div 2+2,(x2-x1) div 2,y2);
setcolor(0);line((x2-x1) div 2+1,y2,x2,(y2-y1) div 2);line(x2,y2+1,x2,(y2-y1) div 2);
setcolor(7);line((x2-x1) div 2+3,y2-3,x2-3,(y2-y1) div 2-3);line(x2-3,y2+3,x2-3,(y2-y1) div 2-3);
  setcolor(12);
end else begin
setfillstyle(1,2);
setcolor(15);line(x2-1,(y2-y1) div 2,(x2-x1) div 2-1,y1);line(x2,(y2-y1) div 2+2,(x2-x1) div 2,y2);
setcolor(0);line((x2-x1)div 2+1,y2,x2,(y2-y1) div 2);line(x2,y2+1,x2,(y2-y1) div 2);
setcolor(7);line((x2-x1)div 2+3,y2-3,x2-3,(y2-y1) div 2-3);line(x2-3,y2+3,x2-3,(y2-y1) div 2-3);
end;end;
procedure knopka.draw_up;
begin
setfillstyle(1,2);
delay(5000);
end;
 
 
  procedure panel.initp;
   begin
	 x1:=x00;y1:=y00;x2:=x44;y2:=y44;cz:=cz0;cl:=cl0;
	end;
  procedure panel.drawp;
	begin
	  setfillstyle(1,cz);
	  setlinestyle(0,2,3);setcolor(2);rectangle(x1,y1,x2,y2);
	  floodfill(x1+5,y1+5,2);
	 end;
 
var 
  a:array[1..3] of knopka;v:array[1..3,1..3] of real;
  p,c:panel;
  chk:char;i,j,k,z:byte;
  m:byte;gd,gm:integer;tt:string;f:text;
begin
  gd:=detect;
  initgraph(gd,gm,'d:\bp\bgi');
  cleardevice;
  setbkcolor(1);
  p.initp(120,10,560,80,4,blue);
  p.drawp;
  a[1].init(140,30,190,70,15,green,false);
  a[2].init2(280,50,25,20,15,green,false);
  a[3].init(490,30,540,70,15,green,false);
  a[1].ac:=true;
  m:=1;z:=2;
	 repeat
	 setbkcolor(0);
	 cleardevice;
	 p.drawp;
	 for i:=1 to 4 do 
	 begin
	   if m=i then a[i].ac:=true
		  else a[i].ac:=false;
	   if (i=1) or (i=3) then a[i].draw1 
		   else a[i].draw2;
	  end;
  chk:=readkey;
  case chk of
#77:if (m=4) then m:=1 else m:=m+1;
#75:if (m=1) then m:=4 else m:=m-1;
#13:begin if (m=1) or (m=3) then a[m].draw_dawn 
		 else a[m].draw_up;
case m of
1:begin {должна увеличивать объем}
   cleardevice;
   setbkcolor(1);
   p.initp(120,10,560,80,4,blue);
   p.drawp;
   a[1].init(140,30,190,70,15,green,false);
   a[2].init2(280,50,25,20,15,green,false);
   a[3].init(490,30,540,70,15,green,false);
   a[1].ac:=true;m:=1;
   end;
2:begin{открывает файл с заданием}
   c.initp(120,120,450,250,4,blue);
   c.drawp;
   assign(f,'d:\cs.txt');
   reset(f);j:=0;
   while not eof(f) do
	 begin
	 readln(f,tt);outtextxy(125,125+j,tt);
	 j:=j+10;
	 end;
   close(f);delay(65000);readkey;
   end;
3:begin {разварачивает}
   if (z mod 2)=0 then 
   begin
   p.initp(1,1,640,480,4,blue);
   a[1].ac:=true; 
   p.drawp;a[1].init(140,30,190,70,15,green,false);
   a[2].init2(280,50,25,20,15,green,false);
   a[3].init(490,30,540,70,15,green,false);
   z:=z+1; 
   end
  else 
  begin 
  p.initp(120,10,560,80,4,blue);
  p.drawp;a[1].init(140,30,190,70,15,green,false);
  a[2].init2(280,50,25,20,15,green,false);
  a[3].init(490,30,540,70,15,green,false);
  z:=z+1;
  a[1].ac:=true; 
  end;end;
end;
end;end;
until chk=#27;end.


результат:
черный фон с красивой панелькой с 2-мя квадратными кнопками;
работает только третья кнопка, которая разворачивает и сворачивает панель; с объемом траблы ужасные; с файлом тоже не оч хорошо;
а ромбик, т.е. ромбовидную кнопку, не видно вообще...

необходима:
помощь программиста (задание интересное, но доделать у меня его не получается); очень хочется доделать ЭТО и желательно правильно =))

ЖДУ. НАДЕЮСЬ. ВЕРЮ.
volvo
Цитата
а ромбик, т.е. ромбовидную кнопку, не видно вообще...
Скажи спасибо, что хоть что-то видно, запусти программу с {$R+} первой строкой, она у тебя вообще вылетит:
Цитата
     for i:=1 to 4 do
     begin
       if m=i then a[i].ac:=true
       else a[i].ac:=false;
В то время, как в массиве A заявлено всего 3 элемента. А обращаясь к четвертому, ты портишь другие данные...

P.S. Насколько я помню, эта тема уже поднималась тобой же? Вот тут: кнопки-объекты. Откуда возникает 2 вопроса:

1) Почему не продолжила программу в том стиле, в котором я тебе показывал, а опять пошла своим путем? (тогда зачем спрашиваешь, если потом не хочешь разбираться, и опять все на том же месте? Писать готовое на сдачу здесь мало кто будет, не нужно оно никому, мороки больно много, сиди, отлаживай, тестируй, а ты потом берешь, все перечеркиваешь, говоришь "Я не поняла, буду делать по-другому". Ну, так делай по-своему, зачем вот эта часть высказывания:
Цитата
очень хочется доделать ЭТО и желательно правильно =))
? Правильно было, в той теме, на которую я дал ссылку, и что потом было, в последнем посте, напомнить? ...)

2) Зачем создала второй профиль?
HoOpe
Да, поднималась когда-то, но до конца программка по требованиям не работала, вот я и решила вспомнить.)))

Подскажите, пожалуйста, как прописать правильно ромбик для моей задачки, чтоб его видно было и что исправить для того, чтобы первая кнопочка-квадратик все таки увеличивала объемность панельки...
volvo
Ну, вторая попытка предложить тебе правильное решение:
Нажмите для просмотра прикрепленного файла
(файл лежал у меня на компьютере с 28-го февраля, сейчас в течении двух минут добавил "увеличение объемности панельки". На разные {$ifdef}-ы не обращай внимания, я пишу на FPC, поэтому приходится добавлять. Должно компилироваться и с ними Турбо Паскалем.)
HoOpe
volvo, спасибо большое, но решение должно быть без конструкторов и всяких там привайтов-мы их не учили...
что делать?

volvo
Цитата
решение должно быть без конструкторов и всяких там привайтов-мы их не учили...
что делать?
Поменять преподавателей... ООП без конструкторов - это как автомобиль без двигателя. В принципе, бывает, но на фиг он нужен?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.