C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TDBLookupComboBox и DropDownWidth, как автоматизировать подбор ширины
Nichka
Отправлено: 20.01.2005, 18:28


Не зарегистрирован







Столкнулся с такой проблемой у TDBLookupComboBox:
В списке DropDown есть строки длиннее значения свойства DropDownWidth (по умолчанию 0) и эти строки естественно не читаются.
Как лучше сделать так чтобы они были видны?

Придумал несколько вариантов:
1. Самый тупой. Поставить наиболее вероятное значение DropDownWidth.
Недостаток: возможно все-таки появятся строки длиннее заданного значения, а возможно наоборот, будет некрасивое пустое пространство.

2. Во время открытия списка (OnDropDown) проглядеть все значения нужного поля в таблице, выбрать максимальную длинну и присвоить ее DropDownWidth.
Замечу, что свойства Items нет у TDBLookupComboBox, поэтому надо глядеть значения именно из таблицы.
А не будет ли это сильно тормозить?

3. Можно усовершенствовать второй вариант и изначально значение DropDownWidth определить после открытия таблицы и в дальнейшем следить за изменениями в таблице.
Если много DBLookupComboBox связанных с разными таблицами, то сильно возможно захламит код.

Эти варианты лего реализуются, но имеют свои недостатки.
Может есть какие другие гениальные решения?

Еще хотелось бы узнать:
Возможно ли сделать так, чтобы пользователь сам мог менять размер выпадающего листа (примерно так же как это делается со столбцами в TDBGrid)?
И возможно сделать так, чтобы при наведении курсора на какую-либо запись в выпадающем листе, если эта запись видна не полностью, то возникал бы Hint с этой полной строкой?
olegenty
Отправлено: 21.01.2005, 08:02


Ветеран

Группа: Модератор
Сообщений: 2412



установить бы тебе EhLib, проблемы бы все и забылись ))
xim
Отправлено: 21.01.2005, 09:47


Станционный диспетчер

Группа: Участник
Сообщений: 143



Еще вариант:
Создать новый компонент, наследуемый от TDBLookupComboBox
с методом Add:
CODE

int __fastcall TMyDBLookupComboBox::Add(AnsiString str)
{
 int len=str.Length();
 if(len>DropDownWidth&&
    <дополнительные условия>
/**********************************************
нужны для того, чтобы выпадающий список не вылазил
за видимую область
**********************************************/
   
    )DropDownWidth=len;
 TDBLookupComboBox::Add(str);
}

Вернуться в Работа с базами данных в C++Builder