4

我有一些用于旧版本 RADStudio 的派生 Stream 类,它们只是重新实现了 Read、Write、Seek 方法以及 Size 和 Position 属性。

我希望将这些移植到 XE3,但我看到现在(例如)有三个重载Read- 原来的一个,加上两个以 TBytes 作为参数的重载。

德尔福

function Read(var Buffer; Count: Longint): Longint; overload; virtual;
function Read(Buffer: TBytes; Offset, Count: Longint): Longint; overload; virtual;
function Read(var Buffer: TBytes; Count: Longint): Longint; overload;

C++

virtual int __fastcall Read(void *Buffer, int Count)/* overload */;
virtual int __fastcall Read(System::DynamicArray<System::Byte> Buffer, int Offset, int Count)/* overload */;
int __fastcall Read(System::DynamicArray<System::Byte> &Buffer, int Count)/* overload */;

我需要实现所有三个,还是只实现一个?如果只有一个,哪一个......?

通常我可以从 VCL 源代码中找到它,但目前我刚刚获得了试用版(无源代码)。

4

2 回答 2

6

您只需要使用这些签名实现方法 read 和 write

function Read(var Buffer; Count: Longint): Longint; overload; virtual;
function Write(const Buffer; Count: Longint): Longint

因为使用TBytes(and System::DynamicArray<System::Byte>) 作为参数的重载版本在内部调用了上述版本的 Read 和 Write。

于 2012-12-18T14:16:30.480 回答
6

您需要覆盖的最少的虚拟TStream方法是:

function Read(var Buffer; Count: Longint): Longint; overload; virtual;
function Write(const Buffer; Count: Longint): Longint; overload; virtual;
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; virtual;

如果您想支持分配给Size您需要覆盖的属性:

procedure SetSize(NewSize: Longint); overload; virtual;
procedure SetSize(const NewSize: Int64); overload; virtual;

32位的实现SetSize必须调用64位SetSize。而 64 位SetSize的工作。

如果您不覆盖这些方法,那么分配给流的Size属性将无声无息地执行任何操作。

于 2012-12-18T15:39:07.230 回答