Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 12
1

ABCButtons и импровизированные окна GraphABC

29.06.2015, 18:16. Показов 3627. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть меню из ABCButtons. Есть импровизированное окно GraphABC с кнопками ABCButtons, которое запускается при выборе одного из пунктов. Проблема в том, что кнопки меню накладываются поверх окна.

Код
uses ABCButtons, GraphABC, ABCObjects;
var
  GN: string;
  w,h,btn1: integer;
  ifs: boolean;
  mm: Picture;
  NewGW: RectangleABC;

procedure init;
  begin
    GN:='Space Program';
    w:=640;
    h:=480;
    ifs:=true;
    SetWindowCaption (GN);
    SetWindowSize(w,h);
    CenterWindow;
    SetWindowIsFixedSize(ifs);
  end;

procedure NGWS;
  begin
    NewGW:=new RectangleABC(100,100,440,200);
    NewGW.Text:='ВНИМАНИЕ!';
    var BtnNext:= new ButtonABC(120,250,150,40,'Продолжить',clMoneyGreen);
    var BtnBack:= new ButtonABC(370,250,150,40,'Назад',clMoneyGreen);
  end;
  
procedure GameMenu; forward;
  
procedure NGW;
  begin
    Btn1:=1;
    GameMenu;
  end;
  
procedure GameMenu;
  begin
    mm:=Picture.Create(640,480);
    mm.Load('data/images/mm.bmp');
    mm.Draw(0,0);
    var BtnNewGame:= new ButtonABC(220, 200, 200, 50, 'Новая игра', clMoneyGreen);
    BtnNewGame.OnClick:=NGW;
    var BtnContinium:= new ButtonABC(220, 260, 200, 50, 'Продолжить', clMoneyGreen);
    var BtnSetting:= new ButtonABC(220, 320, 200, 50, 'Настройки', clMoneyGreen);
    var BtnExit:= new ButtonABC(220, 380, 200, 50, 'Выход', clMoneyGreen);
    if Btn1=1 then
      begin
        BtnNewGame.Visible:=false;
        BtnContinium.Visible:=false;
        BtnSetting.Visible:=false;
        BtnExit.Visible:=False;
        NGWS;
      end;
  end;

begin
  init;
  GameMenu
end.
Пытался решить проблему делая кнопки невидимыми, но это не работает.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2015, 18:16
Ответы с готовыми решениями:

Как убирать текст в модулях GraphABC, ABCButtons?
Как убирать текст в модули GraphABC, ABCButtons. Заранее спасибо

Graphabc. Очистка окна
Проблема в том что в graphabc модуле writeln после очистки окна не пишет с самого начала окна...

Убрать AlwaysOnTop у окна GraphABC
Окошко GraphABC - если его не сворачивает - все закрывает. Как это убрать?

Проверка размера окна в GraphABC
Есть переменная Size:integer; она равна стороне окна - окно квадратное. В цикле проверка: if...

10
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.06.2015, 18:33 2
Без файла data/images/mm.bmp программу не запустить и нельзя посмотреть и поправить.
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 12
29.06.2015, 18:50  [ТС] 3
без файла

Код
uses ABCButtons, GraphABC, ABCObjects;
var
  GN: string;
  w,h,btn1: integer;
  ifs: boolean;
  NewGW: RectangleABC;
 
procedure init;
  begin
    GN:='Space Program';
    w:=640;
    h:=480;
    ifs:=true;
    SetWindowCaption (GN);
    SetWindowSize(w,h);
    CenterWindow;
    SetWindowIsFixedSize(ifs);
  end;
 
procedure NGWS;
  begin
    NewGW:=new RectangleABC(100,100,440,200);
    NewGW.Text:='ВНИМАНИЕ!';
    var BtnNext:= new ButtonABC(120,250,150,40,'Продолжить',clMoneyGreen);
    var BtnBack:= new ButtonABC(370,250,150,40,'Назад',clMoneyGreen);
  end;
  
procedure GameMenu; forward;
  
procedure NGW;
  begin
    Btn1:=1;
    GameMenu;
  end;
  
procedure GameMenu;
  begin
    var BtnNewGame:= new ButtonABC(220, 200, 200, 50, 'Новая игра', clMoneyGreen);
    BtnNewGame.OnClick:=NGW;
    var BtnContinium:= new ButtonABC(220, 260, 200, 50, 'Продолжить', clMoneyGreen);
    var BtnSetting:= new ButtonABC(220, 320, 200, 50, 'Настройки', clMoneyGreen);
    var BtnExit:= new ButtonABC(220, 380, 200, 50, 'Выход', clMoneyGreen);
    if Btn1=1 then
      begin
        BtnNewGame.Visible:=false;
        BtnContinium.Visible:=false;
        BtnSetting.Visible:=false;
        BtnExit.Visible:=False;
        NGWS;
      end;
  end;
 
begin
  init;
  GameMenu
end.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.06.2015, 19:02 4
А если например так.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure init;
  begin
    GN:='Space Program';
    w:=730;
    h:=600;
    Window.Center;
    ifs:=true;
    SetWindowCaption (GN);
    SetWindowSize(w,h);
    CenterWindow;
    SetWindowIsFixedSize(ifs);
  end;
