में एक घटक वर्ग को प्रतिस्थापित करना मुझे पता है कि मैंने एक मौजूदा वीसीएल घटक जैसे टीबीटन या टीडीआईटी के कस्टम संस्करण को परिभाषित करने के लिए हैक के कहीं कहीं एक उदाहरण देखा है, उसी वर्ग के नाम के साथ और ऐसा करने के लिए कुछ करें डीएफएम स्ट्रीमर मूल के बजाए आपके संस्करण को तुरंत चालू कर देगा। दुर्भाग्यवश, मैं ऐसी परिस्थिति में हूं जहां मुझे ऐसा करने में सक्षम होना चाहिए और मुझे लेखन-पत्र नहीं मिल रहा है। क्या किसी को यह पता है कि इसे पूरा करने के तरीके के बारे में जानकारी कहां मिलती है?डेल्फी
डेल्फी
उत्तर
अपने फॉर्म में आप तो जैसे 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
को अंत में उपयोग खंड में जोड़ने के लिए था ताकि टीबीटन का आपका संस्करण स्कोप में हो। हालांकि, इनमें से कोई भी बहुत व्यावहारिक लगता है।
मुझे गलत किया जा सकता है, लेकिन मैं क्लासनाम के लिए चेक भी जोड़ूंगा, न केवल घटक क्लास। डेल्फी 2 और डेल्फी एक्सई के बीच कुछ बदल गया है;) –
दिलचस्प। मैंने इस संस्करण के बारे में नहीं सुना है, लेकिन यह मेरे लिए काम करने की ज़रूरत के लिए काम कर सकता है। –
@ यूजीन मुझे खेद है, मुझे समझ में नहीं आता कि आपका क्या मतलब है। –
मुझे लगता है कि आप जो याद रखने की कोशिश कर रहे हैं वह "interposer class" है: पूर्वजों के नाम का उपसर्ग करके पूर्वजों के समान नाम देने वाली कक्षा को विरासत में मिलाकर। चूंकि वर्ग का नाम नहीं बदला गया है, इसलिए डीएफएम स्ट्रीमिंग तंत्र परेशान नहीं है। केवल यूनिट को प्रभावित करेगा, जिस वर्ग को फिर से घोषित किया जाता है, जब तक कि इसे एक अलग इकाई में नहीं रखा जाता है और उस इकाई को बेस क्लास के बाद उपयोग अनुभाग में शामिल किया जाता है। जाहिर है, आप एक interposed वर्ग में संपत्ति प्रकाशित नहीं कर सकते हैं।
type
TButton = class(stdctrls.TButton)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
TForm1 = class(TForm)
Button1: TButton;
[...]
private
हाँ, यही वह है जो मैं सोच रहा था। लेकिन समस्या का समाधान करने के लिए डेविड का समाधान अधिक प्रभावी साबित हुआ। –
क्या आपने अपने बैग की थैली देखी? http://windwings.wordpress.com/2009/10/07/turbocharging-delphi-2010-2-adding- गतिशील- कार्यक्षमता-to-3rd-parties-the-solution/#comment-1066 ;-) –
@ जोर्न , यही वह उत्तर दिखाता है: http://stackoverflow.com/questions/4685863/replacing-a-component-class-in-delphi/4686920#4686920 –
@ जेरोएन, मुझे पता है ... मुझे बस दिखाने की ज़रूरत है @ मेसन ने "इसे कहीं कहीं देखा"। :-) –