TVirtualMethodInterceptor.Create doesn't support the class that has overload virtual method.과 관련이 있습니다. RRUZ의 대답을 수정 한 후에 또 다른 문제가 발생했습니다. 두 번째 오버로드 메서드를 어떻게 호출해야합니까? SaveLog (str : string; Args : TConst의 배열); " . 아래와 같이 코드 RTTI 및 변형 개방형 배열 매개 변수
type
TConst = array of TVarRec;
TLog = class
public
constructor Create();
procedure SaveLog(str: string); overload; virtual;
procedure SaveLog(str: string; Args: TConst); overload; virtual;
end;
constructor TLog.Create(str: string);
begin
end;
procedure TLog.SaveLog(str: string);
begin
MessageBox(GetFocus(), PChar(str), 'Test Message', MB_OK);
end;
procedure TLog.SaveLog(str: string; Args: TConst);
var
buf: string;
begin
buf:=Format(str, Args);
SaveLog(buf);
end;
procedure MyTest(nID: Integer);
var
ttt: TLog;
vmi: TVirtualMethodInterceptor;
begin
ttt:=TLog.Create();
try
ttt.SaveLog('ID = %d', [nID]);
vmi:=TVirtualMethodInterceptor.Create(ttt.ClassType);
try
//
finally
vmi.Free();
end;
finally
ttt.Free();
end;
end;
코드 "ttt.SaveLog ("ID = % d의 '[NID])는 「얻을 컴파일러 에러 : E2250 될 수'SaveLog '아니오 오버로딩 없다 이 주장들로 불렀습니다. 어떻게해야합니까?
@AndersenChang : 또한 [TConst] 유형과 열기의 차이점을 읽으려면 [Open 배열 매개 변수 및 배열 배열] (http://rvelthuis.de/articles/articles-openarr.html)을 읽어보십시오. 배열. 그것들은 관련이 있지만 동일하지는 않습니다. –
그건 @Rudy가 제공 한 선언문을 구현하는 방법을 보여주는 훌륭한 링크입니다. –
@Andersen TVarRec의 값으로 저장되지 않은 데이터 유형보다 복잡합니다. Rudy의 기사를 참조하십시오. –