我正在尝试编译用于Delphi7的HtmlViewer组件(https://github.com/BerndGabriel/HtmlViewer)。在package下打开项目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
发布于 2016-08-17 16:58:13
FStart.BytePtr[0]表示FStart.BytePtr是一个数组,该表达式的值是该数组中的第一个(第0)元素。
然而,FStart.BytePtr实际上是一个指针。但是通常您可以使用数组和指针来完成相同的任务--要么使用TSomeType数组,要么使用指向内存中TSomeType项列表中的第一个元素的指针。
我想这就是这里发生的事。因此,您希望获得byte值列表的第一项,第一项发生在address FStart.BytePtr。要在这个位置获得byte,可以使用^:FStart.BytePtr^取消指针的引用。
找到的代码试图使用指针上的数组符号访问数据。这个语法糖可能在一些较新的版本或Delphi中工作,或者使用一些编译器选项。(我不记得了。)
发布于 2016-08-17 21:25:49
这个语法使用了以后的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当然,可以根据需要将同样的技术应用于其他指针类型。
https://stackoverflow.com/questions/39001905
复制相似问题