是否可以實現這樣的功能?如何從Delphi中的接口引用獲取RTTI?
function GetRttiFromInterface(AIntf: IInterface; out RttiType: TRttiType): Boolean;
我有以下代碼(在Firemonkey安卓):
// Get the FWeb field of AWebBrowser, then get FJWebBrowser field of FWeb.
function GetNativeBrowserIntf(AWebBrowser: TWebBrowser): IInterface;
var
LCtx: TRttiContext;
LWeb: TObject;
begin
LWeb := (LCtx.GetType(TWebBrowser).GetField('FWeb').GetValue(AWebBrowser).AsInterface as TObject);
result := LCtx.GetType(LWeb.ClassInfo).GetField('FJWebBrowser').GetValue(LWeb).AsInterface;
end;
{ TODO : How to get rtti from an interface reference??? }
function GetRttiFromInterface(AIntf: IInterface; out RttiType: TRttiType): Boolean;
begin
//RttiType := TRttiContext.Create.FindType('Androidapi.JNI.Embarcadero.JWebBrowser');
//I want to get rtti from AIntf without knowing the qulified type name
result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
NativeBrowser: IInterface;
LIntfType: TRttiType;
LScale: Single;
begin
// obtain native browser Interface (JWebBrowser)
NativeBrowser := GetNativeBrowserIntf(WebBrowser1);
// Get Rtti from this interface
if GetRttiFromInterface(NativeBrowser, LIntfType) then
begin
// Invoke the getScale method of Native Browser
LScale := LIntfType.GetMethod('getScale').Invoke(TValue.From<IInterface>(NativeBrowser), []).AsType <Single> ;
ShowMessage('Current scale is:' + LScale.ToString);
end;
end;
如何從一個接口引用得到RTTI沒有其限定的類型名稱?
例如,我有一個IInterface
實例,名爲AInterface
。假設它的實際類型Androidapi.JNI.Embarcadero.JWebBrowser
, 我可以得到它的RTTI:
TRttiContext.Create.FindType('Androidapi.JNI.Embarcadero.JWebBrowser');
我想要做的就是獲得其RTTI不知道它限定的類型名稱。
對於TObject
情況下,我可以使用:
RttiType := TRttiContext.Create.GetType(AObject.ClassType);
但對於接口的實例:
RttiType := TRttiContext.Create.GetType(AInterface);
不起作用。
你想什麼要返回? –
我們應該在該Drive鏈接找到什麼?請注意,謹慎的人不會打開他們從陌生人下載的rar文件。在你的問題中發佈必要的*代碼。 –
我不確定你是如何設法在註釋中找出代碼格式的,但是在你的問題本身中不能這樣做。我開始嘗試爲你修復它,但是由於缺乏間距和你所包含的所有HTML我都不想破壞任何東西,所以你弄得這麼混亂。不要在您的文章中使用HTML。在IDE編輯器中正確格式化代碼,將其複製並粘貼到此處,全選,然後使用Ctrl + K或工具欄按鈕將其格式化爲代碼。 –