이와 같은 기능을 구현할 수 있습니까?Delphi의 인터페이스 참조에서 RTTI를 얻는 방법은 무엇입니까?
function GetRttiFromInterface(AIntf: IInterface; out RttiType: TRttiType): Boolean;
I이 (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
입니다. 내가하여 RTTI를 얻을 수 있습니다, 실제 타입이 Androidapi.JNI.Embarcadero.JWebBrowser
입니다 가정 : 내가하고 싶은 것은 그 자격을 갖춘 유형 이름을 몰라도 RTTI를 얻을
TRttiContext.Create.FindType('Androidapi.JNI.Embarcadero.JWebBrowser');
입니다.
RttiType := TRttiContext.Create.GetType(AObject.ClassType);
을하지만 인터페이스의 인스턴스 :
TObject
의 인스턴스의 경우, 내가 사용할 수 있습니다
RttiType := TRttiContext.Create.GetType(AInterface);
이 작동하지 않습니다.
당신이 원하는 반환 할
은 내가 TInterfaceHelper을 썼다? –해당 드라이브 링크에서 무엇을 찾으시겠습니까? 신중한 사람들은 낯선 사람들이 다운로드 한 rar 파일을 열지 않습니다. 귀하의 질문에 * 필수 * 코드를 게시하십시오. –
코멘트에서 코드 서식을 어떻게 찾아 냈는지는 모르지만 질문 자체에서는 그렇게 할 수 없습니다. 나는 너를 위해 그것을 고치려고 애썼지 만, 너는 내가 틈을 내고 싶지 않다는 것을 포함하는 HTML과 간격이 부족한 그런 난장판을 만들었다. 게시물에 HTML을 사용하지 마십시오. IDE 편집기에서 코드의 형식을 올바르게 지정하고 여기에 복사하여 붙여넣고 Ctrl + K 또는 {} 도구 모음 버튼을 사용하여 코드로 형식을 지정합니다. –