Delphi 6 TListBox OnMeasureItem () и OnDrawItem () никогда не вызывались для списка lbOwnerDrawVariable () - PullRequest
3 голосов
/ 13 декабря 2011

У меня есть приложение Delphi 6 с элементом управления TListBox, установленным в lbOwnerDrawVariable. Во время выполнения я добавляю одну строку в список. У меня есть обработчики событий для OnMeasureItem () и OnDrawItem (), и я устанавливаю точки останова в самой первой строке кода в каждом обработчике событий. Однако ни один из них никогда не называется. Ни разу. Даже если я сделаю явный вызов Refresh или Repaint в списке.

Это действительно базовые вещи, так что же я делаю неправильно, что может препятствовать вызову этих обработчиков событий и впоследствии нарушать мой код рисования владельца? Одна строка действительно отображается в списке правильно. Я добавил обработчик события OnClick (), чтобы посмотреть, работает ли он.

Ответы [ 5 ]

4 голосов
/ 13 декабря 2011

События OnMeasureItem и OnDrawItem (косвенно) инициируются в ответ на сообщения WM_MEASUREITEM и WM_DRAWITEM из Windows. Убедитесь, что в вашем приложении нет обработчиков сообщений, отфильтровывающих это сообщение, или внутренних сообщений VCL CN_MEASUREITEM и CN_DRAWITEM.

2 голосов
/ 13 декабря 2011

Оказывается, проблема была в ненулевом значении свойства Columns TListBox, который я использовал. Я экспериментировал с использованием столбцов ранее, перед тем как перейти к отображению владельца и оставил свойство TListBox.Columns с ненулевым значением. Очевидно, ненулевое значение свойства Columns запрещает запуск события, связанного с рисованием владельца. Как только я установил это свойство в ноль, OnMeasureItem () и OnDrawItem () начали срабатывать.

1 голос
/ 01 апреля 2014

У меня была такая же проблема: мой обработчик события OnDrawItem не вызывался, если свойство Columns отличалось от нуля. Оказалось, это потому, что для свойства Style было установлено значение lbOwnerDrawVariable. Переменная высота элемента не допускается в сочетании с несколькими столбцами, предположительно потому, что строки не будут выстраиваться по столбцам, если высота элементов будет разной. Как только свойство Style было установлено в lbOwnerDrawFixed, обработчик события OnDrawItem был вызван, как и ожидалось.

1 голос
/ 13 декабря 2011

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

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

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

0 голосов
/ 10 июля 2014

У меня была похожая проблема с комбинированным списком в стиле csOwnerDrawVariable, не вызывающим событие OnMeasureItem.Как предположил Дэвид Хеффернан, проблема заключалась в том, что элементы были добавлены в список во время разработки.Обходной путь, который я использовал в итоге, заключался в добавлении кода в обработчик событий FormCreate, чтобы скопировать список времени разработки во временную переменную, затем очистить список и добавить элементы обратно.Клудги, но эффективны.

...