2015-02-09 3 views
1

Я тестировал TVirtualStringTree (версия 4.8.7) от Mike Lischke на Delphi 7.0 Windows XP 2. Он отлично работает. Я установил тот же самый TVirtualStringTree (v.4.8.7) на другой компьютер (система Delphi 7.0 Windows XP 3) и протестировал этот же проект в системе Windows XP 3. Когда я нажал на заголовок, это вызвало ошибку. Я удалил TVirtualStringTree (версия 4.8.7) из Delphi 7.0 Windows XP 3 и установил более высокую версию TVirtualStringTree (версия 5.3.0) в Windows XP 3. Та же проблема все еще существовала.Как решить этот параметр TVirtualStringTree Onheaderclick несовместимый?

Когда я построил проект на 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

Введенный вами метод vtHeaderClick имеет параметры, которые не соответствуют требуемым параметрам для OnHeaderClick. Поскольку свойства, определенные в файле .dfm, назначаются с использованием RTTI, компилятор не имеет возможности проверить правильность подписи обработчика событий. Вы узнаете только во время выполнения, если вам повезет, с ошибкой во время выполнения.

Найти объявление OnHeaderClick в источнике VTV и сравнить требуемую подпись с сигналом вашего метода. Вы увидите, что они не совпадают. Затем вам нужно будет изменить vtHeaderClick.

Один из способов позволить IDE помочь вам удалить обработчик для OnHeaderClick в инспекторе объектов. Затем дважды щелкните OnHeaderClick, и среда IDE создаст заглушку обработчика событий с правильной подписью.

Я не знаю, что такое правильная подпись. Я мог посмотреть, но опять же, так и вы. То, что я пытаюсь сделать с этим ответом, - показать вам, что пошло не так, и научить вас, как решить общую проблему, а не только эту конкретную.

+0

Большое вам спасибо. Ваш ответ решает. – warren