![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
HoOope |
![]() ![]()
Сообщение
#1
|
![]() Группа: Пользователи Сообщений: 5 Пол: Женский Реальное имя: ОльКа Репутация: ![]() ![]() ![]() |
Люди-человеки, помогите будной студентки разобраться в проге.
![]() ![]() ![]() Вот задание: 1) разработать интерфейсное меню, состоящее из кнопок вида ромба и квадрата 2)кнопки должны размещаться на панели и иметь объемный вид 3) текущей является кнопка серого цвета, неактивная - зеленая 4) перемещение по кнопкам производиться с помощью клавиш навигации, выбор кнопки-энтер 5) по нажатию каждой кнопки создается эффект вогнутости и выполняется действия: на дополнительную панель внизу экрана вывести задание на лабу; развернуть панель и вернуть ее в исходное состояние; увеличить объемность панели... А вот то, что я намучала: uses crt,graph; Очень жду и надеюсь на Вашу помощь ![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Программы, написанные по технологии Copy+Paste привести в рабочий вид гораздо сложнее, чем написать их заново. Сначала исправь все синтаксические ошибки (у тебя в программе их огромное количество. Где-то лишняя скобка при вызове процедуры; где-то ты забыла указать что процедура - это метод класса, из-за чего получаешь сообщения о неизвестных переменных. Где-то строка не является завершенной, потому что нельзя просто так добавлять в строку апостроф, его надо дублировать:
k[4].t:='ob''emnost''';
, ну а про то, что методов romb и kvt в типе Knopka вообще нет - я уж и не говорю)...В общем, еще раз: это делается во-первых, не копированием кусков текста из одного места в другое, а во-вторых - гораздо проще, чем сделано у тебя. Если хочешь - покажу, как. Но я делать за тебя полностью не буду, если будешь принимать в процессе написания активное участие - тогда начну объяснять... Нет - так нет. |
HoOope |
![]()
Сообщение
#3
|
![]() Группа: Пользователи Сообщений: 5 Пол: Женский Реальное имя: ОльКа Репутация: ![]() ![]() ![]() |
Я очень-очень хочу, чтобы Вы мне объяснили!!!:))))) Просто я выпрасила у одногруппников похожие проги и решила, что переделать я все же смогу, но видемо без помощи у меня мало что вышло=(((
А как можно проще написать? С ромбом можно как-то легче поступить? А вот с квадратиком разве что-то не так: uses crt,graph; |
TarasBer |
![]()
Сообщение
#4
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Крайне не рекомендую использовать FloodFill, есть же процедура FillPoly для рисования закрашенных прямоугольников, вот ей и пользуйтесь.
-------------------- |
maksimla |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 324 Пол: Мужской Реальное имя: maksim Репутация: ![]() ![]() ![]() |
Крайне не рекомендую использовать FloodFill, есть же процедура FillPoly для рисования закрашенных прямоугольников, вот ей и пользуйтесь. можешь обьеснить почему не рекомендуешь использовать FloodFill почему? -------------------- Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
|
HoOope |
![]()
Сообщение
#6
|
![]() Группа: Пользователи Сообщений: 5 Пол: Женский Реальное имя: ОльКа Репутация: ![]() ![]() ![]() |
ДА, почему? ведь с помощью FillPoly так долго все описывать((
|
TarasBer |
![]()
Сообщение
#7
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
ДА, почему? ведь с помощью FillPoly так долго все описывать(( Огромная разница между FloodFill и FillPoly по части скорости и используемой памяти. Не, если хотите, делайте так... Никто не запрешает, только это как-то по-индийски. Зачем заставлять компьютер делать лишние действия, летя в Москву через Владивосток? Если говорить подробнее, то закраска многоугольника, при знании координат его центров, делается из линий очень просто, а уж в случае ромба - просто несколько линейно возрастающих горизонталей провести и всё. В случае же с заливкой необходимо попиксельно закрашивать всю область, при этом выполняя обход для того, чтобы рассчитать зону, ограниченную данными условиями. Обход, как известно, память требует, и делать его, когда необходимая зона и так известна - просто бессмысленно. Сообщение отредактировано: TarasBer - 28.02.2009 20:18 -------------------- |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата А как можно проще написать? С ромбом можно как-то легче поступить? Значит, смотри...Начнем с того, что у тебя невнятно описана цепочка наследования. Давай посмотрим, что у тебя есть: у тебя есть прямоугольная панель, у тебя есть прямоугольная кнопка и ромбовидная кнопка. Есть ли что-то общее между всеми этими сущностями? Есть... Все они однозначно идентифицируются прямоугольником, в котором находятся. Причем как для отрисовки прямоугольной, так и для отрисовки ромбовидной кнопки нужны 4 точки. В связи с чем объекты предлагаю унаследовать так: type
taction = procedure; { <--- Тип - процедура, которую будет выполнять кнопка }
{ Прямоугольный объект, от которого будет наследоваться все остальное }
trect_object = object
xst, yst, xfn, yfn: integer;
constructor init(x_st, y_st, x_fn, y_fn: integer);
end;
ptbutton = ^tbutton;
tbutton = object(trect_object) { Абстрактная кнопка }
caption: string;
action: taction;
constructor init(x_st, y_st, x_fn, y_fn: integer;
s: string; act: taction);
procedure draw(b: boolean); virtual;
procedure press(is_pressed: boolean); virtual;
private
function get_xst: integer; virtual;
function get_yst: integer; virtual;
function get_xfn: integer; virtual;
function get_yfn: integer; virtual;
end;
ptbutton_rect = ^tbutton_rect;
tbutton_rect = object(tbutton) { Прямоугольная кнопка }
constructor init(x_st, y_st, x_fn, y_fn: integer;
s: string; act: taction);
end;
ptbutton_romb = ^tbutton_romb;
tbutton_romb = object(tbutton) { Ромбовидная кнопка }
constructor init(x_st, y_st, x_fn, y_fn: integer;
s: string; act: taction);
private
function get_xst: integer; virtual;
function get_yst: integer; virtual;
function get_xfn: integer; virtual;
function get_yfn: integer; virtual;
end;
tpanel = object(trect_object) { Панель - она тоже прямоугольная, тоже наследник trect_object }
save_x: integer;
buttons_count: integer;
buttons: array[1 .. max_buttons] of ptbutton;
constructor init(x_st, y_st, x_fn, y_fn: integer);
procedure Insert(b: ptbutton);
procedure draw(n: integer);
procedure zoom;
procedure unzoom;
function count: integer;
end;
Попробуй посмотреть на то, что я написал, и подумать, не слишком ли это сложно для тебя. Естественно, я набросал программу, и этот кусок - именно оттуда, эта иерархия работает, причем работает прекрасно. Основная программа выглядит вот так:begin
gdriver := detect;
initgraph(gdriver, gmode, '');
errcode := graphresult;
if errcode <> grOk then begin
writeln('graph error: ', grapherrormsg(errcode));
readln; halt(100);
end;
panel.init(10, 10,
10 + 4 * (btn_width + btn_between) + btn_between,
10 + btn_height + btn_between);
x := btn_between;
panel.insert(new(ptbutton_rect, init(x, btn_between, x + btn_width, 2 * btn_between + btn_height, 'task', actTask)));
inc(x, btn_width + btn_between);
panel.insert(new(ptbutton_romb, init(x, btn_between, x + btn_width, 2 * btn_between + btn_height, 'zoom', actZoom)));
inc(x, btn_width + btn_between);
panel.insert(new(ptbutton_rect, init(x, btn_between, x + btn_width, 2 * btn_between + btn_height, 'unzoom', actUnzoom)));
inc(x, btn_width + btn_between);
panel.insert(new(ptbutton_romb, init(x, btn_between, x + btn_width, 2 * btn_between + btn_height, 'grow', actGrow)));
current := 1;
finished := false;
repeat
panel.draw(current);
ch := readkey;
case ch of
#27: finished := true;
#13:
begin
panel.buttons[current]^.press(true);
panel.buttons[current]^.action;
end;
#0:
case readkey of
#77: if current = panel.count then current := 1 else inc(current);
#75: if current = 1 then current := panel.count else dec(current);
end;
end;
delay(50);
until finished = true;
closegraph;
end.
Как видишь, все очень даже компактно, и вполне в рамках ООП... Так что выбор - за тобой, перекраивать то решение, которое у тебя есть, или написать правильно работающую изначально программу.Цитата Крайне не рекомендую использовать FloodFill, есть же процедура FillPoly для рисования закрашенных прямоугольников, вот ей и пользуйтесь. Я бы не был так категоричен. Для небольших размеров кнопок вполне подойдет и FloodFill (она медлительна при заливке больших поверхностей), а вот при попытке отладить программу в FPC я столкнулся с некорректной работой FillPoly на этом компиляторе, в связи с чем пришлось использовать условную компиляцию при отладке на двух компиляторах, чтоб не изменять программу туда-сюда... Так что не надо заниматься предварительной оптимизацией. "Premature optimization is the root of all evil" (С) Д. Кнут, вообще-то. Сначала надо заставить программу работать в принципе, а уж потом - считать такты и микросекунды, что так любят делать некоторые ![]() Добавлено через 2 мин. P.S. Цитата только это как-то по-индийски Я бы попросил не касаться понятий "индусского кода". Индусы пишут ГОРАЗДО более правильно, чем те, кто ХОЧЕТ представить их слабыми программистами. И у них надо еще поучиться программировать кое-кому. |
HoOope |
![]()
Сообщение
#9
|
![]() Группа: Пользователи Сообщений: 5 Пол: Женский Реальное имя: ОльКа Репутация: ![]() ![]() ![]() |
Да, объем кода и в сравнение не идет, особенно для ООП. То, что в этом решении можно применить cв-во наследования - +, этого нам даже препод не говорил)))) Но вот что ознает этот странный значек
Цитата ptbutton = ^tbutton; и что мы означает вот эта часть Цитата private ????function get_xst: integer; virtual; function get_yst: integer; virtual; function get_xfn: integer; virtual; function get_yfn: integer; virtual; end; |
HoOope |
![]()
Сообщение
#10
|
![]() Группа: Пользователи Сообщений: 5 Пол: Женский Реальное имя: ОльКа Репутация: ![]() ![]() ![]() |
вот код немного другой проги с кнопочками прямоугольниками и кругами
Uses crt,graph; кропочку уменьшения панели можно переделать на увеличение объемности , а перенос - возвращение в прежний режим и как можно написать общие процедурки для ромба и квадрата?? |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 8:14 |