2010-07-29 19 views
5

मैंने 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; 

बदल यह एक त्रुटि संदेश उत्पन्न होगा। यह कैसे हो सकता है ... ???

+5

यदि आप किसी भवन को नष्ट करना चाहते हैं - तो क्या आप ** ** ** ** ** ** के अंदर ** करेंगे? – Alex

+1

आपका पहला प्रश्न डाउनवॉटेड होना बहुत निराशाजनक हो सकता है। क्या यह सवाल वास्तव में "अस्पष्ट या उपयोगी नहीं है"? – mjn

+0

@josef: मेसन का जवाब सही है; आप TForm (Forms.pas में) देख सकते हैं कि यह समान चीजें कैसे करता है; प्रक्रियाओं के लिए रिलीज और सीएमआरलीज, और निरंतर CM_Release की तलाश करें। –

उत्तर

5

बेशक यह उछाल जाता है - यह तब होता है जब आप जिस शाखा पर बैठे हैं उसे काटते हैं।

आप उस नियंत्रण द्वारा उत्पन्न एक ईवेंट हैंडलर के अंदर नियंत्रण को मार नहीं सकते हैं।

ध्यान दें कि आप जिस नमूना से काम कर रहे हैं वह नहीं कस्टमबटन को हटाएं दिनचर्या पर क्लिक करें!

+0

मुझे लगता है कि मुझे पता है कि आपका क्या मतलब है, क्या आप एक छोटी सी लिपि दे सकते हैं, तो मैं बेहतर समझता हूं? –

+0

क्या एक स्क्रिप्ट के लिए? मुद्दा यह है कि आप ऐसा कुछ कर रहे हैं जो नहीं किया जा सकता है, अवधि। इसे सही तरीके से करने के तरीके के लिए मेसन के जवाब को देखें। –

+0

मुझे इसे इस तरह से रखने दें जोसेफ: कृपया फोन बूथ दर्ज करें, फिर जब आप फोन बूथ के अंदर हों, तो कृपया फोन बूथ पर दस टन वजन कम करने का आदेश दें। अब आपको समझ में आता है? –

6

किसी ईवेंट हैंडलर को नियंत्रण के ऑब्जेक्ट पर फ़ंक्शन द्वारा बुलाया जाता है, और ईवेंट हैंडलर खत्म होने के बाद इसे निष्पादित करने के लिए और कोड हो सकता है। यदि आप नियंत्रण हटाते हैं, तो उस ऑब्जेक्ट का संदर्भ देने वाला कोई भी कोड एक्सेस उल्लंघन को बढ़ाने की संभावना है।

आपको क्या करना है के बाद नियंत्रण को हटाने के लिए अपना प्रोग्राम प्राप्त करें यह वर्तमान में चल रहे सभी कोड के साथ किया गया है। इसके लिए, आपको एक संदेश पोस्ट करने की आवश्यकता है। अगर आपको संदेशों के बारे में पता नहीं है, तो यह सीखने का एक अच्छा मौका है।

आपको एक नया संदेश प्रकार आईडी बनाने की आवश्यकता है। WM_USER + 1 काम करना चाहिए। पैराम में से एक को हटाए जाने वाले नियंत्रण का पता होगा। अपने फॉर्म पर एक संदेश हैंडलर सेट करें जो उस संदेश प्रकार को संभालता है और संदेश पैरामीटर में संदर्भित नियंत्रण को मुक्त करता है। और फिर ईवेंट हैंडलर में, इसे पोस्टमेसेज करें जो आपके फॉर्म पर संदेश है। इसे पहुंच उल्लंघन के बिना काम करना चाहिए।

+0

धन्यवाद व्हीलर .. ठीक है, आपका क्या मतलब है "नया संदेश प्रकार आईडी" ?? शायद आप मुझे एक छोटी सी स्क्रिप्ट दे सकते हैं जिसे मैं समझता हूं। –

+0

यदि मैं प्रतिलिपि बनाने और पेस्ट करने के लिए आपके लिए एक कोड नमूना पोस्ट करता हूं, तो आप वास्तव में संदेशों का उपयोग करने के बारे में कुछ भी नहीं सीखेंगे, और फिर आपको पता नहीं चलेगा कि अगली बार एक संदेश पोस्ट करने में क्या करना आसान हो सकता है। यही कारण है कि StackOverflow वास्तव में "कृपया मुझे काम कोड दें" साइट नहीं है। यदि आप इसे देखते हैं तो यह वास्तव में बहुत आसान है, और मैंने आपको शामिल सिद्धांतों को समझने के बाद आपको वह सबकुछ दिया है जिसे आप करेंगे। –

+3

अब मुझे पता है कि इसका मतलब क्या है, मुझे आपका लेख है कि "http://www.cryer.co.uk/brian/delphi/ howto_send_custom_window_message.htm" मैंने और अधिक बहुत कुछ सीखा है ... –

1

यह सोचने में आसान लगता है, जब आप मानते हैं कि माउस बटन/कुंजी को छोड़ने के बाद सिस्टम को किसी भी तरह से बटन को फिर से खींचा जाना चाहिए। चूंकि आप क्लिक के दौरान पहले से ही बटन ऑब्जेक्ट को हटा रहे हैं, यह असफल हो जाएगा।

इसलिए ऑनक्लिक ईवेंट की प्रक्रिया के बाद आपको किसी भी तरह से बटन को हटाने का तरीका खोजने और सफलतापूर्वक समाप्त होने की आवश्यकता है।

+0

तो ... कैसे ??? कोई सलाह?? –

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

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