2011-01-13 13 views
13

में एक घटक वर्ग को प्रतिस्थापित करना मुझे पता है कि मैंने एक मौजूदा वीसीएल घटक जैसे टीबीटन या टीडीआईटी के कस्टम संस्करण को परिभाषित करने के लिए हैक के कहीं कहीं एक उदाहरण देखा है, उसी वर्ग के नाम के साथ और ऐसा करने के लिए कुछ करें डीएफएम स्ट्रीमर मूल के बजाए आपके संस्करण को तुरंत चालू कर देगा। दुर्भाग्यवश, मैं ऐसी परिस्थिति में हूं जहां मुझे ऐसा करने में सक्षम होना चाहिए और मुझे लेखन-पत्र नहीं मिल रहा है। क्या किसी को यह पता है कि इसे पूरा करने के तरीके के बारे में जानकारी कहां मिलती है?डेल्फी

+1

क्या आपने अपने बैग की थैली देखी? http://windwings.wordpress.com/2009/10/07/turbocharging-delphi-2010-2-adding- गतिशील- कार्यक्षमता-to-3rd-parties-the-solution/#comment-1066 ;-) –

+0

@ जोर्न , यही वह उत्तर दिखाता है: http://stackoverflow.com/questions/4685863/replacing-a-component-class-in-delphi/4686920#4686920 –

+1

@ जेरोएन, मुझे पता है ... मुझे बस दिखाने की ज़रूरत है @ मेसन ने "इसे कहीं कहीं देखा"। :-) –

उत्तर

18

अपने फॉर्म में आप तो जैसे ReadState विधि ओवरराइड कर सकते हैं:

type 
    TMyForm = class(TForm) 
    protected 
    procedure ReadState(Reader: TReader); override; 
    end; 

procedure TMyForm.ReadState(Reader: TReader); 
begin 
    Reader.OnFindComponentClass := FindComponentClass; 
    inherited; 
end; 

procedure TMyForm.FindComponentClass(Reader: TReader; const ClassName: string; 
    var ComponentClass: TComponentClass); 
begin 
    if ComponentClass=TButton then begin 
    ComponentClass := TMySuperDuperButton; 
    end else if ComponentClass=TEdit then begin 
    ComponentClass := TMyTotallyAwesomeEdit; 
    end; 
end; 

ऐसा होने की संभावना कई अन्य तरीके हैं, लेकिन यह कैसे मैं यह कर रहा है!

संपादित करें: TReader.GetFieldClass(Instance: TObject; const ClassName: string) का निरीक्षण करना मैसन याद करता है कि हैक का सुझाव देता है। पहली पंक्ति ClassType := Instance.ClassType सेट करती है। तो मुझे संदेह है कि Button1: TButton से Button1: MyUnit.TButton से पैस फ़ाइल में घोषणा को बदलकर आपका बटन बन जाएगा। या शायद हैक MyUnit को अंत में उपयोग खंड में जोड़ने के लिए था ताकि टीबीटन का आपका संस्करण स्कोप में हो। हालांकि, इनमें से कोई भी बहुत व्यावहारिक लगता है।

+0

मुझे गलत किया जा सकता है, लेकिन मैं क्लासनाम के लिए चेक भी जोड़ूंगा, न केवल घटक क्लास। डेल्फी 2 और डेल्फी एक्सई के बीच कुछ बदल गया है;) –

+0

दिलचस्प। मैंने इस संस्करण के बारे में नहीं सुना है, लेकिन यह मेरे लिए काम करने की ज़रूरत के लिए काम कर सकता है। –

+0

@ यूजीन मुझे खेद है, मुझे समझ में नहीं आता कि आपका क्या मतलब है। –

11

मुझे लगता है कि आप जो याद रखने की कोशिश कर रहे हैं वह "interposer class" है: पूर्वजों के नाम का उपसर्ग करके पूर्वजों के समान नाम देने वाली कक्षा को विरासत में मिलाकर। चूंकि वर्ग का नाम नहीं बदला गया है, इसलिए डीएफएम स्ट्रीमिंग तंत्र परेशान नहीं है। केवल यूनिट को प्रभावित करेगा, जिस वर्ग को फिर से घोषित किया जाता है, जब तक कि इसे एक अलग इकाई में नहीं रखा जाता है और उस इकाई को बेस क्लास के बाद उपयोग अनुभाग में शामिल किया जाता है। जाहिर है, आप एक interposed वर्ग में संपत्ति प्रकाशित नहीं कर सकते हैं।

type 
    TButton = class(stdctrls.TButton) 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

    TForm1 = class(TForm) 
    Button1: TButton; 
    [...] 
    private 
+0

हाँ, यही वह है जो मैं सोच रहा था। लेकिन समस्या का समाधान करने के लिए डेविड का समाधान अधिक प्रभावी साबित हुआ। –

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

  • कोई संबंधित समस्या नहीं^_^