2016-06-17 7 views
1

Wie die private Methode TStreamReader.FillBuffer in Delphi 10.1 Berlin zuzugreifen, können wir es mit einer Klasse Helfer vor 10.1 tat - aber die vorgeschlagene Lösung funktioniert nicht:Zugriff auf die private Methode TStreamReader.FillBuffer in Delphi 10.1 Berlin?

uses System.Rtti; 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Assert(Assigned(TRttiContext.Create.GetType(TStreamReader).GetMethod('FillBuffer')), 
    'Failed'); 
end; 

es NIL nur weil GetMethod kehrt ausfällt. Irgendwelche Ideen, warum das scheitert?

Edited: weiß ich wollen, warum es nicht

+0

Es schlägt fehl, wahrscheinlich, weil es nicht mit erweiterten RTTI kompiliert wurde aktiviert. –

+2

Haben Sie @ LURDs Antwort hier gesehen: http://StackOverflow.com/Questions/36716363/How-to-Access-Private-Methods-Without-Helpers/37761852#37761852 – MartynA

+0

@Rudy: Ich habe versucht, {$ METHODINFO ON} in meiner unit1.pas, aber ich denke, das sollte in system.classes getan werden (wo TStreamReader deklariert ist). – cydo

Antwort

1

Es schlägt fehl, da die privaten Methoden sind nicht in dieser Klasse enthalten sind. Siehe RTTI access to private methods of VCL, e.g. TCustomForm.SetWindowState

es eine Abhilfe ist die private Methode für das Erhalten obwohl:

See: How to access private methods without helpers?

type 
    TStreamReaderHelper = class helper for TStreamReader 
    public 
    procedure FillBuffer(var Encoding: TEncoding); 
    end; 

procedure TStreamReaderHelper.FillBuffer(var Encoding: TEncoding); 
var 
    Method: procedure(var Encoding: TEncoding) of object; 
begin 
    TMethod(Method).Code := @TStreamReader.FillBuffer; 
    TMethod(Method).Data := Self; 
    Method(Encoding); 
end;