Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
5 / 5 / 0
Регистрация: 25.12.2010
Сообщений: 34

Удалить кнопку из ее же обработчика OnClick

03.05.2013, 00:29. Показов 3165. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
описал свой тип с компонентами button и checkbox

Delphi
1
2
3
4
5
type
   TTest = record    
    check:TCheckBox;
    btnDel:TButton;
    end;
создал массив
Tst:array of TTest ;

добалвяю в массив:

Delphi
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
SetLength(Tst,1);
with Tst[0] do
begin
    check:=TCheckBox.Create(ListBox2); //чекбокс кидаю на листбокс2
    with check do
    begin
    Color:=Alphas[n].Color;
    Checked:=true;
    OnClick:=Check_ChanelVisibleClick;
    Width:=13;
    Height:=13;
    Parent:=ListBox2;
    end;
 
    btnDel:=TButton.Create(ListBox2); 
    with btnDel do
    begin
    Caption:='x';
    Hint:='Удалить';
    ShowHint:=True;
    Width:=16;
    Height:=16;
    Font.Style:=[fsBold];
    OnClick:=Button_alphasDelClick;
    Parent:=ListBox2;
    Tag:=n; //по тегу определим номер в массиве
    end;
и далее при нажатии на созданную кнопку btnDel такой код:
Delphi
1
2
3
tst[0].btnDel.Free; //удаляем кнопку
tst[0].check.Free; //удаляем чекбокс
setLength( Tst, 0); // уменьшаем массив
и вот после выполнения кода удаления, появляется ошибка Access violation at addrress...
подскажите пожалуйста как правильно удалять?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.05.2013, 00:29
Ответы с готовыми решениями:

Выход из обработчика onclick
Добрый день! У меня есть примерно такой код в С++ builder: void __fastcall TForm1::Button1Click(TObject *Sender) { while(1)...

Валидация формы из обработчика onclick
Почему не работает даный код? <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> ...

<input> вызов onclick-обработчика по нажатию enter
Требуется чтобы когда фокус на кнопке, вызывалась/лись функция/и, привязанная/ые к onclick &lt;input id=&quot;button&quot;...

7
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
03.05.2013, 00:46
Ну подумайте сами, вы в обработчике нажатия кнопки удаляете ее же. Когда отрабатывает обработчик, управление возвращается в код класса, которого уже нет. Используйте очередь сообщений и функцию PostMessage.
0
angstrom
03.05.2013, 00:49
Delphi
1
check:=TCheckBox.Create(ListBox2); //чекбокс кидаю на листбокс2
CheckListBox не устраивает?
5 / 5 / 0
Регистрация: 25.12.2010
Сообщений: 34
03.05.2013, 00:52  [ТС]
quwy, а можно пожалуйста пример?
кстати попробовал на форму кнопку кинул и уничтожил её из самой себя,всё норм сработало.

я еще видел в инете типы в которых объявляются кострукторы и деструкторы. но у мя только таким способом как выше получилось сделать, да и то вот уничтожить не могу..

Добавлено через 1 минуту
angstrom, не устраивает. это сюда кинул для примера что тут он один,а так массив будет из неизвестного количества,и еще в этом типе несколько переменных с числами.
да и от кнопки то чеклистбоксом не избавишься..
я уже так делал отдельно создал массив чекбоксов,кнопок, но что-то гдето неудобсвто возникло в работе с ними,и переписал в такой вариант,все в одной группе как бы, но единственное что осталось теперь это корректно уничтожить компоненты в массиве
0
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
03.05.2013, 00:57
Цитата Сообщение от Snake22 Посмотреть сообщение
quwy, а можно пожалуйста пример?
кстати попробовал на форму кнопку кинул и уничтожил её из самой себя,всё норм сработало
Пример не дам, потому что пишу с планшета, читайте справку по ключевому слову message. А удаление у вас сработало только потому, что уничтоженний из самого себя TButton все еще оставался в памяти сразу после вызова деструктора. Но это не гарантированно всегда будет так, к тому же в вашем случае ему помогает бысрее покинуть этот мир удаление элемента массива, где он базировался при жизни.
0
angstrom
03.05.2013, 01:22
Перепутан порядок удаления. Сначала удали все контролы из массива, а кнопку в последнюю очередь.
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Button_alphasDelClick(Sender: TObject);
begin
  tst[0].check.Free;    // удаляем чекбокс
...
// удаляем остальные контролы
...
  tst[0].btnDel.Free;   // удаляем кнопку
  SetLength(Tst, 0);    // уменьшаем массив
end;
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
03.05.2013, 01:31
Snake22, специально для такого случая в Дельфи придумано сообщение: CM_RELEASE. То есть, тебе придется чуть-чуть доработать свой класс кнопки:
Delphi
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
type
  TMyButton = class(TButton)
    procedure DoRelease(var Msg: TMessage); message CM_RELEASE;
  end;
  TTest = record
    check:TCheckBox;
    btnDel:TMyButton;
  end;
 
 
// Это - обработчик ее нажатия
procedure TForm1.Button_alphasDelClick(Sender: TObject);
begin
  PostMessage((Sender as TMyButton).handle, CM_RELEASE, 0, 0);
end;
 
 
// А это - обработчик сообщения CM_RELEASE
{ TMyButton }
procedure TMyButton.DoRelease(var Msg: TMessage);
begin
  tst[Tag].btnDel.Free; //удаляем кнопку, подразумевается TMyButton.Tag
  tst[Tag].check.Free; //удаляем чекбокс
  setLength(Tst, 0); // уменьшаем массив, хотя это неверно, здесь не надо уменьшать
end;
Почему нельзя уменьшать длину массива: подумай, что будет, если у тебя несколько кнопок, и ты нажмешь ту, что в середине. Даже setLength(Tst, length(tst) - 1) в таком случае не сделаешь, это сработает только при нажатии последней созданной кнопки.
1
5 / 5 / 0
Регистрация: 25.12.2010
Сообщений: 34
03.05.2013, 01:50  [ТС]
UI, спасибо.
насчёт setLength, там перед уменьшением массива у меня ещё процедурка перетасовки есть, (прост тут не указал чтоб не загромождать сообщение), которая сместит всё начиная от удаляемого элемента на 1,и тем самым место удаляемого элемента в массиве займёт следующий за ним,а последний освободившийся уберется с помощью setlength
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2013, 01:50
Помогаю со студенческими работами здесь

Создание обработчика события Onclick с дополнительными парметрами
Всем привет. Есть дочерний класс от TPanel. И для него потребовалось создать обработчик OnClick с дополнительным параметром. Что-то...

Программное создание обработчика события OnClick для button
Иметься кнопка, которая создается самим пользователем Код создания кнопки: public void CreateButton() { LinearLayout...

2 обработчика на 1 кнопку
нужно повесить 2 разных обработчика событий на 1 кнопку, возможно ли это и если да, то как?

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

OnClick в кнопку для popup
Здравствуйте! Есть кнопка в которую требуется вставить onclick из плагина (wp) видом: onclick=&quot;return...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru