Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизДлинные записи в ComboBox Найти похожие ветки
← →
t_vic (2004-03-01 17:51) [0]Такая проблема - ComboBox содержит длинные записи, очень важно при выборе записи знать ее текст полностью. Вопрос: как осуществить такое с помощью Hint"ов? Или может есть другое решение?
← →
alless © (2004-03-01 18:08) [1]Poprobui ato:
type
TVSComboBox = class(TCustomComboBox)
…
private
FHint: THintWindow;
…
protected
procedure WMCTLCOLORLISTBOX(var Message: TMessage); message WM_CTLCOLORLISTBOX;
и не забудьте выполнить инициализацию в конструкторе вашего компонента:
--------------------------------------------------------------------------------
…
begin
inherited Create(AOwner);
FHint := THintWindow.Create(Self);
…
Чтобы получить информацию об активной строке в выпадающем списке ComboBox перехватите сообщение WM_CTLCOLORLISTBOX. В процедуре сообщения анализируйте - если длина строки больше ширины выпадающего списка – передайте "длинную" строку в ваш Hint и активируйте его:
--------------------------------------------------------------------------------
FHint.ActivateHint(TextRC, Items[ItemIndex]);
где
TextRC – прямоугольник для строки подсказки
Items[ItemIndex] – "длинная" строка из выпадающего списка
Если активная строка в выпадающем списке "короткая" – спрячьте Hint:
--------------------------------------------------------------------------------
FHint.ReleaseHandle;
Для получения подробной информации о классе THintWindow воспользуйтесь Help из Delphi.
← →
alless © (2004-03-01 18:13) [2]nu,kak polucilosi?
← →
t_vic (2004-03-01 18:15) [3]Я уже пробовала этот вариант. дело в том, что у меня на ComboBoxe уже висит куча обработчиков событий. А что с ними делать то?
> Чтобы получить информацию об активной строке в выпадающем
> списке ComboBox перехватите сообщение WM_CTLCOLORLISTBOX.
> В процедуре сообщения анализируйте - если длина строки больше
> ширины выпадающего списка – передайте "длинную" строку в
> ваш Hint и активируйте его:
>
> --------------------------------------------------------------------------------
> FHint.ActivateHint(TextRC, Items[ItemIndex]);
И я не понимаю какой параметр передать в качестве TextRC?
Может есть какой-то более понятный пример, то буду очень признательна.
← →
alless © (2004-03-01 18:21) [4]TextRC – прямоугольник для строки подсказки
← →
Ivolg © (2004-03-01 18:24) [5]combobox1.Hint:=combobox1.Text;
application.HintHidePause:=10000;
application.HintPause:=100;
← →
MBo © (2004-03-01 18:25) [6]http://delphi.vitpc.com/treasury/combo.htm
← →
t_vic (2004-03-01 18:26) [7]
> TextRC – прямоугольник для строки подсказки
т.е.FHint.Canvas.Rect
передать?
← →
t_vic (2004-03-01 18:28) [8]
> combobox1.Hint:=combobox1.Text;
> application.HintHidePause:=10000;
> application.HintPause:=100;
а на какое событие его вешать?
← →
t_vic (2004-03-01 18:41) [9]MBo, спасибо за ссылку! Пойду попробую так...
← →
Ivolg © (2004-03-01 19:07) [10]//t_vic
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
combobox1.Hint:=combobox1.Text;
application.HintHidePause:=10000;
application.HintPause:=100;
end;
← →
t_vic (2004-03-02 10:25) [11]А если делать вот так:
type
TVSComboBox = class(TCustomComboBox)
…
private
FHint: THintWindow;
…
protected
procedure WMCTLCOLORLISTBOX(var Message: TMessage); message WM_CTLCOLORLISTBOX;
и не забудьте выполнить инициализацию в конструкторе вашего компонента:
то как для такого ComboBoxa правильно описать обработчик события OnChange????
← →
Игорь Шевченко © (2004-03-02 11:55) [12]t_vic (02.03.04 10:25)
> то как для такого ComboBoxa правильно описать обработчик
> события OnChange????
Также, как для обычного - VSComboBox1.OnChange := ComboBoxOnChangeHandler;
и в форме сделать процедуру TForm1.ComboBoxOnChangeHandler (Sender : TObject)
← →
pasha_golub © (2004-03-02 12:31) [13]Игорь Шевченко © (02.03.04 11:55) [12]
А не сильно ли сложной является эта реализация? Мне вот недавно попался вариант через tooltips, вроде попроще.
← →
Игорь Шевченко © (2004-03-02 13:53) [14]pasha_golub © (02.03.04 12:31)
А чего там сложного ? (если ты имеешь в виду мою реализацию с Королевства)
← →
pasha_golub © (2004-03-02 14:00) [15]Игорь Шевченко © (02.03.04 13:53) [14]
Да эту имею. Не то что чложно для понимания, просто как-то много кода что-ли. А ведь мы знаем, что:
"число строк и их длина прямо пропорциональны размеру скомпилированной программы".
http://www1.xakep.ru/magazine/xa/033/064/1.asp :-))
Я к чему. Вот на днях тоже делал in-place подсказку. Сделал с помощью hint"ов и с помощью tooltips. Так вот второй метод мне почему-то больше по душе. Правада делал для TStringGrid.
← →
t_vic (2004-03-02 14:18) [16]
> А чего там сложного ? (если ты имеешь в виду мою реализацию
> с Королевства)
ну вроде ничего сложного нет, но если учесть что я с API раньше вообще не работала, то мне не очень понятно момент один:
если у меня было:
procedure TForm1.ComboBoxChange(Sender: TObject);
begin
......
//тут идет манипуляция со свойствами других объектов формы
end;
а теперь мы добавляемunit HSHintComboBox
и пишем
procedure TForm1.FormCreate(Sender: TObject);
begin
FHSHintComboBox := THSHintComboBox.Create(Self);
with FHSHintComboBox do begin
Parent := Self;
Items.Assign(ComboBox.Items);
BoundsRect := ComboBox.BoundsRect;
if NOT (ComboBox.Style in [csDropDown, csDropDownList]) then
raise Exception.Create (
"HSHintComboBox ïîääåðæèâàåò ñòèëü òîëüêî csDropDown è csDropDownList");
Style := ComboBox.Style;
DropDownCount := ComboBox.DropDownCount;
TabOrder := ComboBox.TabOrder;
TabStop := ComboBox.TabStop;
OnListMouseMove := HSHintComboBoxListMouseMove;
end;
ComboBox.Free();
end;
теперь надо еще сюда дописать
FHSHintComboBox.OnChange := ComboBoxChange;
Я правильно поняла?
← →
Andrey007 (2004-03-04 10:42) [17]SendMessage(ComboBox1.Handle,352,aaa,0); - устанавливает ширину выпадающего списка TcomboBox"a равной aaa
← →
t_vic (2004-03-04 17:04) [18]Andrey007, спасиба огромное!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.034 c