..............................................
procedure GameMenu;
  begin
    var BtnNewGame:= new ButtonABC(20, 520, 150, 50, 'Новая игра', clMoneyGreen);
    BtnNewGame.OnClick:=NGW;
    var BtnContinium:= new ButtonABC(200, 520, 150, 50, 'Продолжить', clMoneyGreen);
    var BtnSetting:= new ButtonABC(380, 520, 150, 50, 'Настройки', clMoneyGreen);
    var BtnExit:= new ButtonABC(560, 520, 150, 50, 'Выход', clMoneyGreen);
    if Btn1=1 then
      begin
        BtnNewGame.Visible:=false;
        BtnContinium.Visible:=false;
        BtnSetting.Visible:=false;
        BtnExit.Visible:=False;
        NGWS;
      end;
  end;
И вообще поиграться с размерами окна, положением и размерами кнопок.
1
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 12
29.06.2015, 19:09  [ТС] 5
ладно, раз уж проблема обычным способом не решается, буду так выкручиваться. Всё равно игра для себя
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.06.2015, 19:10 6
А Вы хотите вообще убирать ненужные кнопки?
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 12
29.06.2015, 19:26  [ТС] 7
было бы неплохо, но дестой у меня тоже не работает
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.06.2015, 19:33 8
Убрать так
Pascal
1
BtnNewGame.Destroy;
У меня работает.
1
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 12
29.06.2015, 19:49  [ТС] 9
тогда попробую скачать версию поновее.
0
20 / 20 / 16
Регистрация: 21.01.2015
Сообщений: 51
29.06.2015, 20:40 10
Кнопки не будут удаляться.
Поверх существующих четырех кнопок, которые уже созданы, ты создаешь ещё четверку таких же кнопок, а потом сразу же их удаляешь.

Добавлено через 4 минуты
Почему бы кнопки не вынести в глобальные переменные?
1
12 / 12 / 10
Регистрация: 24.06.2015
Сообщений: 83
30.06.2015, 10:21 11
Лучший ответ Сообщение было отмечено Masterildar как решение

Решение

У Вас проблема в том, что при вызове GameMenu у вас создаются локальные кнопки. После выполнения GameMenu, наверное, Вы теряете к ним доступ и Вы никак уже не можете получить доступ к ним из кода. При срабатывании OnClick Вы создаёте новые кнопки и тут же их скрываете.
Вам нужно:
1. Сделать кнопки глобальными
2. Не создавать их заново, а только один раз при создании меню.
Варианты:
1. Разнести обработку кнопок и их создание в разные процедуры (сделать их глобальными в любом случае).
2. Сделать защиту от повторного создания кнопок (проверять перед созданием, что они не существуют).

Код:
1. В раздел глобальных переменных добавить:
Pascal
1
BtnContinium, BtnSetting, BtnExit, BtnNewGame: ButtonABC;
2. В GameMenu заменить код создания кнопок на:
Pascal
1
2
3
4
5
6
7
if BtnNewGame=nil then begin
 BtnNewGame:= new ButtonABC(220, 200, 200, 50, 'Новая игра', clMoneyGreen);
 BtnNewGame.OnClick:=NGW;
end;
if BtnContinium=nil then BtnContinium:= new ButtonABC(220, 260, 200, 50, 'Продолжить', clMoneyGreen);
if BtnSetting=nil then BtnSetting:= new ButtonABC(220, 320, 200, 50, 'Настройки', clMoneyGreen);
if BtnExit=nil then BtnExit:= new ButtonABC(220, 380, 200, 50, 'Выход', clMoneyGreen);
Добавлено через 18 минут
Puporev, кстати, вопрос: в PascalABC.Net есть сборщик мусора. Если присвоить BtnNewGame:= nil; сборщик мусора его удалит. Если вызвать Destroy мы также его удалим (принудительно из кода). Какой способ лучше? Какой больше удаляет?
Что интересно, при присваивании nil объект и все его свойства пропадают. Но он не пропадает с экрана (т.к. уже отрисован). А при Destroy все свойства остаются, но с экрана кнопка пропадает.

Добавлено через 17 минут
А почему бы Вам в самой процедуре NGW не написать?
Pascal
1
2
3
4
5
BtnNewGame.Visible:=false;
BtnContinium.Visible:=false;
BtnSetting.Visible:=false;
BtnExit.Visible:=False;
NGWS;
А то вызываете GameMenu, вводите некую Btn1, впихнуть в NGW выглядит более логичным.
1
30.06.2015, 10:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2015, 10:21
Помогаю со студенческими работами здесь

Переполнение окна вывода graphABC
Пишу программу в Pascal ABC.Net Так как в одном из модулей нужно будет использовать графику,...

Два окна uses crt и graphABC
При применении двух модулей crt и graphABC, после компиляции программы, появляются два окна. Можно...

Каков начальный размер окна GraphABC?
Каков Начальный размер окна GraphABC?

Как совместить окна CRT и GraphABC?
Здравствуйте. Я пишу плеер. У меня есть проблема с кодом который я написал в Pascal ABC и переношу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru