Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление TControl'а, если есть обработчики event, Как удалить динамически созданный объект 
:(
    Опции темы
Bearly
Дата 27.8.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.8.2008

Репутация: нет
Всего: нет



Имеем:
----------
var
  frmSeat: TfrmSeat;
  DragPoint: TPoint;
  FlagMouse: boolean;
  TypeClass: TControlClass;
  New: TControl;

procedure TfrmSeat.FormDblClick(Sender: TObject);
var
 Point: TPoint;
begin
 TypeClass:=TPanel; // Получаем ссылку на выбранный класс
 Inc(No); // увеличиваем счетчик компонент
 New:=TypeClass.Create(frmSeat); // Cоздаем компонент - вызываем конструктор выбранного класса
 Point:=frmSeat.ScreenToClient(Mouse.CursorPos);
 New.Top:=Point.y;
 New.Left:=Point.x;
 New.Width:=40; // Размер по X
 New.Height:=40; // Размер по Y
 New.Name:=New.ClassName + IntToStr(No); // Имя = название класса + номер нового компонента
 New.Tag:=No;
 if TypeClass = TPanel Then
  begin                                                             // <----- Если это кнопка - назначим обработчики
   TPanel(New).PopupMenu:=pmTable; // Навешиваем меню по правой кнопке
   TPanel(New).Caption:='Стол ' + IntToStr(No);
   TPanel(New).OnClick:=OnClickButton;
   TPanel(New).OnMouseDown:=ControlMouseDown;
   TPanel(New).OnMouseMove:=ControlMouseMove;
   TPanel(New).OnMouseUp:=ControlMouseUp;
  end;
 New.Parent:=frmSeat; // И помещаем новенького на форму
end;

procedure TfrmSeat.OnClickButton(Sender: TObject);
Begin // Обработчик нажатия "какбыкнопки"
    MessageDlg('Нажата кнопка '+TControl(Sender).Name ,mtInformation,[mbOk],0);
End;

procedure TfrmSeat.ControlMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 DragPoint:=Point(X , Y);
 FlagMouse:=True;
 ReleaseCapture;  // Код перемещения
 TControl(Sender).Perform(WM_SYSCOMMAND, $F012, 0); // Код перемещения
end;

procedure TfrmSeat.ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 FlagMouse:=False;
end;

procedure TfrmSeat.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 TControl(Sender).Cursor:=crDefault;
end;

<------------------ Вот здесь проблема !!!

procedure TfrmSeat.N2Click(Sender: TObject);
begin // Удалить "какбыкнопку"
 (TControl(Sender) as TPanel).OnMouseDown:=nil;  // <---- вот именно здесь !
 TControl(Sender).Free;
end;

Из Хелпа по "Free":
Цитата

Warning:    Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, don’t free a button, or the form that owns the button, in its OnClick event handler.


Если "выключить" (TControl(Sender) as TPanel).OnMouseDown:=nil;, то после выполнения Free - Панель на форме остаётся, перемещается (см. ControlMouseDown), но не реагирует на вызов контекстного меню.

Если не назначть обработчики вновь создаваемому объекту, то Free "работает" как ожидаемо - Панель с формы удаляется и ссылка на неё уничтожается...

Вопрос: Как дестроить сначала обработчики событий для объекта, а затем и сам объект (Панель) ?
PM MAIL   Вверх
Frees
Дата 27.8.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



p
Код

rocedure TfrmSeat.N2Click(Sender: TObject);
begin // Удалить "какбыкнопку"
 (TControl(Sender) as TPanel).OnMouseDown:=nil;  // <---- вот именно здесь !
 TControl(Sender).Free;
end;

тут Sender это пункт меню N2
а не твоя панель


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Bearly
Дата 27.8.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.8.2008

Репутация: нет
Всего: нет



Тэ-э-экс ! Проблема решена вот так:

private
    pa1:TPanel;                        // Вводим это
    { Private declarations }
  public...........

procedure TfrmSeat.ControlMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 DragPoint:=Point(X , Y);
 FlagMouse:=True;
 pa1:=TPanel(Sender);   <---------- Добавили это......
 ReleaseCapture;  // Код перемещения
 TControl(Sender).Perform(WM_SYSCOMMAND, $F012, 0); // Код перемещения
end;

procedure TfrmSeat.N2Click(Sender: TObject);
begin // Удаляем
 Self.RemoveControl(pa1);
 pa1.Free;
end;

Ву-а-ля !!! Мож кто лучше предложит ?!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.