Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hint у длинных названий элементов ComboBox, возможно ли? 
:(
    Опции темы
MacTep
Дата 10.6.2012, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Можно ли отображать подсказки в выпадающем списке у длинных элементов, которые не влезают в ширину ComboBox? Как?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
RelictOs
Дата 10.6.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.2.2012

Репутация: нет
Всего: 1



Код

procedure TForm1.CBDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
 if (CB.Canvas.TextWidth(CB.Items[index]) > CB.Width) and (CB.Items[index]<>CB.Hint) then
  begin
   Application.CancelHint;
   CB.Hint := CB.Items[index];
  end;
end;

в теории должно работать

Это сообщение отредактировал(а) RelictOs - 10.6.2012, 13:04
PM MAIL ICQ Skype   Вверх
MacTep
Дата 10.6.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



А на практикте ничего не происходит


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Чучмек
Дата 11.6.2012, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



В сети есть дохрена примеров, где используется  обработка сообщения WM_CTLCOLORLISTBOX.
Однако, чтото не получается написть потомок TComboBox/TCustomComboBox с обработкой этого сообщения (D7/Win7) smile  smile  smile 
Сейчас буду искать почему.
Пока слепил через перехват оконной процедуры.
Установка
Код

unit2.CBSetHint(ComboBox1.Handle);
unit2.CBSetHint(ComboBox2.Handle);
unit2.CBSetHint(ComboBox3.Handle);

Снятие
Код

unit2.CBRemoveHint(ComboBox1.Handle);

Пока сильно не тестил, могут быть ошибки.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Unit2.pas 3,89 Kb


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 11.6.2012, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Все можно сделать проще
Код

type
THComboBox=class(TComboBox)
 private
  HW:THintWindow;
  isShowHW:boolean;
 protected
  procedure WMCTLCOLORLISTBOX(var Message: TMessage);//message WM_CTLCOLORLISTBOX;
  procedure WndProc(var Message: TMessage); override;
 public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy;override;
end;
implementation
{ THComboBox }

constructor THComboBox.Create(AOwner: TComponent);
begin
  inherited;
HW:=THintWindow.Create(self);
HW.ActivateHint(rect(0,0,0,0),'');   //Без этого, при первом показе, HW перекрывается выпадающим списком
HW.ReleaseHandle;
isShowHW:=false;
end;

destructor THComboBox.Destroy;
begin
HW.Destroy;
  inherited;
end;

procedure THComboBox.WMCTLCOLORLISTBOX(var Message: TMessage);
var
  ItemIndex,txtlen:cardinal;
  twidth:cardinal;
  cr,pi:tpoint;
  txt:string;
  rct:TRECT;
begin
ItemIndex:=self.ItemIndex;
if ItemIndex>=0 then
   begin
   txt:=self.Items[ItemIndex];
   twidth:=self.Canvas.TextWidth(txt);
   GetWindowRect(self.Handle,rct);
   if twidth>(rct.Right-rct.Left) then
      begin
      pi.X:=rct.Left;
      pi.Y:=rct.Top;
      rct:=hw.CalcHintRect(1000,txt,nil);
      getcursorpos(cr);
      With rct do
       begin
       Left:=Left+pi.X;
       Right:=Left+Right;
       Top:=cr.Y+20;
       Bottom:=Top+Bottom;
       end;
      hw.ActivateHint(rct,txt);
      isShowHW:=true;
      exit;
      end;
    end;
if isShowHW then
 begin
 hw.ReleaseHandle;
 isShowHW:=false;
 end;
end;

procedure THComboBox.WndProc(var Message: TMessage);
begin
  inherited;
if Message.Msg=WM_CTLCOLORLISTBOX then WMCTLCOLORLISTBOX(Message)else if isShowHW then
 begin
 hw.ReleaseHandle;
 isShowHW:=false;
 end;
end;

end.




--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.