Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2021, 11:46   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию Удаление динамических компонентов

Кулити! есть панель, на ней кнопка (3шт), на одну из них панель должна убиваться, не долго думая написал
Код:

 TSoundPanel = record
    myPanel: tpanel;
    myBtnPlay: tbutton;
    myBtnPause: tbutton;
    myBtnDel: tbutton;
    myLbl: tlabel;
    mypb: TProgressBar;
    fName: string;

. . .

 musics: array of TSoundPanel;
. . .

 if tpanel(tbutton(Sender).Parent).Hint = 'music' then
  begin
      ind := strtoint(tbutton(Sender).Hint); // в хинте хранится индекс массива
      musics[ind].myPanel.Free;                 // убираю панель
      musics[ind].fName := 'nill';                // записываю имя файла как "nill" что бы не удалять элемент массива
  end;
дальше начинается то что не могу понять.. если нажать на кнопку мышкой, то получаю ошибку "Access violation", после чего панель таки пропадает, но если TAB-ом выберу кнопку и нажму пробел, то панель пропадет, но ошибки не будет. подскажите как избавиться от ошибки при нажатии мышкой
PTyTb32 вне форума Ответить с цитированием
Старый 17.06.2021, 13:18   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

а если ...
Код:
      musics[ind].myPanel.Free;                 // убираю панель
      musics[ind].myPanel:=nil;
      musics[ind].fName := 'nill';                // записываю имя файла как "nill" что бы не удалять элемент массива
P.S. вряд ли
смотри https://programmersforum.ru/showthre...highlight=free
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.06.2021 в 13:25.
evg_m вне форума Ответить с цитированием
Старый 17.06.2021, 13:47   #3
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
P.S. вряд ли
да, так не сработает, я нашел решение, и оно помогло, но я все равно не понимаю как так получается, почему на мышку возникает ошибка, а на клавиатуру нет.
PTyTb32 вне форума Ответить с цитированием
Старый 17.06.2021, 13:56   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Можно предположить, что при нажатии мышкой возникает цепочка событий. В одном из этих событий удаляется панель, но следом срабатывает другое для уже удаленной панели.
Arigato вне форума Ответить с цитированием
Старый 17.06.2021, 14:11   #5
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
срабатывает другое для уже удаленной панели.
да в модуле control
Код:
with FTouchManager do
          if (GestureEngine <> nil) and (efMouseEvents in GestureEngine.Flags) then
            GestureEngine.Notification(Message);
ошибка возникает на второй строке, а проверка эта вызывается постоянно пока мышь над формой (с разными параметрами в зависимости от компонента под курсором)
PTyTb32 вне форума Ответить с цитированием
Старый 17.06.2021, 14:32   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

А если сначала удалить те события, из-за которых возникают ошибки, а после сам компонент?
Arigato вне форума Ответить с цитированием
Старый 17.06.2021, 14:34   #7
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Arigato, телепортировать мышь в другое место? не уверен что такое решение правильно
PTyTb32 вне форума Ответить с цитированием
Старый 17.06.2021, 14:40   #8
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

я это сделал так
Код:
uses
 . . .

 const
  WM_DELCONTROL=WM_USER+100;


type

 . . .
 public
     procedure WMDELCONTROL(var MSg: TMessage); message WM_DELCONTROL;

. . .

procedure TForm1.WMDELCONTROL(var MSg: TMessage);
begin
  TControl(Msg.WParam).Parent.RemoveControl(TControl(Msg.WParam));
  TObject(Msg.WParam).Free;
end;

procedure TForm1.btn_DeleteClick(Sender: TObject);
var
  ind: Integer;
begin
 if tpanel(tbutton(Sender).Parent).Hint = 'music' then
  begin
      ind := strtoint(tbutton(Sender).Hint);
      musics[ind].fName := 'nill';
      PostMessage(Form1.Handle,WM_DELCONTROL,Integer(musics[ind].myPanel as TControl),0);
  end;
end;
PTyTb32 вне форума Ответить с цитированием
Старый 17.06.2021, 17:33   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
телепортировать мышь в другое место?
Просто присвоить событиям nil. К примеру: Button1.OnClick := nil;
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переопределение WndProc для динамических компонентов timao C++ Builder 6 26.11.2013 02:21
Удаление динамических объектов / полная очистка формы 095 Общие вопросы Delphi 3 23.04.2012 16:09
удаление динамических массивов Dimarik Общие вопросы C/C++ 20 14.03.2011 12:30
Удаление динамических объектов Jetro Общие вопросы Delphi 13 14.12.2010 16:39
чтение из ini динамических компонентов varelik Общие вопросы Delphi 2 03.09.2009 17:35