Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 09.01.2017
Сообщений: 55
GraphABC

Удаление кнопки ABCButton

25.07.2019, 18:49. Показов 3480. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. В общем, я создал три кнопки:
Pascal
1
2
3
4
5
6
7
8
9
uses GraphABC, ABCObjects, ABCSprites, ABCButtons, timers;
var button:Array[0..2] of ButtonABC;
begin
...
button[0] := ButtonABC.Create(64, 144, 512, 64, 'Кнопка 1', System.Drawing.Color.FromArgb(255, 247, 173, 82));
button[1] := ButtonABC.Create(64, 272, 512, 64, 'Кнопка 2', System.Drawing.Color.FromArgb(255, 247, 173, 82));
button[2] := ButtonABC.Create(64, 400, 512, 64, 'Кнопка 3', System.Drawing.Color.FromArgb(255, 247, 173, 82));
...
end.
В ходе выполнения программы возникла необходимость очистить экран, что я сделал с помощью GraphABC.ClearWindow и цикла:
Pascal
1
2
3
4
5
ClearWindow;
for var i := 0 to ABCObjects.Objects.Count - 1 do
begin
  ABCObjects.Objects[i].Destroy;
end;
Однако, кнопки остались. На просторах Интернета нашёл предложение воспользоваться процедурой Destory:
Pascal
1
2
3
4
for var i := 0 to 2 do
begin
  button[i].Destory;
end;
Вылезла следующая ошибка:
Pascal
1
Неизвестное имя 'Destory'
Пожалуйста, подскажите, как можно удалить или хотя бы скрыть button[0..2]
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.07.2019, 18:49
Ответы с готовыми решениями:

Менять цвет кнопки AbcButton по клику
нужно сделать так, чтобы любая кнопка из массива меняла свой цвет по клику uses GraphABC, ABCButtons; var a: array of ButtonABC; ...

Программное удаление кнопки с формы / Иной вариант "избавления" от кнопки
Собственно нужно удалить кнопку с формы. Например на форме две кнопки и по нажатии одной - вторая удаляется. Вариант с Visible не очень...

Удаление кнопки
Написал прожку,работает да неправильно,удаляет только последнюю кнопку..Подскажите что я не так делаю.Спасибо! Задание Сделать форму,...

8
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
25.07.2019, 18:59
У меня работает без проблем:
Pascal
1
2
3
4
5
6
7
uses ABCButtons, GraphABC;
 
begin
  var b := new ButtonABC(100,100,300,'abc',Color.White);
  Sleep(1000);
  b.Destroy;
end.
Попробуйте, для начала, обновится:
http://pascalabc.net/ssyilki-dlya-skachivaniya
1
1 / 1 / 0
Регистрация: 09.01.2017
Сообщений: 55
25.07.2019, 19:05  [ТС]
Это первое, на что подумал.
Но я сегодня скачал и установил последнюю версию (3.5) PABC.NET с официального сайта.

Проверил исходники модуля ({$ПАПКА_С_PABCNET}/LibSource/ABCButtons.pas), метода Destory действительно нет:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
unit ABCButtons;
 
interface
 
uses GraphABC, ABCObjects, Events, GraphABCHelper;
 
type
  ButtonABC = class(UIElementABC)
  public
    OnClick: procedure;
    OnClickExt: procedure(Sender: ButtonABC);
  protected
    procedure Init(x,y,w,h: integer; txt: string; cl: GraphABC.Color);
    begin
      inherited Init(x,y,w,h,cl);
      TextScale := 0.7;
      TextVisible := True;
      Text := txt;
      OnClick := nil;
      OnClickExt := nil;
      InternalDraw;
    end;
  public
    constructor Create(x,y,w,h: integer; txt: string; cl: GraphABC.Color);
    begin
      Init(x,y,w,h,txt,cl);
      InternalDraw;
    end;
    constructor Create(x,y,w: integer; txt: string; cl: GraphABC.Color);
    begin
      Init(x,y,w,30,txt,cl);
      InternalDraw;
    end;
    procedure Draw(x,y: integer; g: System.Drawing.Graphics); override;
    var z,z1: integer;
    begin
      z := BorderWidth div 2;
      z1 := (BorderWidth-1) div 2;
      SetBrushColor(Color);
      SetPenColor(BorderColor);
      SetPenWidth(BorderWidth);
      RoundRect(x+z,y+z,x+Width-z1,y+Height-z1,10,10,g);
      DrawText(x,y,g);
    end;
  end;
 
