2012-09-23 17 views
5

पर एक स्क्रिप्ट विधि को लिंक करता है, मुझे आश्चर्य है कि क्या DWScript डेल्फी रूप पर नियंत्रण के लिए एक ईवेंट हैंडलर के रूप में स्क्रिप्ट विधि का उपयोग करने का समर्थन करता है। उदाहरण के लिए मैं एक टीबीटन ऑनक्लिक घटना को स्क्रिप्ट में मौजूद एक विधि से लिंक करना चाहता हूं।डेल्फी वेब स्क्रिप्ट (डीडब्लूस्क्रिप्ट) एक बाहरी नियंत्रण घटना

मैं GetProcMethod को कॉल करके RemObjects डेल्फी स्क्रिप्ट इंजन के साथ ऐसा करने में सक्षम हूं जो एक TMethod ऑब्जेक्ट देता है। मैं फिर बटन के ऑनक्लिक ईवेंट को स्क्रिप्ट विधि असाइन करने के लिए SetMethodProp का उपयोग करता हूं।

procedure LinkMethod(SourceMethodName: String; Instance: TObject; ScriptMethodName: String); 
var 
    ScriptMethod: TMethod; 
begin 
    ScriptMethod := ScriptEngine.GetProcMethod(ScripMethodName); 

    SetMethodProp(Instance, SourceMethodName, ScriptMethod); 
end; 

मैं रेम के बजाय DWScript में ऐसा करना चाहते हैं स्क्रिप्ट इंजन वस्तुओं के रूप में यह कुछ अन्य सामान है कि मैं जरूरत है।

उत्तर

2

मैंने इसके बजाय RemObjects के साथ जाने का फैसला किया। यह उपयोग करना सबसे आसान था और मुझे जो चाहिए वह करता है।

1

AFAIK DWScript जो भी आप प्राप्त करने की कोशिश कर रहे हैं उसका समर्थन नहीं करता है लेकिन इसे विभिन्न तरीकों से कार्यान्वित किया जा सकता है। मैं कुछ स्रोत कोड पोस्ट करने का प्रयास करूंगा कि इसे कैसे कार्यान्वित किया जा सकता है लेकिन आपको शायद इसे अपनी आवश्यकताओं के अनुरूप अनुकूलित करने की आवश्यकता होगी।

सबसे पहले, एक छोटे से आवरण वर्ग जो प्रत्येक स्क्रिप्ट विधि के लिए अलग से होना चाहिए की घोषणा: (में जैसे प्रपत्र के बनाने घटना)

type 
    TDwsMethod = class 
    private 
    FDoExecute: TNotifyEvent; 
    FScriptText: string; 
    FDws: TDelphiWebScript; 
    FLastResult: string; 
    FMethod: TMethod; 
    protected 
    procedure Execute(Sender: TObject); 
    public 
    constructor Create(const AScriptText: string); virtual; 
    destructor Destroy; override; 

    property Method: TMethod read FMethod; 
    property LastResult: string read FLastResult; 
    published 
    property DoExecute: TNotifyEvent read FDoExecute write FDoExecute; 
    end; 

constructor TDwsMethod.Create(const AScriptText: string); 
begin 
    inherited Create(); 
    FDoExecute := Execute; 
    FScriptText := AScriptText; 
    FDws := TDelphiWebScript.Create(nil); 
    FMethod := GetMethodProp(Self, 'DoExecute'); 
end; 

destructor TDwsMethod.Destroy; 
begin 
    FDws.Free; 
    inherited Destroy; 
end; 

procedure TDwsMethod.Execute(Sender: TObject); 
begin 
    ShowMessage('My Method executed. Value: ' + FDws.Compile(FScriptText).Execute().Result.ToString); 
end; 

अब हम हमारी कोड में कहीं इस वर्ग का एक उदाहरण बनाना चाहिए:

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    FDWSMethod := TDwsMethod.Create('PrintLn(100);'); //in constructor we pass script text which needs to be executed 
    //now we can set form's mainclick event to our DWS method 
    SetMethodProp(Self, 'MainClick', FDWSMethod.Method); 
end; 

procedure TMainForm.FormDestroy(Sender: TObject); 
begin 
    FDWSMethod.Free; 
end; 

अब जब हम MainClick फोन हमारी स्क्रिप्ट संकलित और क्रियान्वित किया जाता है:

Script method executed from form's event

+1

इसके लिए धन्यवाद। दुर्भाग्य से हालांकि मैं रनटाइम तक आवश्यक पैरामीटर की घटना का नाम नहीं जानूंगा। RemObjects ईवेंट कॉल को अवरुद्ध करने और स्क्रिप्ट किए गए ईवेंट हैंडलर पर पैरामीटर को अग्रेषित करने में संभालता है। इस तरह आपको संकलन समय पर लागू होने वाली विधि के बारे में कुछ भी जानने की आवश्यकता नहीं है। मैं उम्मीद कर रहा था कि डीडब्ल्यूएस ऐसा कुछ करता है। –

+0

यह इस समय नहीं किया गया है क्योंकि डीडब्लूस्क्रिप्ट पूरी तरह से सैंडबॉक्स करने योग्य है और सुरक्षा के लिए लक्ष्य है, दृष्टिकोण रेमोबजेक्ट के उपयोग के परिणामस्वरूप स्मृति भ्रष्टाचार या क्रैश हो सकता है यदि पैरामीटर के बीच कोई मेल नहीं है। आरटीटीआई ने उस पर कुछ प्रगति की है, लेकिन यह अभी भी मेमोरी लीक या एवी के लिए कमजोर होगा, क्योंकि डेल्फी कार्यक्रमों के लिए मेमोरी प्रबंधन को स्वचालित करने का कोई तरीका नहीं है। यदि कोई उन सीमाओं के साथ रह सकता है और सहायक कोड प्रकाशित कर सकता है, तो मैं इसे एकीकृत कर दूंगा ... उपयुक्त "सावधानी" नोटिस के साथ ;-) –