2016-03-18 77 views
2

我想在firemonkey項目中按名稱調用方法。但到目前爲止沒有運氣。按名稱調用方法Delphi 10 Firemonkey

下面是我的代碼:

type 
    TExecute = procedure of object; 
    TUpdates= class(TDataModule) 
    procedure UpdateToVersion(Version: Integer); 
    private 
    procedure UpdateToVersion1; 
    procedure UpdateToVersion2; 
    procedure UpdateToVersion3; 
    procedure Call(Name: string); 
    public 
    end; 

procedure TUpdates.Call(Name: String); 
var 
    m:TMethod; 
    Exe:TExecute; 
begin 
    m.Data := pointer(Self); 
    m.Code := Self.MethodAddress(Name); 
    Exe := TExecute(m); 
    Exe; 
end; 

procedure TUpdates.UpdateToVersion(Version: Integer); 
begin 
    Call('UpdateToVersion'+version.ToString); 
end; 

procedure TUpdates.UpdateToVersion1; 
begin 
    //code 
end; 

procedure TUpdates.UpdateToVersion2; 
begin 
    //code 
end; 

procedure TUpdates.UpdateToVersion3; 
begin 
    //code 
end; 

結果: 當我打電話例如UpdateToVersion(1)我得到一個訪問衝突和程序UpdateToVersion1不會被調用。

我從一個示例中,這代碼從下面的鏈接: http://www.swissdelphicenter.ch/torry/showcode.php?id=799

回答

3

MethodAddress需要,該方法是公開的,如在示例代碼的方法。你的方法是私人的。因此MethodAddress失敗並返回nil

通過發佈方法解決問題。

如果您希望使用未發佈的方法執行此類任務,那麼您將需要使用增強型RTTI。