[Форум] [Помощь] [Поиск] [Выйти] |
Добро пожаловать, User |
|
|
| ||
Проблема следующая: Список в комбобоксе формируется динамически, иногда возникает ситуация, когда строка не убирается в список по ширине. Необходимо при выборе элемента показывать строку, на которую наведён курсор ещё где-нибудь, например в статус баре, но я не нашёл события смены позиции курсора мыши. Как мне получить доступ к этому элементу? или может можно сделать ширину выпадающего списка зависимой от длины самой длинной строки? |
| ||
SPYWORKS поможет. Нужно ловить событие (субклассированием). |
| ||
Подробней плиз... не сталкивался с этой штукой |
| ||
Контрольчик SpyWorks http://www.desaware.com/products/universalnet/spyworks/index.aspx http://www.desaware.com/products/universalnet/demos.aspx или из комплекта VC++6.0 утилита Spy++ (desaware выпускало под любой язык, входящий в студию). Даёт возможность, отслеживать сообщения Windows. Можно и без них (но не безопасно) используя API: GetWindowLong SetWindowLong CallWindowProc PrevWndProc OldWindowProc |
| ||
Вся фигня в том, что прога на делфях.... остаётся только указанное апи? |
| ||
В данном случае с API нужно работать осторожно, бывает одна ошибка и делфи вместе с Windo-й придётся переустанавливать. Редко, зато как метко. Может, имеет смысл поискать другой Combobox, есть, наверное, сторонние производители. Может, имеет смысл сделать Combobox из двух текстовых полей (или текстовое поле + ListBox) и кнопки. |
| ||
а если изменять исходный код библиотеки? |
| ||
У меня даже кусок кода есть как это сделать, только я сам пытался не смог(не смог поймать WM_CTLCOLORLISTBOX черт знает когда эта зараза посылается rtfm не помог абсолютно..или у меня винда не стандартная ;(() - или руки,но могу предложить вариант лучше - создай свой компонент TCustomEdit+TSpeedButton+TListBox( TEnhComboBox = class(TCustomPanel)) - это самый будет простой, быстрый и безболезненный вариант - все нужные тебе свойства введешь и ненужное выкинешь..;)) |
| ||
Гораздо проще просто расширить список по горизонтали при его выводе. Делов-то.. |
| ||
Расширять список - не выход в моей ситуации, строка может быть очень длинная. |
| ||
В исходниках VCL нужно найти место, где выпадающий список перерисовывает элемент делая его выделенным. После этого можно найти место откуда вызывается эта перерисовка. Одним из мест будет реакция на перемещение мыши (в методе или в сообщении). Если это в методе и он не private, то создать собственный компонент-потомок от выпадающего списка и переопеделить метод (в случае protected методов сработает аномалия защиты). Если не удается переопределить, то создать компонент от предка выпадающего списка, скопировать из исходника весь код для этого компонента и изменить лишь нужное место, например, добавив событие. |
| ||
{ Расширять список - не выход в моей ситуации, строка может быть очень длинная. } Тогда ты выбрал неправильный компонент. Комбокс сам по себе просто неудобен для длинных значений. |
| ||
А я где то видел такой комбобокс, сам Edit у него маленький, а droplist широкий... Может там свойство какое есть? Вообще можно сделать popup-меню вместо комбобокса, которое тоже будет динамически менятся и попапаться по нажатию какой нить ToolButton, это легко делается Или просто отдельное окно-справочник... Ну как ты понял, я предлагаю альтернативные варианты интерфейса... |
| ||
А если попробовать hint использовать. Тогда при наведении на объект будет высвечиватьяс полное имя |
| ||
Так как имя в хинт-то получить?если список открыт, то фик ты нормальным способом получишь индекс выделенного элемента)) |