與問題相關TVirtualMethodInterceptor.Create doesn't support the class that has overload virtual method.。在修改RRUZ的答案後,我又遇到了另一個問題。 我應該如何調用第二種重載方法「SaveLog(str:string; Args:TConst數組)」;「 。 如以下代碼RTTI&Variant Open Array Parameters
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:另外,請閱讀:[打開數組參數和常量數組](http://rvelthuis.de/articles/articles-openarr.html)以瞭解您的「TConst」類型與打開陣列。它們是相關的,但不相同。 –
這是來自@Rudy的一個很好的鏈接,它展示瞭如何實現聲明我給出的函數 –
@Andersen它比在TVarRec中沒有存儲值的數據類型更復雜。見魯迪的文章。 –