2010-03-15 11 views
16

कोई समस्या है जहां MyObj.classnameis(TMyClass.classname) सत्य है और TMyClass(MyObj) काम करता है लेकिन (MyObj as TMyclass).doSomething रूपांतरण त्रुटि फेंकता है।का उपयोग कर कास्टिंग (ऑब्जेक्ट के रूप में TClass) और TClass (ऑब्जेक्ट)

मुझे वास्तव में उस जंक के साथ कोई मदद नहीं चाहिए, हालांकि अगर आप इसे टिप्पणियों में रखना चाहते हैं जो सुपर होगा। मैं सिर्फ यह जानना चाहता हूं कि Obj as Class और Class(Obj) के बीच का अंतर क्या है।

+0

यह बहुत सारे टैग हैं। मुझे लगता है कि 'डेल्फी' पर्याप्त होगा। –

+0

समस्या को इंगित करने के लिए धन्यवाद मैं केवल –

+0

इंगित कर रहा था क्या आप डीएलएल का उपयोग करते हैं? डीएलएल गड़बड़ वर्ग पहचान। –

उत्तर

30

एक एएस-कास्ट वास्तविक ऑब्जेक्ट प्रकार की जांच करता है ताकि यह सुनिश्चित किया जा सके कि कास्ट मान्य है, और यदि यह नहीं है तो अपवाद उठाता है। एक "हार्ड कास्ट" (TMyClass(MyObj) शैली) जांच नहीं करता है, यह सिर्फ संकलक को यह मानने के लिए कहता है कि कलाकार मान्य है।

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

"टीएमक्लास =" के लिए एक पूर्ण प्रोजेक्ट सर्च चलाएं, यह देखने के लिए कि आपकी कई घोषणाएं कहां हैं, या फिर कक्षाओं में से किसी एक का नाम बदलें या पूर्ण परिभाषा का उपयोग करें (ओबीजे MyUnit.TMyClass के रूप में) ताकि संकलक आपको पता चलेगा कि आप किस वर्ग ' फिर से करने की कोशिश कर रहे हैं।

+1

इसके अलावा हार्ड कास्ट (बिना किसी के) एक मूल्यांकन/संशोधित और स्क्रीन देखने में बेहतर काम करता है। –

5

मेसन के पोस्ट में जोड़ें: अपने कोड के माध्यम से खोज करने के बजाय, आप उस स्थान पर ऐसी विधि भी कॉल कर सकते हैं जो आपको समस्या देता है।

function GetClassInheritance(Obj : TObject) : string; 
var ClassRef : TClass; 
begin 
    Result := ''; 
    ClassRef := obj.ClassType; 
    Result := ClassRef.ClassName; 
    ClassRef := ClassRef.ClassParent; 
    while assigned(ClassRef) do 
    begin 
    Result := ClassRef.ClassName + '.' + Result; 
    ClassRef := ClassRef.ClassParent; 
    end; 

    Result := '(' + obj.ClassType.UnitName + ')' + Result 
end; 

है कि आप एक स्ट्रिंग के रूप (UnitName) TObject.TPersistent.TComponent .... मैं डेल्फी के पुराने संस्करण में "ClassType.UnitName" देखकर याद नहीं है स्वरूपित वापस आ जाएगी, ताकि हिस्सा नहीं हो सकता है उनके साथ काम करते हैं, लेकिन बाकी चाहिए।

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