2010-04-20 12 views
6

द्वारा बुलाए गए ईवेंट के दौरान ऑब्जेक्ट को नष्ट करें मेरे पास एक बटन है। इसकी ऑनक्लिक घटना एक प्रक्रिया को कॉल करती है जो बटन को नष्ट कर देती है, लेकिन फिर "थ्रेड" ऑनक्लिक ईवेंट पर वापस लौटना चाहता है और मुझे एक एक्सेस उल्लंघन मिलता है।ऑब्जेक्ट

मैं पूरी तरह से स्टंप हूं!

उत्तर

11

इसके सभी कोड निष्पादित होने के बाद आपको बटन को नष्ट करने की आवश्यकता है। ऐसा करने का मानक तरीका फ़ॉर्म में उपयोगकर्ता द्वारा परिभाषित संदेश पोस्ट करना और फ़ॉर्म को एक संदेश विधि देना है जो इसकी व्याख्या करेगा। उदाहरण के लिए:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

const 
    WM_KILLCONTROL = WM_USER + 1; 

type 

    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    procedure KillControl(var message: TMessage); message WM_KILLCONTROL; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TForm1 } 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    PostMessage(self.Handle, WM_KILLCONTROL, 0, integer(Button1)) 
end; 

procedure TForm1.KillControl(var message: TMessage); 
var 
    control: TControl; 
begin 
    control := TObject(message.LParam) as TControl; 
    assert(control.Owner = self); 
    control.Free; 
end; 

end. 

यह काम करता है क्योंकि संदेश विंडोज संदेश कतार में डाल दिया जाता है और इससे पहले कि यह (क्लिक करें संदेश यह है कि बटन वर्तमान का जवाब सहित) प्रसंस्करण समाप्त हो गया है नहीं सब कुछ जब तक बाहर आता है।

+0

यह अच्छी तरह से काम किया, धन्यवाद! मैंने "SendMessage" करने का प्रयास किया था लेकिन यह काम नहीं किया, इसलिए मैंने इस दृष्टिकोण को छोड़ दिया। "पोस्टमेसेज" चाल चल रही थी! – Pmmlr

+0

@Pmmlr: हाँ। SendMessage संदेश को तत्काल संसाधित करता है, जबकि PostMessage इसे संदेश कतार में पोस्ट करता है, इसलिए उसे प्रोसेसिंग से पहले इसकी बारी का इंतजार करना पड़ता है। –

+4

@ पीएमएमएलआर: यह वैसे ही है जैसा कि 'प्रक्रिया TForm.Release' डेल्फी 1:' पोस्टमेसेज (हैंडल, सीएमजेएलईएएसई, 0, 0) के बाद से कर रही है; 'यह 'प्रक्रिया TForm.CMRelease'' के साथ मिलकर काम करता है जो 'फ्री' करता है ', 'पोस्टमेसेज' और 'SendMessage'' के बीच का अंतर जानना महत्वपूर्ण है: यही कारण है कि यह काम करता है। यह प्रश्न PostMessage को और विस्तार से बताता है: http://stackoverflow.com/questions/2551435/postmessage- ट्यूटोरियल –

0

आप बजाय ऑनक्लिक ईवेंट में टाइमर सक्षम कर सकते हैं, फिर टाइमर को अक्षम करने के लिए पहले टाइमर ईवेंट लिखें और फिर उस प्रक्रिया को कॉल करें जिसे आप वर्तमान में ऑनक्लिक ईवेंट से कॉल कर रहे हैं। टाइमर अक्षम और एक छोटे अंतराल के समय के साथ सेट करें।

संबंधित मुद्दे