Главная страница
    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.46 MB
Время: 0.042 c
2-1143812478
SilentDon
2006-03-31 17:41
2006.04.16
Ошибка при вызове SetLength применительно к динамическим массивам


2-1143617570
Лёха
2006-03-29 11:32
2006.04.16
сетевое подключение


15-1143032261
Физик
2006-03-22 15:57
2006.04.16
На етом форуме можна зделать штобы ответы приходили на mail


4-1137259089
Guest386x
2006-01-14 20:18
2006.04.16
Блокирование клавиатуры


2-1144144175
Nick_serov
2006-04-04 13:49
2006.04.16
Grid Grid Grid... от TMS





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский