2013-09-27 2 views
2

Почему Delphi StringGrid иногда вызывает событие OnClick после OnKeyDown?TStringGrid: Почему OnClick после OnKeyDown

Debugging скриншот:

enter image description here

Мой OnKeyDown обработчик события:

var 
    Top: Integer; 
    Bottom: Integer; 
    CurrentRow: Integer; 
begin 
    Top := Grid.TopRow; 
    Bottom := Grid.TopRow + Grid.VisibleRowCount - 1; 
    if (Key = 38) then CurrentRow := Grid.Row - 1 
    else if (Key = 40) then CurrentRow := Grid.Row + 1; 

    // Disable OnClick because sometimes a 'TStringGrid.Click' is called anyway... 
    // (when clicking on form top window bar and navigating) 
    Grid.OnClick := nil; 

    if (CurrentRow < Top - 1) or (CurrentRow > Bottom + 1) then begin 
    if (Key = 38) then Grid.Row := Bottom 
    else if (Key = 40) then Grid.Row := Top; 
    end; 
    Grid.OnClick := GridClick; 
end; 

Edit:

Это кажется 'OnClick' не увольняют, когда последняя строка выбирается и нажимает «Вниз» или когда выбрана первая линия и нажимается «Вверх».

Способ воспроизведения:

Добавить TStringGrid в форму и заполнить несколько строк. Добавьте обработчик OnClick и OnKeyDown. В этих двух методах обработчика не нужно добавлять специальный код. Выберите строку в stringgrid в форме и нажмите стрелку вверх или вниз на клавиатуре.

Edit 2:

Это не решение, но, чтобы предотвратить код «OnClick» выполняется после нажатия кнопки вверх, вниз, ВВЕРХ или ВНИЗ, я установить переменную в «OnKeyDown» что нажата клавиша и проверьте эту переменную в «OnClick».

Edit 3:

Обновлено трассировки стека и способ воспроизведения.

+0

Какая версия Delphi? В «TCustomGrid.KeyDown» в XE3 нет ничего, что вызывает «TControl.Click». И было бы слишком много, чтобы попросить способ воспроизвести это? –

+0

Delphi XE3. Я добавил способ воспроизвести это описание. – user729103

+0

Ваше воспроизведение неполное. Какие ключи вам нужно нажать? Опишите точные шаги по воспроизведению. –

ответ

4

Хорошо, что коды с жестко запрограммированными клавишами не соответствуют действительности, но вы являетесь свидетелем этого эффекта, когда вы используете клавишу направления (вверх, вниз, влево и т. Д.), Чтобы изменить выбор.

Почему обработчик OnClick событие вызывается, происходит потому, что TCustomGrid.OnKeyDown звонки TCustomGrid.FocusCell, который называет Click.

Именно поэтому изменение фокусировки на другую ячейку создало бы . Я не знаю, мы должны были спросить разработчиков, которых я себе представляю. Возможно, чтобы имитировать поведение по умолчанию при смене фокуса на другую ячейку, щелкнув вместо клавиатуры.

Поскольку вы, кажется, справиться с основным направлением прижимает себя, может быть, вы могли бы рассмотреть, чтобы предотвратить это происходит на всех, игнорируя ключ дальше:

if Key in [VK_PRIOR..VK_DOWN] then 
    Key := 0; 
+0

Действительно, в моей тестовой программе я вижу «TCustomGrid».FocusCell 'в трассировке стека перед тем, как перейти в «Click». – user729103

+1

@ user729103 Ваш скриншот в вопросе не показывает это. Большая часть моей проблемы с этим вопросом заключается в том, что ваш стек вызовов в вопросе не соответствует реальному стеку вызовов. –

Смежные вопросы