में संग्रहीत किया गया है क्या यह फ़ंक्शन को कॉल करना संभव है जिसका नाम डेल्फी में स्ट्रिंग में संग्रहीत है?डेल्फी: किसी फ़ंक्शन को कॉल करें जिसका नाम स्ट्रिंग
उत्तर
कृपया आप जो हासिल करने की कोशिश कर रहे हैं, उसके बारे में अधिक जानकारी दें।
मैं जानता हूँ कि जहाँ तक:
- ऐसा एक यादृच्छिक समारोह कॉल करने के लिए संभव नहीं है।
- कक्षा और ऑब्जेक्ट फ़ंक्शंस (MyObject.Function) के लिए यह आरटीटीआई के साथ किया जा सकता है, लेकिन यह बहुत काम है।
- यदि आपको केवल एक विशेष प्रकार के कार्यों को कॉल करने की आवश्यकता है (कहें, फ़ंक्शन (पूर्णांक, पूर्णांक): स्ट्रिंग), यह बहुत आसान है।
पिछले एक के लिए, एक समारोह प्रकार की घोषणा है, तो एक समारोह सूचक हो और इस तरह यह डाली:
type
TMyFuncType = function(a: integer; b: integer): string of object;
TMyClass = class
published
function Func1(a: integer; b: integer): string;
function Func2(a: integer; b: integer): string;
function Func3(a: integer; b: integer): string;
public
function Call(MethodName: string; a, b: integer): string;
end;
function TMyClass.Call(MethodName: string; a, b: integer): string;
var m: TMethod;
begin
m.Code := Self.MethodAddress(MethodName); //find method code
m.Data := pointer(Self); //store pointer to object instance
Result := TMyFuncType(m)(a, b);
end;
{...}
//use it like this
var MyClass: TMyClass;
begin
MyClass := TMyClass.Create;
MyClass.Call('Func1', 3, 5);
MyClass.Call('Func2', 6, 4);
MyClass.Destroy;
end.
यह संभव होना चाहिए। यदि वीबी 6 ऐसा कर सकता है, निश्चित रूप से डेल्फी को इसकी अनुमति देनी चाहिए। विचार के लिए – itsols
यदि आप पूछ रहे हैं कि जावास्क्रिप्ट eval()
कुछ ऐसा है जो डेल्फी में संभव है, तो डेल्फी देशी कोड में संकलित होने के बाद से यह आसानी से प्राप्त नहीं किया जा सकता है।
आप केवल कुछ तार आप हमेशा कर सकते हैं समर्थन करने के लिए की जरूरत है कई if
या एक case
... कुछ की तरह:
if myString = 'myFunction' then
myFunction();
मैंने इसे वीबी 6 में किया है और यह ** ** मूल-संकलित भाषा है। तो मुझे विश्वास है कि डेल्फी के साथ भी यह संभव होना चाहिए (और मेरे मामले में लाजर पास्कल) – itsols
आप प्रकाशित गुणों के साथ एक या अधिक वर्गों क्राफ्टिंग द्वारा कुछ इस तरह कर सकते हैं कि उनके पढ़ने और लिखने की कार्यक्षमता को लागू करने के लिए कार्यों का उपयोग करें। गुणों को फिर आरटीटीआई प्रतिबिंब और संदर्भित करके खोजा जा सकता है, जिससे अंतर्निहित कार्यों को बुलाया जा सकता है।
वैकल्पिक रूप से, आप किसी तालिका में फ़ंक्शन पॉइंटर्स स्टोर कर सकते हैं, या यहां तक कि TStringList की ऑब्जेक्ट प्रॉपर्टी भी संग्रहीत कर सकते हैं और स्ट्रिंग नाम से उन्हें प्रभावी रूप से इंडेक्स कर सकते हैं।
डेल्फी में नाम से फ़ंक्शन की सीधे कॉलिंग संभव नहीं है।
यह वर्ग कार्यों के लिए है। आरटीटीआई भी उनके लिए संग्रहीत किया जा सकता है, यहां तक कि पैरामीटर और कॉलिंग सम्मेलन के विवरण भी। लेकिन यह पिटा है। – himself
मैं कोई भी एक dispatch table सुझाव दिया है हैरान हूँ। यह वही है जो इसके लिए है।
program RPS;
uses
SysUtils,
Generics.Collections;
type
TDispatchTable = class(TDictionary<string, TProc>);
procedure Rock;
begin
end;
procedure Paper;
begin
end;
procedure Scissors;
begin
end;
var
DispatchTable: TDispatchTable;
begin
DispatchTable := TDispatchTable.Create;
try
DispatchTable.Add('Rock', Rock);
DispatchTable.Add('Paper', Paper);
DispatchTable.Add('Scissors', Scissors);
DispatchTable['Rock'].Invoke; // or DispatchTable['Rock']();
finally
DispatchTable.Free;
end;
end.
मैंने जो कार्यान्वयन लिखा वह जेनरिक का उपयोग करता है, इसलिए यह केवल डेल्फी 200+ के साथ काम करेगा। पुराने संस्करणों के लिए यह शायद TStringList और command pattern
+1, खासकर डेल्फी 200 9 और इससे पहले के लिए। डेल्फी 2010+ के साथ, आरटीटीआई में पहले से ही सभी अंतर्निहित जानकारी है, इसलिए मोहम्मद और हेनरी का जवाब आसान है। –
पेज नहीं मिला। – ZzZombo
गंभीरता से? इसलिए अपनी वेबसाइट से लिंक अपडेट किए बिना एक प्रश्न को हटा दिया/हटा दिया? –
आपने अपना डेल्फी संस्करण निर्दिष्ट नहीं किया है, हालांकि यदि आपके पास डेल्फी 2010 (+) है तो आप इसे बढ़ाए गए आरटीटीआई का उपयोग करके कर सकते हैं, मैं नहीं हूं विशेषज्ञ उन पर है, लेकिन मैं आप के लिए इस नमूने की कोशिश की:
TProcClass = class
public
procedure SayHi;
function GetSum(X,Y:Integer): Integer;
end;
uses
Rtti;
{ TProcClass }
procedure TProcClass.SayHi;
begin
ShowMessage('Hi');
end;
function TProcClass.GetSum(X, Y: Integer): Integer;
begin
ShowMessage(IntToStr(X + Y));
end;
procedure ExecMethod(MethodName:string; const Args: array of TValue);
var
R : TRttiContext;
T : TRttiType;
M : TRttiMethod;
begin
T := R.GetType(TProcClass);
for M in t.GetMethods do
if (m.Parent = t) and (m.Name = MethodName)then
M.Invoke(TProcClass.Create,Args)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ExecMethod('SayHi',[]);
ExecMethod('GetSum',[10,20]);
end;
अच्छी बातें, यदि आप पैरामीटर के साथ प्रक्रिया या कार्य हो इसे और अधिक काम के बिना काम करेंगे।
कृपया ध्यान दें कि यह कोड इस विधि से प्रत्येक विधि के लिए कम से कम एक 'TProcClass' उदाहरण को रिसाव करता है। –
डेल्फी 2010 के साथ आप पैरामीटर के साथ विधि का आह्वान करने के लिए JSON और SuperObject का उपयोग कर सकते हैं।
http://code.google.com/p/superobject/source/browse/#svn/trunk
आप की जरूरत है, वहाँ भी json के लिए एक्सएमएल को बदलने के लिए एक XML पार्सर है।
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure TestMethod(const value: string);
end;
var
Form1: TForm1;
implementation
uses superobject;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
SOInvoke(Self, 'TestMethod', SO('{value: "hello"}'));
end;
procedure TForm1.TestMethod(const value: string);
begin
Caption := value;
end;
यह बिंदु के बगल में है लेकिन अभी भी SuperObject के साथ करना है। मुझे पता है कि आप सही जगह पर सही आदमी हैं :-)। क्या आप [इस सवाल] पर थोड़ा ध्यान दे सकते हैं (http://stackoverflow.com/q/7841617/744588) कहीं SO पर? – menjaraz
प्रत्येक कार्य को एक क्रिया में रखें। तो फिर तुम नाम से कार्रवाई पा सकते हैं और निष्पादित यह
function ExecuteActionByName(const S: String);
var
I: Integer;
begin
for I := 0 to MainForm.ComponentCount-1 do
if (MainForm.Components[I] is TAction)
and SameText(TAction(MainForm.Components[I]).Name,S) then
begin
TAction(MainForm.Components[I]).Execute;
Break;
end;
end;
+1; इस विचार के लिए दिलचस्प अवधारणा –
@RobMcDonell +1। मैंने पुराने वीबी 6 में भी इसी तरह की चीज की है और मैं इसे लाजर को बंद करने की कोशिश कर रहा हूं (जिसे मैं बहुत नया हूं)। मुझे लगता है कि आपकी लाइन 'टीएक्शन (मेनफॉर्म.कंपोनेंट्स [आई])। निष्पादित करें;' पूरी चीज का केंद्र है। क्या आप कृपया आदेश पर उपयुक्त डॉक्टर को निर्देशित करेंगे? यहां तक कि एक साधारण स्पष्टीकरण भी करेगा। धन्यवाद! – itsols
ठीक है, मैं बहुत देर पार्टी के लिए कर रहा हूँ, लेकिन आप निश्चित रूप से इस कोड के साथ नाम से दिनचर्या कॉल कर सकते हैं (कुछ सीमाएं सोचा हैं)
type
TExec = procedure of Object;
// rest of section...
procedure TMainForm.ExecuteMethod(MethodName : String);
var
Exec : TExec;
Routine : TMethod;
begin
Routine.Data := Pointer(Form1);
Routine.Code := Form1.MethodAddress(MethodName);
if Not Assigned(Routine.Code) then
Exit;
Exec := TExec(Routine);
Exec;
end;
शायद ज़रुरत पड़े कोई (बहुत दुर्लभ परिस्थितियों को छोड़कर) डेल्फी 7/2010
क्षमा करें - मैं इस मंच के लिए काफी नया हूं। आप एफआईआर लाइन में किए गए मूल्य को कैसे असाइन कर सकते हैं?TExec क्या डेटा प्रकार है? – itsols
@itsols: निश्चित रूप से मैंने अपना जवाब संपादित किया, मूल रूप से आप उस पंक्ति को डालते हैं जो 'TExec = ऑब्जेक्ट की प्रक्रिया;' * * टाइप * कीवर्ड के बाद * है और यह – TheDude
+1 है ... यह अभी स्पष्ट है :) धन्यवाद! – itsols
- 1. कॉल जावास्क्रिप्ट फ़ंक्शन जिसका नाम परिवर्तनीय
- 2. फ़ंक्शन नाम को स्ट्रिंग
- 3. डेल्फी: किसी अन्य स्ट्रिंग
- 4. फ़ंक्शन कॉल से फ़ंक्शन कॉल नाम निकालने
- 5. मैं फ़ंक्शन नाम को स्ट्रिंग
- 6. आर में फ़ंक्शन नाम की वर्ण स्ट्रिंग का उपयोग करके फ़ंक्शन को कैसे कॉल करें?
- 7. डेल्फी में WinAPI फ़ंक्शन SetDllDirectory() को कैसे कॉल करें?
- 8. पर्ल में, मैं एक विधि को कैसे कॉल कर सकता हूं जिसका नाम स्ट्रिंग में है?
- 9. समान नाम फ़ंक्शन को कॉल करना
- 10. सी ++ वर्तमान फ़ंक्शन नाम स्ट्रिंग
- 11. किसी अन्य फ़ाइल से फ़ंक्शन को कैसे कॉल करें?
- 12. किसी अन्य सर्वर पर कोल्डफ्यूज़न फ़ंक्शन को कॉल करें?
- 13. फ़ंक्शन के अंदर किसी ऑब्जेक्ट को कॉल करें
- 14. क्लोजर में फ़ंक्शन के नाम के साथ एक स्ट्रिंग से फ़ंक्शन को कॉल करना
- 15. किसी ऑब्जेक्ट से कॉल फ़ंक्शन?
- 16. ऑब्जेक्ट के अंदर स्ट्रिंग से कॉल फ़ंक्शन?
- 17. डेल्फी में वर्तमान प्रक्रिया/फ़ंक्शन का नाम कैसे प्राप्त करें (एक स्ट्रिंग के रूप में)
- 18. एक स्ट्रिंग का उपयोग कर एक जावास्क्रिप्ट फ़ंक्शन नाम पर कॉल करें?
- 19. एक विशिष्ट जावास्क्रिप्ट फ़ंक्शन को कॉल करें जब एकाधिक समान नाम फ़ंक्शन मेमोरी
- 20. एक इंस्टेंस वैरिएबल का मान प्राप्त करें जिसका नाम
- 21. डेल्फी - प्रति नाम रिकॉर्ड विधि को आमंत्रित करें
- 22. किसी अन्य फ़ंक्शन से आईडी प्रेषक फ़ंक्शन को कैसे कॉल करें?
- 23. किसी सदस्य फ़ंक्शन पॉइंटर से कैसे कॉल करें?
- 24. PHP फ़ंक्शन को कॉल करते समय दायरे को संरक्षित करें
- 25. प्रत्येक बार किसी भी विधि को कॉल करने के लिए मैक्रो को कॉल करें - उद्देश्य सी
- 26. सही तरीका किसी फ़ंक्शन से स्ट्रिंग को वापस लौटाएं
- 27. सी ++ किसी फ़ंक्शन/विधि के उलझन वाले नाम प्राप्त करें
- 28. गो में किसी फ़ंक्शन का नाम कैसे प्राप्त करें?
- 29. किसी ऑब्जेक्ट को अनपिक कैसे करें जिसका वर्ग किसी भिन्न नामस्थान (पायथन) में मौजूद है?
- 30. डेल्फी स्ट्रिंग
के लिए इस की जरूरत है अगर ऐसा है, यह अभी भी एक बुरा विचार है। तुम्हें क्या करने की ज़रूरत है? – delnan
@ डेलनन यह एक बुरा विचार क्यों है? मैं कोशिश कर रहा हूं, उदाहरण के लिए, मेनू कमांड के रूप में कुछ गतिशील रूप से बनाए गए बटन को लागू करने के लिए। प्रत्येक के लिए कॉल करने के लिए कार्यों को डीबी से खींचा जाता है और एक सरणी में डाल दिया जाता है। फिर मैं उस प्रक्रिया को कॉल करता हूं जिसका नाम सरणी तत्व में होता है, जब कोई विशेष बटन क्लिक किया जाता है। मुझे लगता है कि यह अच्छा है। यह एक बुरा विचार क्यों है? मैं वास्तव में लाजर पास्कल (डेल्फी के समान) पर कोशिश कर रहा हूं – itsols
@itsols विभिन्न तकनीकी मुद्दों के अलावा (जो * महत्वपूर्ण हैं, लेकिन व्याख्या करने के लिए जगह लेते हैं और हमेशा * लागू नहीं होते हैं), मुख्य आपत्ति यह है कि आवेदन डेटा के साथ चर नामों को भ्रमित करता है। नेड बचेचेल्डर ने ऐसी भाषा के संदर्भ में इसी तरह के भ्रम पर लिखा है, जहां यह वास्तव में करना आसान है: [अपने चर नामों से डेटा रखें] (http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html)। प्रथम श्रेणी के कार्यों के साथ-साथ मैपिंग डेटा संरचना या 'केस' कथन का उपयोग करके, आप दोनों को भ्रमित किए बिना एक ही चीज़ प्राप्त कर सकते हैं। – delnan