///--
procedure __InitModule__;
///--
procedure __FinalizeModule__;
 
implementation
 
var __pressedButton: ButtonABC;
 
type MouseProc = procedure(x,y,mb: integer);
 
var OldOnMouseDown,OldOnMouseUp: MouseProc;
 
procedure ButtonsMouseDown(x,y,mb: integer);
begin
  if mb=1 then
    __pressedButton := ButtonABC(UIElementUnderPoint(x,y));
  if __pressedButton<>nil then
    __pressedButton.MoveOn(1,1)
  else if OldOnMouseDown<>nil then
    OldOnMouseDown(x,y,mb);
end;
 
procedure ButtonsMouseUp(x,y,mb: integer);
var b: ButtonABC;
begin
  if __pressedButton<>nil then
  begin
    __pressedButton.MoveOn(-1,-1);
    __pressedButton := nil;
    b:=ButtonABC(UIElementUnderPoint(x,y));
    if (b<>nil) and (b.OnClick<>nil) then
      b.OnClick;
    if (b<>nil) and (b.OnClickExt<>nil) then
      b.OnClickExt(b);
    if (b=nil) and (OldOnMouseDown<>nil) then
      OldOnMouseUp(x,y,mb);
  end;
end;
 
var __initialized := false;
 
procedure __InitModule;
begin
  __pressedButton := nil;
end;
 
procedure __InitModule__;
begin
  if not __initialized then
  begin
    __initialized := true;
    ABCObjects.__InitModule__;
    GraphABC.__InitModule__;
    __InitModule;
  end;
end;
 
procedure __FinalizeModule__;
begin
  OldOnMouseDown := OnMouseDown;
  OnMouseDown := ButtonsMouseDown;
  OldOnMouseUp := OnMouseUp;
  OnMouseUp := ButtonsMouseUp;   
end;
 
initialization
  __InitModule;
finalization
  __FinalizeModule__;
end.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
25.07.2019, 19:55
Цитата Сообщение от danilasar Посмотреть сообщение
метода Destory действительно нет:
Зато есть наследование. А у ObjectABC этот метод есть.

Приведите полную программу где у вас удаление не срабатывает.

Добавлено через 6 минут
Цитата Сообщение от danilasar Посмотреть сообщение
Проверил исходники модуля ({$ПАПКА_С_PABCNET}/LibSource/ABCButtons.pas)
Кстати, можно было просто зажать Ctrl и тыкнуть на любое имя из ABCButtons (хоть на имя модуля в uses, хоть на имя типа) чтоб открыть этот исходник, в системную папку лезть не обязательно.
1
1 / 1 / 0
Регистрация: 09.01.2017
Сообщений: 55
26.07.2019, 11:54  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
Зато есть наследование. А у ObjectABC этот метод есть.
Да, проверил исходники, действительно есть.
Цитата Сообщение от Sun Serega Посмотреть сообщение
Приведите полную программу где у вас удаление не срабатывает.
main.cpp (базовый файл):
Pascal
1
2
3
4
5
6
7
8
//------------------------------------------------------------------------------
{$include engine/base.pas}
//------------------------------------------------------------------------------
{$include game/main.pas}
begin
  ENGINE_Init(640, 480, 'Test game');
  GAME_Load();
end.
engine/base.pas:
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
30
31
32
33
34
35
uses GraphABC, ABCObjects, ABCSprites, ABCButtons, timers;
var button:Array[0..256] of ButtonABC;
procedure ENGINE_Init(w, h:Integer; c:String);
begin
  GraphABC.SetWindowSize(w, h);
  GraphABC.SetWindowCaption('PABC.NET Game Engine: ' + c);
  GraphABC.SetWindowIsFixedSize(true);
  GraphABC.LockDrawing();
  ABCObjects.LockDrawingObjects();
end;
procedure ENGINE_UpdateScreen();
begin
  Redraw;
  RedrawObjects;
end;
procedure ENGINE_NewScreen();
begin
  ClearWindow;
  for var i := 0 to ABCObjects.Objects.Count - 1 do
  begin
    ABCObjects.Objects[i].Destroy;
  end;
  for var i := 0 to 256 do
  begin
    button[i].Destory;
  end;
  ENGINE_UpdateScreen();
end;
procedure ENGINE_Exit();
begin
  ENGINE_NewScreen();
  GraphABC.UnLockDrawing();
  ABCObjects.UnLockDrawingObjects();
  halt(1);
end;
game/main.pas:
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
var GameTimer := new Timer(99999, procedure -> begin end);
{$include missions.pas}
procedure GAME_Settings();
begin
  //WriteLn('Настройки');
end;
procedure GAME_LoadMenu();
begin
  ENGINE_NewScreen();
  GameTimer.Stop;
  FillWindow('./game/textures/menu-bg.bmp');
  button[0] := new ButtonABC(64, 144, 512, 64, 'Играть', System.Drawing.Color.FromArgb(255, 247, 173, 82));
  button[1] := new ButtonABC(64, 272, 512, 64, 'Настройки', System.Drawing.Color.FromArgb(255, 247, 173, 82));
  button[2] := new ButtonABC(64, 400, 512, 64, 'Выход', System.Drawing.Color.FromArgb(255, 247, 173, 82));
  button[0].OnClick := GAME_Mission1;
  button[1].OnClick := GAME_Settings;
  button[2].OnClick := ENGINE_Exit;
  ENGINE_UpdateScreen();
end;
procedure GAME_Load();
begin
  ENGINE_NewScreen();
  FillWindow('./game/textures/envell-studio.bmp');
  GameTimer := new Timer(1000, GAME_LoadMenu);
  GameTimer.Start;
end;
game/missions.pas:
Pascal
1
2
3
4
5
procedure GAME_Mission1();
begin
  ENGINE_NewScreen();
  FillWindow('./game/textures/m001-bg.bmp');
end;
Добавлено через 26 минут
Цитата Сообщение от Sun Serega Посмотреть сообщение
Pascal
1
2
3
4
5
uses ABCButtons, GraphABC;
begin var b := new ButtonABC(100,100,300,'abc',Color.White);
Sleep(1000);
b.Destroy;
end.
Проверил, у меня также всё сработало без ошибок.
Попробовал приблизить Ваш код к своим условиям:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uses ABCButtons, GraphABC;
var b:Array[0..0] of ButtonABC;
procedure DestoryButton();
begin
  for var i := 0 to 0 do
  begin
    b[i].Destroy;
  end;
end;
procedure CreateButton();
begin
  b[0] := new ButtonABC(100,100,300,'abc',Color.White);
end;
begin
  CreateButton;
  Sleep(1000);
  DestoryButton;
end.
Тоже всё нормально.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
26.07.2019, 12:43
1. Для начала выкиньте нафиг $include. Вы их совершенно не по назначению используете. Для разбития кода на части надо использовать регионы (и для чего то вроде вашего Engine - модули и, может, пространства имён). А с $include вы лишаете себя анализатора код, без которого програмить и отлаживать - как трением палок огонь разводить.

2. Почему вдруг у вашего основного файла - расширение .cpp? Это расширение исходников C++, а у паскаля должно быть .pas .

3. Вы правильно придумали приближать свой код к моему. Вот только надо не тупо вырезать несколько кусков и вставить в отдельный файл. Надо скопировать весь проект в отдельную папку, и из копии потихоньку убирать части кода, пока ошибка не пропадёт. Если ошибка пропала когда вы убрали какую то часть - значит эта часть нужна для воспроизведения и надо пробовать убирать что то другое. Когда уже при убирании любой части кода перестаёт воспроизводится - значит это минимальный код ошибки.

