Пользовательская подсказка в подпункте 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.
Комментарии