Ошибка рисования TTreeView при деактивации формы - PullRequest
7 голосов
/ 08 июня 2011

Я обнаружил ошибку, связанную с TTreeView.

  • Примите форму, содержащую TTreeView с HideSelection, установленным на True.
  • Сделайте множественный выбор древовидного представления и выберите несколько элементов в древовидном представлении.
  • Покажите другую форму, чтобы ваше приложение имело две формы.
  • Задайте фокус на древовидном представлении, а затем нажмите надругая форма.

Результат выглядит следующим образом:

enter image description here

Но на самом деле не должно быть выделенных элементов.Интересно, что последний элемент выбран, и он больше не выделяется, как и все остальные элементы.Похоже, что последний нажатый элемент - это тот, который получает специальную обработку.

Если вместо этого щелкнуть поле редактирования (или любой другой элемент управления, который фокусируется), то все элементы будут правильно скрыты.Поэтому вполне нормально, чтобы фокус переместился на другой элемент управления в форме - проблема, по-видимому, сводится к деактивации формы.

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

Итак, чтобы подвести итог,мои вопросы:

  1. Что именно вызывает проблему?
  2. Как я могу это исправить без написания кода, который перехватывает TForm события?

Отправил вопрос как QC # 94908 .

1 Ответ

9 голосов
/ 08 июня 2011

Решение, по-видимому, состоит в том, чтобы отвечать на уведомления NM_SETFOCUS и NM_KILLFOCUS путем аннулирования выбранных узлов. Вы можете изменить TCustomTreeView.CNNotify напрямую или написать нового потомка TCustomTreeView. Вот быстрый взлом только для того, чтобы показать отсутствующий код:

type
  TTreeView = class(ComCtrls.TTreeView)
  private
    procedure CNNotify(var Message: TWMNotifyTV); message CN_NOTIFY;
  end;

procedure TTreeView.CNNotify(var Message: TWMNotifyTV);
begin
  case Message.NMHdr^.code of
    NM_KILLFOCUS, NM_SETFOCUS:
      InvalidateSelectionsRects;
  end;
  inherited;
end;

Редактировать : отчет Дэвида QC .

...