![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TComboBox, высота выпадающего списка при изменении Items [D6, WinXP]
API © (2006-03-13 13:27:00)ComboBox.Style = csDropDown;
При вводе пользователем строки, список перезагружается - в зависимости от введенного пользователем значения (аналог - строка адреса в IE, где список содержит историю открытых URL, совпадающих с введенным значением). То есть, при вводе первого символа выпадает список, содержащий соответствующие значения. При вводе последующих символов - список перезагружается (дополнительно фильтруется). Естественно, меняется количество строк в Items и в выпавшем списке. И наступает ситуация, когда в списке может остаться 0-1-2 значения, но высота самого выпадающего списка остается той, что была при его выпадении.
Вопрос: Как изменить высоту уже выпавшегосписка, в зависимости от количества строк в списке?
DropDownCount - не оказывает действия.
DroppedDown := false; DroppedDown := true; - помогает, но сопровождается мгновенным закрытием/открытием списка, что не есть хорошо.
Кроме того, наблюдается "нехорошее" поведение указателя мыши - он может или вообще исчезать, или "подвисать", переставая реагировать на низлежащие строку ввода(для выделения текста)/список (стрелка).
То есть, сопутствующий вопрос: что делать с указателем?
Игорь Шевченко (2006-03-13 17:15:00) [1]API © (13.03.06 16:52) [5]
А, я очень извиняюсь, ComboBoxEx нельзя использовать ? Ведь в адресной строке IE именно он...
API (2006-03-13 16:52:00) [2]После каких именно действий наблюдается такая беда ?
Как только вводится первый символ и выпадает список - указатель мыши исчезает или "зависает". Не видно его только на формах приложения, в других приложениях - виден. После того, как список свернется - курсор появляется вновь.
У меня возникает подозрение, что это как-то связано с изменением Items (загрузкой нового списка) в тот момент, когда список открыт.
Почему? Теряюсь в догадках.
Игорь Шевченко (2006-03-13 15:40:00) [3]
> У TCustomCombo поле FListHandle объявлено в секции protected.
Это смотря для каких версий Delphi...
> Кроме того, наблюдается "нехорошее" поведение указателя
> мыши - он может или вообще исчезать, или "подвисать", переставая
> реагировать на низлежащие строку ввода(для выделения текста)/список
> (стрелка).
После каких именно действий наблюдается такая беда ?
API (2006-03-13 15:24:00) [4]М-да.
m_ListHandle можно убрать и WndProc - тоже.
У TCustomCombo поле FListHandle объявлено в секции protected.
API (2006-03-13 15:19:00) [5][1] Игорь Шевченко © (13.03.06 14:14)
Спасибо большое!
Вот, если кому понадобится:
unit RSComboBoxEx;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
TRSComboBoxEx = class(TComboBox)
private
m_ListHandle: cardinal;
procedure
protected
procedure SetItems(const a_Items: TStrings); override;
procedure WndProc(var Message: TMessage); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('RS', [TRSComboBoxEx]);
end;
procedure TRSComboBoxEx.SetItems(const a_Items: TStrings);
var
iCount: integer;
begin
inherited SetItems(a_Items);
if DroppedDown then
begin
if (a_Items.Count < DropDownCount) then
if (a_Items.Count = 0) then
iCount := 1
else
iCount := a_Items.Count - 1
else
iCount := DropDownCount;
SetWindowPos(m_ListHandle, 0, 0, 0, Width, ItemHeight * iCount +
Height + 2, SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE);
end;
end;
procedure TRSComboBoxEx.WndProc(var Message: TMessage);
begin
if (Message.Msg = WM_CTLCOLORLISTBOX) and (FListHandle = 0) then
m_ListHandle := HWND(Message.LParam);
inherited;
end;
end.
Решение не универсальное.
А с курсором все та же беда... исчезает.
Игорь Шевченко (2006-03-13 14:14:00) [6]
> Как изменить высоту уже выпавшего списка, в зависимости
> от количества строк в списке?
SetWindowPos у ListHandle ComboBox'а ?
ListHandle можно взять например методом, описанным в http://www.delphikingdom.com/asp/viewitem.asp?catalogid=566