![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Bearly |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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":
Если "выключить" (TControl(Sender) as TPanel).OnMouseDown:=nil;, то после выполнения Free - Панель на форме остаётся, перемещается (см. ControlMouseDown), но не реагирует на вызов контекстного меню. Если не назначть обработчики вновь создаваемому объекту, то Free "работает" как ожидаемо - Панель с формы удаляется и ссылка на неё уничтожается... Вопрос: Как дестроить сначала обработчики событий для объекта, а затем и сам объект (Панель) ? |
|||
|
||||
Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
p
тут Sender это пункт меню N2 а не твоя панель -------------------- Кольцов Виктор Владимирович |
|||
|
||||
Bearly |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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; Ву-а-ля !!! Мож кто лучше предложит ?! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |