【问题标题】:Error compiling HtmlViewer component for Delphi 7为 Delphi 7 编译 HtmlViewer 组件时出错
【发布时间】:2016-08-17 16:30:33
【问题描述】:

我正在尝试为 Delphi 7 (https://github.com/BerndGabriel/HtmlViewer) 编译 HtmlViewer 组件。打开包子目录下的项目Frameviewer7.dpk

但是我收到以下编译错误: HtmlBuffer.pas(1611):需要数组类型。

对应如下代码:

 if FStart.BytePtr[0] = 0 

而FStart定义为FStart: TBuffPointer;

TBuffPointer = record
    case Integer of
      0: (BytePtr: PByte;);
      1: (WordPtr: PWord;);
      2: (AnsiChr: PAnsiChar;);
      3: (WideChr: PWideChar;);
    end;

不知道这里出了什么问题。我的编译器是Delphi7

【问题讨论】:

  • FStart.BytePtr^ = 0 可能会起作用。
  • @AndreasRejbrand 感谢您纠正了错误。如果您将此添加为答案,我将接受。但是不太确定这两种语法之间的区别(我的 Delphi 知识很差)。

标签: delphi delphi-7


【解决方案1】:

FStart.BytePtr[0] 表示FStart.BytePtr 是一个数组,这个表达式的值是这个数组的第一个(第0个)元素。

然而,FStart.BytePtr 实际上是一个指针。但通常你可以使用数组和指针来完成相同的任务——要么使用TSomeType 的数组,要么使用指向TSomeType 项目的内存列表中的第一个元素的指针。

我认为这就是这里发生的事情。因此,您想要获取byte 值列表的第一项,第一项出现在地址FStart.BytePtr。要在此位置获取 byte,请使用 ^ 取消引用指针:FStart.BytePtr^

您找到的代码尝试使用指针上的数组表示法访问数据。这种语法糖可能在一些较新的版本或 Delphi 中工作,或者使用一些编译器选项。 (我不记得了。)

【讨论】:

  • 对于PByte,它可以在没有编译器选项的较新版本中工作。对于其他类型,它需要{$POINTERMATH ON} 选项。 Delphi 7 还没有这个。
【解决方案2】:

这种语法使用了后来的 Delphi 编译器的一个特性,它允许您使用索引引用来表示类型指针的偏移量。在某些版本的 Delphi 中,这需要指定 POINTERMATH 编译器选项或指令。

很遗憾,这在 Delphi 7 中不受支持。

解决此问题的典型方法是使用数组类型并声明指向该数组类型的指针。数组类型的实际边界并不重要(从某种意义上说,您将使用指针类型,因此您不会创建实际的大型数组结构,只是将指针视为对此类结构的引用)。

唯一的考虑是上限需要高于或等于您需要指定的最高索引,以使编译器对您指定的任何文字索引可能有效感到满意。

即如果您指定了一个仅包含 100 个项目的数组,那么任何尝试引用第 101 个项目的代码都将在编译时或运行时(如果启用运行时检查)的边界检查失败。

因此,作为一个简单的示例,我们将使用一个包含 65535 个项目的数组:

const
  MAX_BYTEARRAYDIM = 65535;

type
  TByteArray = array[0..MAX_BYTEARRAYDIM] of Byte;
  PByteArray = ^TByteArray;


procedure SomeExampleMethod;
var
  pb: PByteArray;
begin
  // ..

  pb[12] := 25;  // The array type is 0 based so this sets the value of byte offset 12 bytes from the address in pb
end;

这具有可移植到所有版本的 Delphi 的优点(应该是您的代码中的一个问题)。

在您的案例中的应用

在您的具体情况下,您可以通过这种方式重新定义 BytePtr 类型。不熟悉 HTMLViewer 代码我不能说这是否可行。

另一种方法是声明必要的数组和指针类型,并在需要时进行类型转换,例如:

if PByteArray(FStart.BytePtr)[0] = 0

当然,同样的技术可以根据需要应用于其他指针类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多