Когда найдёте этот минимальный код - 1. станет понятно как бороться с ошибкой (если имеем минимальный код - знаем список всего что можно убрать чтоб не воспроизводилось) и 2. минимальный код можно (а точнее нужно!) отправить разработчикам в issue. Если действительно писало именно неизвестное имя Destroy - это скорее всего баг компилятора.
1
1 / 1 / 0
Регистрация: 09.01.2017
Сообщений: 55
26.07.2019, 12:54  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
1. Для начала выкиньте нафиг $include. Вы их совершенно не по назначению используете. Для разбития кода на части надо использовать регионы (и для чего то вроде вашего Engine - модули и, может, пространства имён). А с $include вы лишаете себя анализатора код, без которого програмить и отлаживать - как трением палок огонь разводить.
Благодарю за совет, буду пользоваться. Помимо PABC.NET ещё занимаюсь PHP, оттуда пришла привычка всё иклудить.
Цитата Сообщение от Sun Serega Посмотреть сообщение
2. Почему вдруг у вашего основного файла - расширение .cpp? Это расширение исходников C++, а у паскаля должно быть .pas .
Прошу прощения, опечатка. Используется расширение .pas.
------------------
Проблема решилась переустановкой PascalABC.NET, после чего вылезла ошибка:
Pascal
1
base.pas(27) : Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта.
Исправил нехитрой конструкцией:
Pascal
1
2
3
4
    if button[i] <> nil then
    begin
      button[i].Destroy();
    end;
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
26.07.2019, 13:06
Цитата Сообщение от danilasar Посмотреть сообщение
Проблема решилась переустановкой PascalABC.NET
То есть версия была всё же не последняя? Или в смысле паскаль как то криво стоял и исправилось когда вы полностью снесли и перепоставили?

Цитата Сообщение от danilasar Посмотреть сообщение
Благодарю за совет, буду пользоваться
Кстати, раз вы только что обновили - у вас должен быть снипет для регионов (буквально пару дней назад добавили). Напишите в любом месте reg и нажмите Shift+Space.

Полный список снипетов находится в файле:
C:\Program Files (x86)\PascalABC.NET\template.pct
Его и редактировать можно. Только осторожно, этот файл сбрасывается к стандартному при обновлении паскаля, поэтому лучше держать копию если под себя подстраиваете.
1
1 / 1 / 0
Регистрация: 09.01.2017
Сообщений: 55
26.07.2019, 13:17  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
То есть версия была всё же не последняя? Или в смысле паскаль как то криво стоял и исправилось когда вы полностью снесли и перепоставили?
Версия последняя, исправилось, когда полностью снёс PABC.NET и заново поставил скачанным вчера установщиком.
Цитата Сообщение от Sun Serega Посмотреть сообщение
Кстати, раз вы только что обновили - у вас должен быть снипет для регионов (буквально пару дней назад добавили). Напишите в любом месте reg и нажмите Shift+Space.

Полный список снипетов находится в файле:
Code
1
C:\Program Files (x86)\PascalABC.NET\template.pct
Его и редактировать можно. Только осторожно, этот файл сбрасывается к стандартному при обновлении паскаля, поэтому лучше держать копию если под себя подстраиваете.
Да, работает, спасибо, буду пользоваться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2019, 13:17
Помогаю со студенческими работами здесь

Удаление кнопки в qt
написал вот такой код #include &quot;widget.h&quot; #include &quot;ui_widget.h&quot; #include &quot;time.h&quot; // для рандома Widget::Widget(QWidget *parent) :...

Кнопки удаление и изменение
Мне нужно сделать Две кнопки они должны работать через триггеры написанные в phpmyadmin Удаление - удаляет столбец или строку ...

Удаление кнопки из коллекци
Вопрос новичка, подскажите насколько правилен такой код Dim testCollect As New List(Of Button) Dim tekBtn As Button Dim i As Integer ...

Joomla, K2, Удаление кнопки
Всем добрый день! Есть сайт на Joomla, на котором установлено расширение К2. Материалы в категории отображаются с кнопкой...

Удаление кнопки с PropertyGrid
Здравствуйте! Как удалить/скрыть кнопку &quot;Добавить&quot;? Добавление порта реализовано другим способом. Для редактирования ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru