Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

TComboBox, высота выпадающего списка при изменении Items   Найти похожие ветки 

 
API ©   (2006-03-13 13:27) [0]

ComboBox.Style = csDropDown;

При вводе пользователем строки, список перезагружается - в зависимости от введенного пользователем значения (аналог - строка адреса в IE, где список содержит историю открытых URL, совпадающих с введенным значением). То есть, при вводе первого символа выпадает список, содержащий соответствующие значения. При вводе последующих символов - список перезагружается (дополнительно фильтруется). Естественно, меняется количество строк в Items и в выпавшем списке. И наступает ситуация, когда в списке может остаться 0-1-2 значения, но высота самого выпадающего списка остается той, что была при его выпадении.

Вопрос: Как изменить высоту уже выпавшего списка, в зависимости от количества строк в списке?

DropDownCount - не оказывает действия.

DroppedDown := false; DroppedDown := true; - помогает, но сопровождается мгновенным закрытием/открытием списка, что не есть хорошо.

Кроме того, наблюдается "нехорошее" поведение указателя мыши - он может или вообще исчезать, или "подвисать", переставая реагировать на низлежащие строку ввода(для выделения текста)/список (стрелка).

То есть, сопутствующий вопрос: что делать с указателем?


 
Игорь Шевченко ©   (2006-03-13 14:14) [1]


> Как изменить высоту уже выпавшего списка, в зависимости
> от количества строк в списке?


SetWindowPos у ListHandle ComboBox"а ?

ListHandle можно взять например методом, описанным в http://www.delphikingdom.com/asp/viewitem.asp?catalogid=566


 
API ©   (2006-03-13 15:19) [2]

[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.


Решение не универсальное.

А с курсором все та же беда... исчезает.


 
API ©   (2006-03-13 15:24) [3]

М-да.

m_ListHandle можно убрать и WndProc - тоже.
У TCustomCombo поле FListHandle объявлено в секции protected.


 
Игорь Шевченко ©   (2006-03-13 15:40) [4]


> У TCustomCombo поле FListHandle объявлено в секции protected.


Это смотря для каких версий Delphi...


> Кроме того, наблюдается "нехорошее" поведение указателя
> мыши - он может или вообще исчезать, или "подвисать", переставая
> реагировать на низлежащие строку ввода(для выделения текста)/список
> (стрелка).


После каких именно действий наблюдается такая беда ?


 
API ©   (2006-03-13 16:52) [5]

После каких именно действий наблюдается такая беда ?

Как только вводится первый символ и выпадает список - указатель мыши исчезает или "зависает". Не видно его только на формах приложения, в других приложениях - виден. После того, как список свернется - курсор появляется вновь.

У меня возникает подозрение, что это как-то связано с изменением Items (загрузкой нового списка) в тот момент, когда список открыт.

Почему? Теряюсь в догадках.


 
Игорь Шевченко ©   (2006-03-13 17:15) [6]

API ©   (13.03.06 16:52) [5]

А, я очень извиняюсь, ComboBoxEx нельзя использовать ? Ведь в адресной строке IE именно он...



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
1-1141990138
abhtr
2006-03-10 14:28
2006.04.16
Ошибка при формирвании отчета в Word2000


15-1143186047
оЛиневод
2006-03-24 10:40
2006.04.16
Как хранится файл на диске


6-1136206191
DeadMeat
2006-01-02 15:49
2006.04.16
Хаос при передаче по UDP (indy 10)


9-1127987214
XCoder
2005-09-29 13:46
2006.04.16
Вопрос по LightMaps (OpenGL)


3-1140548087
Варяг
2006-02-21 21:54
2006.04.16
Упаковка ADOTable