如何解决这个TVirtualStringTree Onheaderclick不兼容的参数?

时间:2015-02-09 06:48:20

标签: delphi virtualtreeview tvirtualstringtree

我在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系统上测试了相同的项目。当我点击标题时,它提示错误。我从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?

我点击否并运行测试程序。当我点击标题时,它会提示“访问违规...”

它提示以下错误:

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

    ......
    ......

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您附加的方法vtHeaderClick的参数与OnHeaderClick的必需参数不匹配。由于.dfm文件中定义的属性是使用RTTI分配的,因此编译器无法检查事件处理程序签名是否正确。如果运气不好,您只能在运行时发现运行时错误。

在VTV源中查找OnHeaderClick的声明,并将所需的签名与您的方法进行比较。你会发现它们不匹配。然后,您需要更改vtHeaderClick以匹配。

让IDE帮助您的一种方法是删除Object Inspector中OnHeaderClick的处理程序。然后双击OnHeaderClick,IDE将生成具有正确签名的事件处理程序存根。

我不知道正确的签名是什么。我可以查一查,但话又说回来,你也可以。我想用这个答案做的就是向你展示出了什么问题并教你如何解决一般问题,而不仅仅是这个问题。