2012-09-23 23 views
5

DWScript'in Delphi formundaki bir denetim için olay işleyicisi olarak bir komut dosyası yöntemi kullanmasını destekleyip desteklemediğini merak ediyorum. Örneğin, bir TButton OnClick olayını komut dosyasında mevcut bir yönteme bağlamak istiyorum.Delphi Web Komut Dosyası (DWScript) bir dış denetim olayına bir komut dosyası bağla

Bunu, bir TMethod nesnesini döndüren GetProcMethod öğesini çağırarak RemObjects Delphi komut dizisi ile yapabiliyorum. Daha sonra, bir düğmenin OnClick olayına komut dosyası yöntemini atamak için SetMethodProp kullanıyorum.

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

    SetMethodProp(Instance, SourceMethodName, ScriptMethod); 
end; 

Bunu, ihtiyacım olan diğer bazı şeyler gibi, Rem nesneleri komut dosyası motoru yerine DWScript'te yapmak istiyorum.

cevap

2

Bunun yerine RemObjects ile gitmeye karar verdim. Kullanması en kolay olanı ve ihtiyacım olanı yaptı.

1

AFAIK DWScript, elde etmeye çalıştığınız şeyi doğrudan desteklemez, ancak farklı şekilde uygulanabilir. Bazı kaynak kodları nasıl uygulayabileceğimi bildirmeye çalışacağım, ancak muhtemelen gereksinimlerinize uyarlamanız gerekecektir.

Birincisi, her komut dosyası yöntemi için ayrı olmalı biraz sarıcı sınıf bildirmek:

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; 

Şimdi bir yere bizim kodunda bu sınıfın bir örneğini oluşturmanız gerekir (ör formun oluşturmak durumunda):

Şimdi
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; 

bizim komut derlenmiş ve yürütülür MainClick çağırır:

Script method executed from form's event

+1

Bunun için teşekkürler. Ne yazık ki, çalışma zamanına kadar gerekli olan parametrelerin etkinliğinin adını bilmeyeceğim. RemObjects, olay çağrısını engelleyen ve parametreleri komut dosyası olay işleyicisine iletme işlemlerini gerçekleştirir. Bu şekilde, derleme zamanında çağrılan yöntem hakkında bir şey bilmenize gerek yoktur. DWS'nin böyle bir şey yaptığını umuyordum. –

+0

Şu an bitti değil çünkü DWScript tam olarak kumlanabilir ve güvenlik amaçlarına yöneliktir, RemObject kullanımı, parametreler arasında bir uyumsuzluk olduğunda bellek bozulmasına veya çökmelere neden olur. RTTI bu konuda biraz ilerlemiş, ancak bellek sızıntılarına veya AV'ye karşı savunmasız kalacaktır, çünkü Delphi olayları için bellek yönetimini otomatikleştirmenin bir yolu yoktur. Birisi bu sınırlamalarla yaşayabilir ve destekleyici kodu yayınlayabilirse, bunu uygun "dikkat" notları ile entegre edeceğim ;-) –

İlgili konular