如何解决这个 TVirtualStringTree Onheaderclick 不兼容参数?
How to solve this TVirtualStringTree Onheaderclick incompatible parameter?
我在 Delphi 7.0 Windows XP 2 上测试了 Mike Lischke 的 TVirtualStringTree(版本 4.8.7)。它工作正常。我在另一台机器(Delphi 7.0 Windows XP 3 系统)上安装了相同的 TVirtualStringTree (v.4.8.7),并在 Windows XP 3 系统上测试了同一个项目。当我点击header时,提示错误。我从 Delphi 7.0 Windows XP 3 中删除了 TVirtualStringTree(版本 4.8.7),并在 Windows XP 3 上安装了更高版本的 TVirtualStringTree(版本 5.3.0)。同样的问题仍然存在.
当我在 Windows XP 3 上构建项目时,它提示如下:
The vtHeaderClick method referenced by vt.Onheaderclick has an incompatible parameter list. Remove the reference?
我点击了否并运行测试程序。当我单击 header 时,它提示“...访问冲突”
并提示如下错误:
function TVTHeader.HandleMessage(var Message: TMessage): Boolean;
// The header gets here the opportunity to handle certain messages before they reach the tree. This is important
// because the tree needs to handle various non-client area messages for the header as well as some dragging/tracking
// events.
// By returning True the message will not be handled further, otherwise the message is then dispatched
// to the proper message handlers.
var
P: TPoint;
R: TRect;
I: TColumnIndex;
OldPosition: Integer;
HitIndex: TColumnIndex;
NewCursor: HCURSOR;
Button: TMouseButton;
Menu: TPopupMenu;
IsInHeader,
IsHSplitterHit,
IsVSplitterHit: Boolean;
//--------------- local function --------------------------------------------
function HSPlitterHit: Boolean;
var
NextCol: TColumnIndex;
......
......
case Message.Msg of
WM_LBUTTONUP:
with TWMLButtonUp(Message) do
begin
if FColumns.FDownIndex > NoColumn then
FColumns.HandleClick(Point(XPos, YPos), mbLeft, False, False);
if FStates <> [] then // this line is highlighted
FOwner.DoHeaderMouseUp(mbLeft, KeysToShiftState(Keys), XPos, YPos);
end;
WM_NCLBUTTONUP:
with TWMNCLButtonUp(Message) do
begin
......
......
我该如何解决这个问题?
您附加的方法 vtHeaderClick
的参数与 OnHeaderClick
所需的参数不匹配。因为 .dfm 文件中定义的属性是使用 RTTI 分配的,所以编译器没有机会检查事件处理程序签名是否正确。如果幸运的话,您只会在运行时发现运行时错误。
在 VTV 源中找到 OnHeaderClick
的声明,并将所需的签名与您的方法的签名进行比较。你会发现它们不匹配。然后您需要更改 vtHeaderClick
以匹配。
让 IDE 帮助您的一种方法是在对象检查器中删除 OnHeaderClick
的处理程序。然后双击 OnHeaderClick
,IDE 将生成一个具有正确签名的事件处理程序存根。
我不知道正确的签名是什么。我可以查一下,但话又说回来,你也可以。我试图用这个答案做的是向您展示出了什么问题,并教您如何解决一般问题,而不仅仅是这个特定问题。
我在 Delphi 7.0 Windows XP 2 上测试了 Mike Lischke 的 TVirtualStringTree(版本 4.8.7)。它工作正常。我在另一台机器(Delphi 7.0 Windows XP 3 系统)上安装了相同的 TVirtualStringTree (v.4.8.7),并在 Windows XP 3 系统上测试了同一个项目。当我点击header时,提示错误。我从 Delphi 7.0 Windows XP 3 中删除了 TVirtualStringTree(版本 4.8.7),并在 Windows XP 3 上安装了更高版本的 TVirtualStringTree(版本 5.3.0)。同样的问题仍然存在.
当我在 Windows XP 3 上构建项目时,它提示如下:
The vtHeaderClick method referenced by vt.Onheaderclick has an incompatible parameter list. Remove the reference?
我点击了否并运行测试程序。当我单击 header 时,它提示“...访问冲突”
并提示如下错误:
function TVTHeader.HandleMessage(var Message: TMessage): Boolean;
// The header gets here the opportunity to handle certain messages before they reach the tree. This is important
// because the tree needs to handle various non-client area messages for the header as well as some dragging/tracking
// events.
// By returning True the message will not be handled further, otherwise the message is then dispatched
// to the proper message handlers.
var
P: TPoint;
R: TRect;
I: TColumnIndex;
OldPosition: Integer;
HitIndex: TColumnIndex;
NewCursor: HCURSOR;
Button: TMouseButton;
Menu: TPopupMenu;
IsInHeader,
IsHSplitterHit,
IsVSplitterHit: Boolean;
//--------------- local function --------------------------------------------
function HSPlitterHit: Boolean;
var
NextCol: TColumnIndex;
......
......
case Message.Msg of
WM_LBUTTONUP:
with TWMLButtonUp(Message) do
begin
if FColumns.FDownIndex > NoColumn then
FColumns.HandleClick(Point(XPos, YPos), mbLeft, False, False);
if FStates <> [] then // this line is highlighted
FOwner.DoHeaderMouseUp(mbLeft, KeysToShiftState(Keys), XPos, YPos);
end;
WM_NCLBUTTONUP:
with TWMNCLButtonUp(Message) do
begin
......
......
我该如何解决这个问题?
您附加的方法 vtHeaderClick
的参数与 OnHeaderClick
所需的参数不匹配。因为 .dfm 文件中定义的属性是使用 RTTI 分配的,所以编译器没有机会检查事件处理程序签名是否正确。如果幸运的话,您只会在运行时发现运行时错误。
在 VTV 源中找到 OnHeaderClick
的声明,并将所需的签名与您的方法的签名进行比较。你会发现它们不匹配。然后您需要更改 vtHeaderClick
以匹配。
让 IDE 帮助您的一种方法是在对象检查器中删除 OnHeaderClick
的处理程序。然后双击 OnHeaderClick
,IDE 将生成一个具有正确签名的事件处理程序存根。
我不知道正确的签名是什么。我可以查一下,但话又说回来,你也可以。我试图用这个答案做的是向您展示出了什么问题,并教您如何解决一般问题,而不仅仅是这个特定问题。