Как обрабатывать автоматический размер столбца по умолчанию в TListView с помощью OwnerData true

У меня есть TListView (в режиме отчета), который я использую в виртуальном режиме (OwnerData:= True). Все работает хорошо, за исключением двух известных мне ситуаций с автоматическим автоматическим размером столбцов. Они есть:

  1. Двойной щелчок по разделителю столбца заголовка, чтобы автоматически изменить размер одного столбца
  2. Клавиша Ctrl-KeypadPlus для автоматического изменения размера всех столбцов.

Обработка этих событий по умолчанию в виртуальном режиме на самом деле не работает (кажется, автоматически изменяется размер первой строки данных). Я хотел бы подключиться к поведению и выполнить автоматическое изменение размера столбца. Кто-нибудь знает как это сделать? Или, может быть, я упускаю что-то очевидное? Я использую Delphi XE. Спасибо за любые предложения.


person MarkF    schedule 29.01.2012    source источник
comment
Что-то подобное здесь stackoverflow.com/q/9255540/960757   -  person TLama    schedule 01.03.2012


Ответы (1)


Автоматическое изменение размера столбцов для элементов управления представлением виртуального списка выполняется с использованием всех элементов, видимых во время выполнения операции автоматического изменения размера. Это поведение элемента управления Delphi TListView. Попробуйте выполнить ту же операцию в проводнике, и вы легко увидите, что это стандарт операционной системы.

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

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


Ваша проблема связана с ошибкой Windows XP. Насколько я вижу, представления виртуального списка не выполняют корректное автоматическое изменение размера в XP. Я думаю, что проводник переключился с невиртуального на виртуальный между XP и Vista, и я готов поспорить, что у команды исследователей было достаточно внутренних рычагов, чтобы решить проблему.

Насколько я знаю, вы не уведомлены о том, что происходит автоматическое изменение размера, поэтому я думаю, что вам может быть сложно решить эту проблему. Если вы хотите продолжить это, вы можете попытаться ответить на HDN_DIVIDERDBLCLICK уведомление для элемента управления заголовком и список для CTRL +. Однако я не уверен, принесет ли такой подход какую-либо радость.

person David Heffernan    schedule 29.01.2012
comment
Спасибо, Дэвид. Я не уверен, какой метод он использует, но в моей системе XP он, похоже, не использует видимые строки для автоматического изменения размера (или измеряет неправильно, по-видимому, устанавливая его меньше, так что я получаю много эллипсов, иногда на несколько символов, а иногда и больше.) В любом случае, мой вопрос заключается в том, как контролировать поведение, поскольку значение по умолчанию не соответствует моим потребностям. - person MarkF; 30.01.2012
comment
Я экспериментировал с Windows 7. Я взгляну на компьютер с XP. чтобы увидеть, как он себя ведет. - person David Heffernan; 30.01.2012
comment
Спасибо, я ценю ваше обновление. Моя основная машина для разработчиков - XP, но, конечно, я планирую обновиться до Win 7 64bit, чтобы я мог играть с XE2. Я видел несколько сообщений на форуме для С++, в которых упоминалось, что им пришлось использовать свой собственный элемент управления заголовком, чтобы обойти эту проблему, поэтому я думаю, что вы можете быть правы насчет отсутствия радости... Я просто удивлен, поскольку это похоже на то, что было бы полезно переопределить. - person MarkF; 30.01.2012