Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.042 c
15-1143242015
fert
2006-03-25 02:13
2006.04.16
Куплю КПК


2-1143619363
jenya_rus
2006-03-29 12:02
2006.04.16
Изменение имен большого кол-ва файлов...


15-1143314179
u-12
2006-03-25 22:16
2006.04.16
C, C++, C#


1-1142348118
Германн
2006-03-14 17:55
2006.04.16
Сортировка в ListBox


2-1143699058
Logos
2006-03-30 10:10
2006.04.16
Формула





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский