Пользовательская подсказка в подпункте TListView

Подсказка пунктов ListView
TListView имеет свойства Hint и ShowHint, которые Вы используете, чтобы определить, должна ли подсказка (tooltip) быть отображена для управления, когда мышь находится над ним.
В большинстве случаев, при использовании вида списка, Вы будете нуждаться в подсказках, которые будут отображаться для каждого пункта списка.
ListView имеет событие OnInfoTip, которое срабатывает, когда мышь зависает над пунктом в виде списка.
По умолчанию, когда подсказки допускаются (ShowHint - True), список отображает подсказку, указанную его свойством Hint. OnInfoTip позволяет списку отменить это значение, чтобы определить подсказку, которая будет применяться к пункту под мышью.
Когда ViewStyle установлен в vsReport, ListView отображает каждый элемент на отдельной строке с информацией (подпункты), размещенной в столбцах.
К сожалению, OnInfoTip не срабатывает, когда мышь находится над подпунктом.
Чтобы заставить ListView отобразить пользовательские подсказки над пунктами и подпунктами, Вы должны обработать два события: OnInfoTip и OnMouseMove. Пример обработки события OnInfoTip:
procedure TLVHintsForm.ListView1InfoTip(Sender: TObject;
Item: TListItem; var InfoTip: string) ;
begin
// Показать все: пункт с подпунктом
InfoTip := InfoTip + #13#10 + item.SubItems[0] + #13#10 + item.SubItems[1];
end;
Чтобы показать подсказки для каждого подпункта, Вы должны обработать событие OnMouseMove:
uses CommCtrl { ... }
procedure TLVHintsForm.ListView1MouseMove
(Sender: TObject; Shift: TShiftState; X, Y: Integer) ;
var
pt: TPoint;
li : TLIstItem;
lvHitInfo: TLVHitTestInfo;
hint : string;
begin
pt := ListView1.ScreenToClient(Mouse.CursorPos) ;
li := ListView1.GetItemAt(pt.x, pt.y) ;
// над подпунктом?
if li = nil then
begin
FillChar(lvHitInfo, SizeOf(lvHitInfo), 0) ;
lvHitInfo.pt := pt;
// над подпунктом!
if -1 <> ListView1.Perform(LVM_SUBITEMHITTEST, 0,
LParam(@lvHitInfo)) then
begin
hint := Format('Name: %s, %s : %s',[
ListView1.Items[lvHitInfo.iItem].Caption,
ListView1.Columns[lvHitInfo.iSubItem].Caption,
ListView1.Items[lvHitInfo.iItem].SubItems[-1 + lvHitInfo.iSubItem]]) ;
if hint <> Memo1.Lines[0] then
begin
Memo1.Lines.Insert(0, hint) ;
// активировать подсказку
ListView1.Hint := hint;
Application.ActivateHint(Mouse.CursorPos) ;
end;
end;
end;
end;
После получения позиции мыши (Mouse.CursorPos), используя ScreenToClient, мы получаем позицию мыши в координатах ListView1. Посылая сообщение LVM_SUBITEMHITTEST списку, заполняем запись TLVHitTestInfo. Эта структура помогает нам найти: какой пункт или подпункт в этой позиции.
Если мышь над подпунктом, мы активизируем окно подсказки, вызывая метод Application.ActivateHint.
Комментарии