इसके सभी कोड निष्पादित होने के बाद आपको बटन को नष्ट करने की आवश्यकता है। ऐसा करने का मानक तरीका फ़ॉर्म में उपयोगकर्ता द्वारा परिभाषित संदेश पोस्ट करना और फ़ॉर्म को एक संदेश विधि देना है जो इसकी व्याख्या करेगा। उदाहरण के लिए:
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.
यह काम करता है क्योंकि संदेश विंडोज संदेश कतार में डाल दिया जाता है और इससे पहले कि यह (क्लिक करें संदेश यह है कि बटन वर्तमान का जवाब सहित) प्रसंस्करण समाप्त हो गया है नहीं सब कुछ जब तक बाहर आता है।
स्रोत
2010-04-20 17:09:01
यह अच्छी तरह से काम किया, धन्यवाद! मैंने "SendMessage" करने का प्रयास किया था लेकिन यह काम नहीं किया, इसलिए मैंने इस दृष्टिकोण को छोड़ दिया। "पोस्टमेसेज" चाल चल रही थी! – Pmmlr
@Pmmlr: हाँ। SendMessage संदेश को तत्काल संसाधित करता है, जबकि PostMessage इसे संदेश कतार में पोस्ट करता है, इसलिए उसे प्रोसेसिंग से पहले इसकी बारी का इंतजार करना पड़ता है। –
@ पीएमएमएलआर: यह वैसे ही है जैसा कि 'प्रक्रिया TForm.Release' डेल्फी 1:' पोस्टमेसेज (हैंडल, सीएमजेएलईएएसई, 0, 0) के बाद से कर रही है; 'यह 'प्रक्रिया TForm.CMRelease'' के साथ मिलकर काम करता है जो 'फ्री' करता है ', 'पोस्टमेसेज' और 'SendMessage'' के बीच का अंतर जानना महत्वपूर्ण है: यही कारण है कि यह काम करता है। यह प्रश्न PostMessage को और विस्तार से बताता है: http://stackoverflow.com/questions/2551435/postmessage- ट्यूटोरियल –