Почему моя программа падает, когда я уничтожаю кнопку в собственном обработчике OnClick? - PullRequest
5 голосов
/ 29 июля 2010

Я попробовал скрипт с веб-сайта, на котором я запускаю http://www.delphi -central.com / runtime.aspx и успешно.


private
  { Private declarations }
  procedure CustomButtonClick(Sender: TObject);

procedure TForm1.AddNewButtonClick(Sender: TObject);
var
  NewButton : TButton;
begin 
  NewButton := TButton.create(self);

  with NewButton do
  begin
    Top    := 30;
    Width  := 60;
    Left   := Width * (self.ControlCount-2);
    Parent := self;
    OnClick := CustomButtonClick;
    Caption := 'Button '+ inttostr (self.ControlCount-2);
  end;  //With
end;

procedure TForm1.DeleteLastButtonClick(Sender: TObject);
begin
  if Self.ControlCount>2 then
    TButton (Controls[ControlCount-1]).destroy;
end;

procedure TForm1.CustomButtonClick(Sender: TObject); 
begin    
    ShowMessage(TButton(Sender).caption + ' Pressed'); 
end;

Но если я изменю OnClick,

OnClick := CustomButtonClick; ==> OnClick := DeleteLastButtonClick;

выдаст сообщение об ошибке.Как такое могло произойти ...???

Ответы [ 3 ]

6 голосов
/ 29 июля 2010

Обработчик события вызывается функцией объекта элемента управления, и он может иметь больше кода для выполнения после завершения обработчика события.Если вы удаляете элемент управления, то любой код, который ссылается на этот объект, может вызвать нарушение прав доступа.

Что вам нужно сделать, это заставить вашу программу удалить элемент управления после того, как это сделано свесь код, который он сейчас выполняет.Для этого вам необходимо опубликовать сообщение.Если вы не знаете о сообщениях, это хорошая возможность для изучения.

Вам необходимо создать новый идентификатор типа сообщения.WM_USER + 1 должно работать.Одним из параметров будет адрес удаляемого элемента управления.Установите обработчик сообщений в своей форме, который обрабатывает этот тип сообщения и освобождает элемент управления, указанный в параметре сообщения.А затем в обработчике событий отправьте PostMessage это сообщение в вашу форму.Это должно работать, не вызывая нарушений доступа.

5 голосов
/ 29 июля 2010

Конечно, это бум - вот что может случиться, когда вы отрежете ветку, на которой сидите.

Вы не можете уничтожить элемент управления внутри обработчика событий, порожденного этим элементом управления.

Обратите внимание, что образец, с которым вы работаете, НЕ указывает CustomButtonClick на процедуру удаления!

1 голос
/ 29 июля 2010

Легко подумать, увидеть причину, когда вы считаете, что система должна каким-то образом перерисовать кнопку после того, как вы отпустите кнопку / клавишу мыши.Поскольку вы удаляете объект кнопки уже во время щелчка, это не удастся.

Следовательно, вам нужно найти способ каким-либо образом удалить кнопку после того, как обработка события onClick произошла и успешно завершилась.

...