为Delphi 7编译HtmlViewer组件时出错
我正在尝试为Delphi7编译HtmlViewer组件。打开包子目录下的项目Frameviewer7.dpk 但是,我遇到以下编译错误: HtmlBuffer.pas1611:需要数组类型 对应于以下代码:为Delphi 7编译HtmlViewer组件时出错,delphi,delphi-7,Delphi,Delphi 7,我正在尝试为Delphi7编译HtmlViewer组件。打开包子目录下的项目Frameviewer7.dpk 但是,我遇到以下编译错误: HtmlBuffer.pas1611:需要数组类型 对应于以下代码: if FStart.BytePtr[0] = 0 FStart定义为FStart:TBuffPointer 我不确定这里出了什么问题。我的编译器是Delphi7FStart。BytePtr[0]表示FStart.BytePtr是一个数组,此表达式的值是该数组中的第一个0元素 但是,FS
if FStart.BytePtr[0] = 0
FStart定义为FStart:TBuffPointer
我不确定这里出了什么问题。我的编译器是Delphi7FStart。BytePtr[0]表示FStart.BytePtr是一个数组,此表达式的值是该数组中的第一个0元素
但是,FStart.BytePtr实际上是一个指针。但是,通常可以使用数组和指针来完成相同的任务—或者使用TSomeType数组,或者使用指向内存中TSomeType项列表中第一个元素的指针
我想这就是这里发生的事情。因此,您需要获取字节值列表的第一项,第一项出现在地址FStart.BytePtr。要获取此位置的字节,请使用^:FStart.BytePtr^取消对指针的引用
您找到的代码尝试使用指针上的数组表示法访问数据。这种语法糖可能适用于某些较新版本或Delphi,或者使用某些编译器选项。我不记得了。FStart.BytePtr[0]表示FStart.BytePtr是一个数组,并且这个表达式的值是这个数组中的第一个0元素
但是,FStart.BytePtr实际上是一个指针。但是,通常可以使用数组和指针来完成相同的任务—或者使用TSomeType数组,或者使用指向内存中TSomeType项列表中第一个元素的指针
我想这就是这里发生的事情。因此,您需要获取字节值列表的第一项,第一项出现在地址FStart.BytePtr。要获取此位置的字节,请使用^:FStart.BytePtr^取消对指针的引用
您找到的代码尝试使用指针上的数组表示法访问数据。这种语法糖可能适用于某些较新版本或Delphi,或者使用某些编译器选项。我不记得了。此语法使用了后来的Delphi编译器的一个功能,允许您使用索引引用来偏移类型指针。在某些版本的Delphi中,这需要指定POINTERMATH编译器选项或指令 不幸的是,Delphi7不支持这一点 解决此问题的典型方法是使用数组类型并声明指向此数组类型的指针。数组类型的实际边界并不重要,因为您将使用指针类型,因此不会创建实际的大型数组结构,只将指针视为对此类结构的引用 唯一需要考虑的是,上限需要高于或等于您需要指定的最高索引,以使编译器满意您指定的任何文本索引都可能有效 i、 e.如果指定的数组仅包含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
当然,同样的技术也可以根据需要应用于其他指针类型。此语法使用了更高版本的Delphi编译器的一个功能,允许您使用索引引用作为类型指针的偏移量。在某些版本的Delphi中,这需要指定POINTERMATH编译器选项或指令 不幸的是,Delphi7不支持这一点 解决此问题的典型方法是使用数组类型并声明指向此数组类型的指针。数组类型的实际边界并不重要,因为您将使用指针类型,因此不会创建实际的大型数组结构,只将指针视为对此类结构的引用 唯一需要考虑的是,上限需要高于或等于您需要指定的最高索引,以使编译器满意您指定的任何文本索引都可能有效 i、 e.如果指定的数组仅包含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
当然,同样的技术也可以根据需要应用于其他指针类型。FStart.BytePtr^=0可能会起作用。@AndreasRejbrand感谢您纠正了错误。如果你加上这个作为回答,我会接受的。但是,我并不确定这两种语法之间的区别,我的Delphi知识非常差。FStart.BytePtr^=0可能会起作用。@AndreasRejbrand感谢您纠正了错误。如果你加上这个作为回答,我会接受的。然而,我并不确定这两种语法之间的区别。我的Delphi知识很差。对于PByte,它将在没有编译器选项的较新版本中工作。对于其他类型,它需要{$POINTERMATH ON}选项。Delphi7还没有这个功能。对于PByte,它将在没有编译器选项的新版本中工作。对于其他类型,它需要{$POINTERMATH ON}选项。Delphi7还没有这个。