Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Меню

Автор: Katrinka 5.12.2006 23:49

Доброе время суток!
Подскажите пожалуйста, как сделать меню в графическом режиме так, чтобы каждому пункту соответствовал прямоугольник с надписью, и управление осуществлялось бы стрелками, причем при выделении прямоугольника он менял бы цвет? И после выполнения ряда действий, соответствующих пункту, пользователь возращался в меню?

Заранее большое спасибо!


Автор: volvo 6.12.2006 0:36

Ну, тема однозначно переезжает в Задачи, т.к. вопрос - именно по реализации ...

Уточни, что можно использовать в программе? Динамическая память? Объекты? Процедурные типы? Модули?
Есть кое-что готовое, правда там с мышью, модулями и объектами, можно будет убрать все лишнее, если нужно...

Автор: Гость 6.12.2006 19:18

Ну объекты и модули точно использовать нельзя. Процедуры и динамическую память, думаю можно. Мышь тоже можно (даже нужно) если не очень сложно.

P.S.: как перекидывать тему в Задачи?

Автор: volvo 6.12.2006 21:01

Ну, вот первое приближение - мыши пока нет, только с клавиатуры ...


Прикрепленные файлы
Прикрепленный файл  MENU.PAS ( 2.12 килобайт ) Кол-во скачиваний: 340

Автор: Katrinka 7.12.2006 1:05

Volvo, огромное спасибо! Это то, что нужно. Только хотелось бы кнопки друг над другом расположить (Как это сделать?)
И еще в процессе написания возникла проблема: мой паскаль не печатает на русском, все раскладки перепробовала, не работает. Что делать?
Последний ворос: можно ли загрузить в паскаль нестандартные цвета?

Автор: volvo 7.12.2006 1:17

Цитата
хотелось бы кнопки друг над другом расположить (Как это сделать?)
изменить процедуру show_menu на такую:
procedure show_menu(current: integer;
const menu_str: array of string;
const size: integer);
var
i, py, color, max_width: integer;
begin
py := dist;
setcolor(white);
settextjustify(centertext, centertext);

max_width := 0;
for i := 0 to pred(size) do
if textwidth(menu_str[i]) > max_width then
max_width := textwidth(menu_str[i]);

for i := 0 to pred(size) do begin

if (current - 1) = i then color := lightgreen
else color := green;

setfillstyle(solidfill, color);
bar(dist, py,
dist + max_width + 2 * dist,
py + textheight(menu_str[i]) + 2 * dist);
rectangle(dist, py,
dist + max_width + 2 * dist,
py + textheight(menu_str[i]) + 2 * dist);

outtextxy(dist + (max_width + 2 * dist) div 2,
py + (textheight(menu_str[i]) + 2 * dist) div 2,
menu_str[i]);
inc(py, textheight(menu_str[i]) + 3 * dist)

end;
end;
и обрабатывать не кнопки "влево/вправо", а "вверх (#72)/вниз (#80)"...

Цитата
мой паскаль не печатает на русском
Читай вот это:
http://forum.pascal.net.ru/index.php?showtopic=779

Если тебе понадобится в графическом режиме выводить кириллицу (через outtext/outtextxy) - придется добавлять русифицированные шрифты, если надо - дам ссылку, где их можно взять...

Автор: Katrinka 7.12.2006 1:41

Спасибо! Кинь пожалуйста ссылку

Автор: volvo 7.12.2006 1:52

http://pascal.sources.ru/graph/bgirfont.htm

Автор: Katrinka 7.12.2006 3:45

Спасибо!
Пробовала установить руссификаторы keyrus и др. , все равно русским не печатает. Может можно каким-нибудь другим методом установить?

Автор: Katrinka 7.12.2006 23:42

Можно ли сделать так, чтобы при нажатии определенной кнопки меню программа автоматически переходила в текстовый режим, там выполнялась бы определенная функция, и при нажатии пользователем какой-нибудь клавиши он возращался бы в меню? Если да, то как?

Автор: volvo 7.12.2006 23:50

Можно, только зачем? Что, нельзя все в графике сделать?

Если очень надо, конечно, тебе видней - используй RestoreCRTMode для кратковременного перехода в текстовый режим, а потом SetGraphMode(GetGraphMode) для возврата обратно в графический, только учти, что после возврата экран не сохранится, так что придется перерисовать меню...

Автор: Katrinka 8.12.2006 0:11

Посоветуй пожалуйста, как лучше сделать. Задача такая: при нажатии пользователем определенной кнопки программа запрашивает ввод данных, потом запускается функция с этими входными данными(вычисление интеграла) и выводит результат. Можно ли все это сделать в графическом режиме?

Автор: volvo 8.12.2006 0:39

Вот тут я выкладывал процедуру ввода строки в графическом режиме:
http://forum.pascal.net.ru/index.php?s=&showtopic=13890&view=findpost&p=80759
Переконвертировать в число ее можно через Val.

Как вывести результат ты знаешь, для этого существует процедура конвертации числа в строку Str и OutTextXY... Запускать функцию, которая что-то считает, можно как в текстовом, так и в графическом режиме - ей все равно... Вот и все... Что еще не хватает? Ввод есть, вывод тоже, и не надо мудрить с переходами графика/текст... smile.gif

Автор: Katrinka 9.12.2006 1:50

Можно ли загрузить в Паскаль нестандартные шрифты(из Ворда), цвета (RGB) и можно ли вставить картинку? Если да то как?

Автор: volvo 9.12.2006 1:59

Из Word-а шрифты не пойдут... Можно попробовать поискать утилиту конвертации (хотя я не уверен, что таковая имеется, но все может быть) из файлов формата FON/FNT в формат CHR, которые распознаются Паскалем...

Для работы больше чем с 16 цветами нужен Svga256/Vesa256 (поищи по форуму, уже было про эти драйвера)... Насчет картинок - тебе сюда: http://forum.pascal.net.ru/index.php?s=&showtopic=4533&view=findpost&p=38204

Автор: Katrinka 10.12.2006 21:38

Можно ли наряду с кнопками меню рядом нарисовать Window (из модуля CRT) и все процедуры ввода-вывода осуществлять там? Будет ли это работать?

Автор: Алена 10.12.2006 22:04

Нет, нельзя... Window - это процедура текстового режима, Кнопки рисуются в приведенной выше программе в графике. Тебе уже задавали вопрос: "Зачем?" Делай либо ВСЕ в графике, либо ВСЕ в текстовом режиме. Иначе будет такая каша ... wacko.gif

Автор: Гость 12.12.2006 22:13

А как в с++ сделать меню в текстовом режиме?