Карта сайтаСсылкиКонтакты

Отображение пользовательской подсказки в подпункте TListView

PDF Печать
Статьи

Вы используете управление Delphi TListView, чтобы отобразить список элементов в режиме, подобном Проводнику Windows для отображения файлов и папок. Пункты могут быть отображены в столбцах с заголовками столбцов, вертикально или горизонтально, с маленькими или большими значками.

Подсказка подпункта ListView

Подсказка пунктов 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.


 

Добавить комментарий


Защитный код
Обновить