【问题标题】:What are the underlying Read/Write methods for Streams in Delphi XE3Delphi XE3中流的底层读/写方法是什么
【发布时间】:2012-12-18 13:17:03
【问题描述】:

我有一些用于旧版本 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 源中找到它,但我目前刚刚获得试用版(无源)。

【问题讨论】:

  • 如果您的旧代码重新实现了 Size 和 Position 属性,那么您一直在做错事。这些属性已经通过虚拟方法正确实现。
  • @RobKennedy :可能 ;-) 我正在重新定义“Size”属性(这可能是不必要的),但使用了我自己的 GetSize/SetSize 方法。不确定我是否需要处理 Position 属性——在任何地方都看不到这样的例子......
  • Size 和 Position 都是根据 Seek 方法实现的。 Seek 有两个版本,它们实际上是抽象的,尽管您只需覆盖其中一个;无论您省略哪一项,都会根据另一项实施。
  • @RobKennedy - 不,您必须在 TStream 后代中覆盖 SetSize,至少在 Delphi XE 中(没有 XE3)。
  • @Serg 仅当您想分配给 size 以实际执行某些操作时,您才必须覆盖它。 Rob 表示默认的GetSize 实现使用Seek,这是准确的。当人们考虑SetSize时,他会偏离准确性。

标签: delphi delphi-xe3 tstream


【解决方案1】:

你只需要实现带有这些签名的读写方法

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

因为使用TBytes(和System::DynamicArray&lt;System::Byte&gt;)作为参数的重载版本在内部调用上述版本的读取和写入。

【讨论】:

    【解决方案2】:

    您需要覆盖的最低限度的虚拟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 属性将不会执行任何操作。

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多