die dort schon eingetragenen Funktionen sind schon im MemoryStream vorhanden,
aber ich glaub du hast Recht, da diese Getter/Setter ja als Private nicht zur Verfügung stehn
aber du brauchst ja auch nur das implementieren, welches man am Ende auch benutzt
(hab hier einfach mal "alle" nötigen Standardfunktionen kopiert)
nja, schön wäre es, wenn man von 2 Objekten erben könne
TMemoryStream und TInterfacedObject, dann brächte man nur noch diese Drei implementieren
Delphi-Quellcode:
function GetPosition: Int64;
procedure SetPosition(const Pos: Int64);
procedure SetSize64(const NewSize: Int64);
jetzt könnte man also von TInterfacedObject erben und hätte die Interfaceverwaltung, muß dann aber den "echten" TMemoryStream mit einbauen und an diesen alles weiterleiten, also alle Stream-Funktionen neu implementieren/umleiten
oder eben so (vom Stream erben und "nur" noch das Basis-Interface reinbauen)
> die Funktionen von IInterface muß jedes Interface bereitstellen, da sie zur Verwaltung gehören
Delphi-Quellcode:
type
IDelphiStream = interface
['{65805750-623E-4719-AD79-A30FF6FCA3CA}']
{private}
function GetPosition: Int64;
procedure SetPosition(const Pos: Int64);
procedure SetSize64(const NewSize: Int64);
function GetSize: Int64;
{public}
procedure SetSize(NewSize: Longint);
function Write(const Buffer; Count: Longint): Longint;
function Read(var Buffer; Count: Longint): Longint;
function Seek(Offset: Longint; Origin: Word): Longint;
procedure Clear;
//procedure LoadFromStream(Stream: IStream);
//procedure SaveToStream(Stream: IStream);
//procedure LoadFromFile(const FileName: WideString);
//procedure SaveToFile(const FileName: WideString);
property Position: Int64 read GetPosition write SetPosition;
property Size: Int64 read GetSize write SetSize64;
end;
TInterfacedMemoryStream = class(TMemoryStream, IDelphiStream, IInterface)
private
function GetPosition: Int64;
procedure SetPosition(const Pos: Int64);
procedure SetSize64(const NewSize: Int64);
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
class function NewInstance: TObject; override;
property RefCount: Integer read FRefCount;
end;
function TInterfacedMemoryStream.GetPosition: Int64;
begin
Result := inherited Position;
end;
procedure TInterfacedMemoryStream.SetPosition(const Pos: Int64);
begin
inherited Position := Pos;
end;
procedure TInterfacedMemoryStream.SetSize64(const NewSize: Int64);
begin
inherited Size := NewSize;
end;
function TInterfacedMemoryStream.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TInterfacedMemoryStream._AddRef: Integer;
begin
Result := InterlockedIncrement(FRefCount);
end;
function TInterfacedMemoryStream._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
procedure TInterfacedMemoryStream.AfterConstruction;
begin
InterlockedDecrement(FRefCount);
end;
procedure TInterfacedMemoryStream.BeforeDestruction;
begin
if RefCount <> 0 then
System.Error(reInvalidPtr);
end;
class function TInterfacedMemoryStream.NewInstance: TObject;
begin
Result := inherited NewInstance;
TInterfacedMemoryStream(Result).FRefCount := 1;
end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
Stream: IDelphiStream;
begin
Stream := TInterfacedMemoryStream.Create;
end;
wegen dem AfterConstruction und BeforeDestruction nicht wundern, das ist nur dafür da, damit das Objekt/Interface nicht mitten im Create wieder freigegeben wird, da durt durch ein paar "Problemchen" der Referenzzähler kurz auf 0 runterkommen kann (z.B. wenn man das erstellte Objekt/Interface an eine Objektvariable übergibt gibt und nicht SOFORT an eine Interfacevariable)
da es leider kein Private bei Interfaces gibt:
der Trick ist mir mal eingefallen ... so sind über IDelphiStreamIntern die "privaten"/internen Definitionen nicht sichtbar ... tauchen also auch nicht in der Autovervolständigung auf
Delphi-Quellcode:
type
IDelphiStreamIntern = interface
{private}
function GetPosition: Int64;
procedure SetPosition(const Pos: Int64);
procedure SetSize64(const NewSize: Int64);
function GetSize: Int64;
end;
IDelphiStream = interface(IDelphiStreamIntern)
['{65805750-623E-4719-AD79-A30FF6FCA3CA}']
procedure SetSize(NewSize: Longint);
function Write(const Buffer; Count: Longint): Longint;
function Read(var Buffer; Count: Longint): Longint;
function Seek(Offset: Longint; Origin: Word): Longint;
procedure Clear;
//procedure LoadFromStream(Stream: IStream);
//procedure SaveToStream(Stream: IStream);
//procedure LoadFromFile(const FileName: WideString);
//procedure SaveToFile(const FileName: WideString);
property Position: Int64 read GetPosition write SetPosition;
property Size: Int64 read GetSize write SetSize64;
end;
(das ist soein Trick, welchen ich im Zusammenhang mit meinen
XML-Klassen mal gelernt hatte)