2013-02-07 36 views
8

मैं अपने वर्ग का नाम स्ट्रिंग, which has been asked about before के रूप में एक फॉर्म बनाना चाहता हूं, लेकिन GetClass पर कॉल करने के बजाय, मैं डेल्फी की नई आरटीटीआई सुविधा का उपयोग करना चाहता हूं।मैं अपनी कक्षा को अपने TRttiType से कैसे चालू करूं?

इस कोड के साथ, मुझे TRttiType मिल गया है, लेकिन मुझे नहीं पता कि इसे कैसे चालू किया जाए।

var 
    f:TFormBase; 
    ctx:TRttiContext; 
    lType:TRttiType; 
begin 
    ctx := TRttiContext.Create; 
    for lType in ctx.GetTypes do 
    begin 
    if lType.Name = 'TFormFormulirPendaftaran' then 
    begin 
     //how to instantiate lType here? 
     Break; 
    end; 
    end; 
end; 

मैंने बिना किसी किस्मत के lType.NewInstance भी कोशिश की है।

उत्तर

9

आपको TRttiType को TRttiInstanceType कक्षा में डालना होगा और फिर GetMethod फ़ंक्शन का उपयोग करके निर्माता को आमंत्रित करना होगा।

इस नमूने

var 
    ctx:TRttiContext; 
    lType:TRttiType; 
    t : TRttiInstanceType; 
    f : TValue; 
begin 
    ctx := TRttiContext.Create; 
    lType:= ctx.FindType('UnitName.TFormFormulirPendaftaran'); 
    if lType<>nil then 
    begin 
    t:=lType.AsInstance; 
    f:= t.GetMethod('Create').Invoke(t.MetaclassType,[nil]); 
    t.GetMethod('Show').Invoke(f,[]); 
    end; 
end; 
+0

एक बार जब आप फॉर्म ऑब्जेक्ट को तुरंत चालू कर देते हैं, तो आपको अपनी 'शो()' विधि को कॉल करने के लिए अब आरटीटीआई का उपयोग करने की आवश्यकता नहीं है। बस इसे सामान्य रूप से कॉल करें: 'एफ। शो;' –

+0

@ रेमीलेबेउ, इस नमूना एफ पर एक टीवील्यू है, बेशक ओपी एक टीएफओएम हेल्पर वैरिएबल पेश कर सकता है या सिर्फ टीवीएयू को टॉर्म पर डाला जा सकता है जैसे कि 'टीएफओएम (एफ.एएसओब्जेक्ट) .how; ' – RRUZ

+0

क्षमा करें, मैंने यह नहीं देखा कि' f' एक 'टीवीएयू' था, जब मैंने देखा तो मैं निओको के कोड को देख रहा था। –

4

आप मैन्युअल रूप से हालांकि TRttiContext.GetTypes() सूची के माध्यम से पाशन के बजाय TRttiContext.FindType() विधि का उपयोग करना चाहिए, जैसे प्रयास करें: एक बार आप TRttiType के लिए ढूँढ़ लेते हैं,

lType := ctx.FindType('ScopeName.UnitName.TFormFormulirPendaftaran'); 
if lType <> nil then 
begin 
    ... 
end; 

लेकिन किसी भी तरह से वांछित वर्ग प्रकार, आप इसे इस तरह तत्काल कर सकते हैं:

type 
    TFormBaseClass = class of TFormBase; 

f := TFormBaseClass(GetTypeData(lType.Handle)^.ClassType).Create(TheDesiredOwnerHere); 

या यह, TFormBaseTForm से प्राप्त होता है, तो:

f := TFormClass(GetTypeData(lType.Handle)^.ClassType).Create(TheDesiredOwnerHere); 

या यह, TFormBaseTCustomForm से प्राप्त होता है, तो:

f := TCustomFormClass(GetTypeData(lType.Handle)^.ClassType).Create(TheDesiredOwnerHere); 

अद्यतन: या, @RRUZ की तरह यह कर दिखाया। यह TRttiType-केंद्रित है, और पुराने TypInfo इकाई से फ़ंक्शंस का उपयोग करने पर भरोसा नहीं करता है।