Hint (подсказку) На Передний План

17.01.2009
5
0
#1
Здравствуйте. Столкнулся с такой проблемой... Есть форма, на форме ListView с ViewStyle=vsReport (таблица). И в этой таблице если строка полностью не помещается в столбец, то при наведении на эту строку выскакивает hint который показывает всю строку. Причем этот hint я нигде не включал, он срабатывает по умолчанию.
Но вот если я у формы выставляю свойство FormStyle=fsStayOnTop (на передний план), то этот hint отображается под формой... см. картинку ;)
hint.jpg

Подскажите как вывести этот hint на передний план?

Заранее спасибо.
 

sinkopa

Well-Known Member
#2
Здравствуйте. Столкнулся с такой проблемой... Есть форма, на форме ListView с ViewStyle=vsReport (таблица). И в этой таблице если строка полностью не помещается в столбец, то при наведении на эту строку выскакивает hint который показывает всю строку. Причем этот hint я нигде не включал, он срабатывает по умолчанию.
Но вот если я у формы выставляю свойство FormStyle=fsStayOnTop (на передний план), то этот hint отображается под формой... см. картинку :)
Посмотреть вложение 6035

Подскажите как вывести этот hint на передний план?

Заранее спасибо.
Попробуйте следующий трюк:
В дизайнере, в свойствах Вашего ListView поставьте
1. ParentShowHint := False;
2. ShowHint := True;
В обработчике события OnInfoTip следующий код:
Код:
procedure TMainForm.ListViewInfoTip(Sender: TObject; Item: TListItem;
var InfoTip: string);
begin
// если длина текста айтема короче ширины рамки, то хинт не выводить.
with Item do
if (ListView.Canvas.TextWidth(InfoTip) <= DisplayRect(drLabel).Width) then
InfoTip := '';
end;
Важно!
Даже если Вы решите выводить подсказки и для короткого текста (который влезает по ширине), обработчик OnInfoTip всё равно должен присутствовать.
Напишите туда любой "тупой" код типа if Item = nil then InfoTip := '';
 
17.01.2009
5
0
#3
Хотел попробовать ваш вариант решения, но delphi ругается на DisplayRect(drLabel).Width - говорит,ч то нет такого параметра как Width.
 

sinkopa

Well-Known Member
#4
Хотел попробовать ваш вариант решения, но delphi ругается на DisplayRect(drLabel).Width - говорит,ч то нет такого параметра как Width.
Вы шутите наверное... :lamer:
Метод объявлен следующим образом:
function TListItem.DisplayRect(Code: TDisplayCode): TRect;
Как Вы видите результатом функции являемтся TRect.
Как у TRect не может быть Width ?
Я пожалуй "погорячился" слегка использовав запись with Item do... не всем может оказаться понятно что там в коде происходит реально.
Вот. Тоже самое (последовательно и подробно) в несколько шагов.
Код:
procedure TMainForm.ListViewInfoTip(Sender: TObject; Item: TListItem;
var InfoTip: string);
var
ItemLabelRect: TRect; // регион канвы ListView в котором отрисовывается текст Item-а
TextWidth: Integer;  // ширина текста InfoTip в пикселях
// (сколько он будет занимать напечатаным на канве ListView)
begin
// узнаем ширину текста
TextWidth := Item.ListView.Canvas.TextWidth(InfoTip);
// получаем размеры прямоугольника в котором отрисовывается Caption Item-а
ItemLabelRect := Item.DisplayRect(drLabel);

{ если ширина текста меньше ширины прямоугольника в котором
отрисовывается Caption Item-а значит весь текст виден
и InfoTip показывать не надо.
}
if (TextWidth <= ItemLabelRect.Width) then
InfoTip := '';
end;
Так работает? ;)
Естественно предполагается что в uses у Вас есть модуль ComCtrls. (там объявлен тип TDisplayCode = (drBounds, drIcon, drLabel, drSelectBounds) ; )