2016-03-23 8 views
6

मैं यह पता लगाने की कोशिश कर रहा हूं कि डेल्फी की बढ़ी हुई आरटीटीआई सुविधाओं के समान चीजें करने का कोई तरीका है या नहीं।फ्रीपास्कल आरटीटीआई। क्या विधि का आह्वान करने का कोई तरीका है?

जहां तक ​​मुझे पता है कि एफपीसी आरटीटीआई फीचर्स प्रदान नहीं करता है जो डेल्फी 2010 से डेल्फी में दिखाई देता है। लेकिन मैं रनटाइम के दौरान कुछ चाल करने के लिए कुछ रास्ता ढूंढना चाहता हूं।

पांचवें वेतन आयोग में typinfo इकाई का उपयोग मैं रूप में इस तरह कर सकते हैं:

  • प्राप्त वस्तु प्रकाशित संपत्ति सूची - typinfo इकाई से getPropList के माध्यम से;
  • ऑब्जेक्ट की प्रकाशित संपत्ति का मूल्य/सेट मान - GetPropValue(...): Variant/SetPropValue(...Value: Variant) के माध्यम से;
  • प्रकाशित विधि प्राप्त करें - MethodAddres के माध्यम से;

लेकिन मैं जैसे कार्य करने के लिए एक रास्ता नहीं मिला है:

  • कॉल तरीकों;
  • कॉल कन्स्ट्रक्टर, या ऑब्जेक्ट्स बनाएं;

अद्यतन: कंस्ट्रक्टर्स के साथ समस्या यह बहुत तरीकों से एक की तरह है - मैं इसे में विभिन्न पैरामीटर पारित करने के लिए एक तरह से करना चाहते हैं:

// concept of code 
type 

TClass = class of TObject; 

TMyClass1 = class 
    public 
    constructor Create(Param1: Integer; Param2: string); override; 
    end; 

TMyClass2 = class 
    public 
    constructor Create(ObjectParam: Object); override; 
    end; 

TParams = array of Variant; 

var 
Classes: array of TClass 
Instances: array of Object; 
ParamArray: array of TParams; 

... 

For I := 0 to Count-1 do 
begin 
    LocalConstructor := @(Classes[I].Create); 
    Instances[I] := CallConstructor(LocalConstructor, ParamArray[I]); 
end; 

तो मैं उसके हस्ताक्षर जानने के बिना निर्माता कॉल करने के लिए की जरूरत है।

तो मेरी समस्या ऑब्जेक्ट की विधि को कॉल करना और कुछ पैरामीटर को पास करना है। यह function CallMethod(Instance: Object; MethodName: String; Params: array of Variant): Variant;

यदि मुझे गलत नहीं लगता है तो इसे डेल्फी के 2010+ आरटीटीआई के माध्यम से हल किया जा सकता है। लेकिन बढ़ाए गए डेल्फी के आरटीटीआई का उपयोग करने से पहले मैं समझना चाहता हूं कि यह एफपीसी में संभव है।

दूसरे शब्दों में मेरी वर्तमान समस्या नियमित रूप से तर्कों को पारित करती है। मैं जानता हूँ कि यह इस योजना का उपयोग किया जा सकता है:

type 
    TmyProc = procedure CallMe(x: byte); 
... 
    var proc: TmyProc; 
... 
    proc := pointerToFunc^; 
    proc(0); 

लेकिन मैं (संकलन समय के दौरान) गिनती और मापदंडों के प्रकार जानने के बिना इसे लागू करने की जरूरत है।

विषय से संबंधित कुछ लिंक कर रहे हैं:

Delphi: Call a function whose name is stored in a string

http://www.swissdelphicenter.ch/torry/showcode.php?id=1745

दूसरे लेख (http://www.swissdelphicenter.ch/torry/showcode.php?id=1745) एक नियमित नाम से DLL से आयात करने के लिए तर्क पारित करने के लिए एक तरह से वर्णन करता है। लगभग मुझे लगता है कि मुझे लगता है कि मुझे लगता है। लेकिन मुझे यकीन नहीं है कि रास्ता विश्वसनीय है।

शायद कोई पुस्तकालय है, जो "पुरानी" टाइपिनोफ़ो इकाई (आरटीटीआई इकाई के बिना) का उपयोग करके इन चीजों को लागू करता है?

इसके अलावा मुझे कुछ प्रकार के सार्वभौमिक ईवेंट हैंडलर बनाने की प्रक्रिया में दिलचस्पी है - प्रक्रियाएं जो विभिन्न घटनाओं (पैरामीटर के विभिन्न सेटों के साथ) को असाइन की जा सकती हैं।:

procedure myEventHandler(params: array of variant); 
... 
Button.OnClick := myEventHandler; 
Button.OnMouseMove := myEventHandler; 

क्या यह संभव है? या कम से कम कुछ ऐसा ही है?

उत्तर

5
  1. MethodAddress का उपयोग करके आप विधियों को भी कॉल कर सकते हैं, लेकिन यह सही तर्क सूची सुनिश्चित करने के लिए आप पर निर्भर है।
  2. आप मेटाक्लास (कक्षा संदर्भ) का उपयोग करके कन्स्ट्रक्टर को कॉल कर सकते हैं, इसका उदाहरण टीसीओलेक्शन में देखा जा सकता है: आप रनटाइम पर अपने संग्रह आइटम की कक्षा उत्तीर्ण करते हैं और फिर आवश्यकता होने पर इसे बनाया जा सकता है। वर्चुअल (और शायद अमूर्त) कन्स्ट्रक्टर के साथ अमूर्त वर्ग को परिभाषित करके, आप अपनी इच्छित तर्क सूची के साथ आ सकते हैं, कुछ उदाहरण here
  3. AFAIK रनटाइम पर तर्क सूची निर्धारित करने का कोई तरीका नहीं है, लेकिन यदि आप कॉल और कॉलर के लिए दोनों विधियों को डिज़ाइन करते हैं, तो आप कई तरह के व्यवहार को लागू कर सकते हैं।

उदाहरण के लिए, आप प्रारूप ओपन (Array of const) पास करते हैं, जैसा कि यह प्रारूप() में किया गया है, इसलिए तर्कों की संख्या और इसके प्रकार भिन्न हो सकते हैं। लेकिन तर्क के रूप में एक और एकमात्र पॉइंटर होने के बावजूद, आप निश्चित रूप से जितना चाहें उतना पास कर सकते हैं, आपको बस कुछ कक्षाओं के साथ आने की ज़रूरत है, जिससे वह आगे बढ़ेगा।

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