Представление дерева Delphi с флажками: иногда флажки невидимы - PullRequest
3 голосов
/ 24 августа 2011

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

TVS_CHECKBOXES устанавливается с помощью SetWindowLong.В методе Loaded я устанавливаю / поддерживаю проверенные состояния с помощью StateIndex := 2;, Item.State := TVIS_CHECKED и т. Д.

Пока все хорошо.Но теперь кто-то связался со мной, где флажки в виде дерева не показывают вообще на его WindowsXP SP3.(Он даже предоставил мне снимок экрана.) По поведению программы я могу сказать, что проверенные по умолчанию узлы работают, поскольку программа, в отличие от описания клиента, ведет себя как ожидалось.

Мне не удалось найти подобноесимптомы описаны где угодно.Все компьютеры, на которых я тестировал, работают хорошо.Но скриншот от клиента показывает, что есть проблема: (

Я думаю, что некоторые RecreateWnd в некоторых системах сбрасывают режим флажка treeview?

Мои варианты тестированияограниченный, поскольку я не могу воспроизвести проблему на своих компьютерах, поэтому хотел бы знать, есть ли у других предложения, которые я могу попробовать, прежде чем отправлять новый бета-код человеку, система которого, кажется, скрывает флажки дерева просмотра?

1 Ответ

3 голосов
/ 24 августа 2011

Установка этого стиля в переопределении CreateWnd может быть слишком поздно в соответствии с документацией :

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

Теперь, это похоже на небольшую дилемму с яйцом и курицей, потому что VCL не дает реального решения для этого точного момента времени. Установка этого стиля перед унаследованным вызовом CreateWnd невозможна, потому что пока нет дескриптора. Но после унаследованного вызова дерево уже может быть заселено из-за отдыха. (VCL направляет узлы обратно в TCustomTreeView.CreateWnd).

Но так как это выглядит просто как простая модификация стиля, вы можете (также) попробовать переопределить CreateParams и добавить этот флаг к Params.Style, который здесь работает так же хорошо.

procedure TMyTreeView.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or TVS_CHECKBOXES;
end;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...