2010-07-29 36 views
5

我試過一個腳本,我從一個網站運行 http://www.delphi-central.com/runtime.aspx併成功。當我在自己的OnClick處理程序中銷燬按鈕時,爲什麼我的程序崩潰?


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; 

它會產生一個錯誤信息。 這怎麼可能發生......?

+5

如果你想摧毀一座建築物 - 你會**在**或** **以外的地方嗎? – Alex 2010-07-29 13:06:21

+1

讓你的第一個問題變得不合時宜,可能會讓你很沮喪。這個問題真的「不清楚或沒用」嗎? – mjn 2010-07-29 17:26:03

+0

@約瑟夫:梅森的回答是對的,你可以看看TForm(在Forms.pas中)它是如何做類似的事情的;查找程序Release和CMRelease,以及常量CM_Release。 – 2010-07-29 18:58:46

回答

5

當然,它發展迅速 - 這是當你切斷你正在坐的分支時可能發生的事情。

您不能殺死該控件產生的事件處理函數內的控件。

請注意,您正在使用的示例是而不是指向CustomButtonClick的刪除例程!

+0

我想我知道你的意思,你可以給一個小腳本,讓我更好理解? – 2010-07-29 14:51:27

+0

什麼腳本?問題在於你正在做一些無法完成的事情,這段時間。看看梅森的答案,以便正確地做到這一點。 – 2010-07-30 00:18:09

+0

讓我以這種方式把它給你吧約瑟夫:請進入一個電話亭,然後當你在電話亭內時,請下令讓電話亭上重10噸。現在你明白了嗎? – 2010-07-30 13:07:56

6

事件處理程序由控件對象上的函數調用,並且事件處理程序完成後可以執行更多代碼。如果您刪除該控件,則引用該對象的任何代碼都可能引發訪問衝突。

你需要做的是讓你的程序刪除控制它完成了它所有的代碼,它正在運行。爲此,您需要發佈消息。如果你不瞭解消息,這是一個很好的學習機會。

您需要創建一個新的消息類型ID。 WM_USER + 1應該可以工作。其中一個參數將是要刪除的控件的地址。在處理該消息類型的表單上設置一個消息處理程序,並釋放消息參數中引用的控件。然後在事件處理程序中,將PostMessage消息發送到您的表單。這應該不會導致訪問違規。

+0

謝謝惠勒.. 好吧,你是什麼意思「新消息類型ID」?也許你可以給我一個我更懂的腳本。 – 2010-07-29 15:02:47

+0

如果我只是發佈一個代碼示例供您複製和粘貼,您實際上不會了解有關使用消息的任何信息,然後在下次發佈消息時可能會派上用場,您不知道該做什麼。這就是爲什麼StackOverflow真的不是「請給我工作代碼」網站。如果你仔細查看它,這真的很簡單,而且我知道你所瞭解的所有原理後,你就會知道你所需要的一切。 – 2010-07-29 15:11:06

+3

現在我知道你的意思了,我收到一篇關於你的意思的文章「http://www.cryer.co.uk/brian/delphi/howto_send_custom_window_message.htm」 我學到了更多 非常感謝...... – 2010-07-29 16:49:24

1

當您釋放鼠標按鈕/鍵後,系統必須以某種方式重新繪製按鈕時,很容易想到看到原因。由於您在點擊過程中已經刪除了按鈕對象,因此這會失敗。

因此,您需要找到一種方式來在onClick事件處理髮生併成功完成後以某種方式刪除該按鈕。

+0

那麼...怎麼?任何建議? – 2010-07-29 15:04:41

相關問題