Выберите элемент ListBox при щелчке правой кнопкой мыши в Word VBA

Я разрабатываю проект в Word 2003 с VBA. У меня есть список с множественным выбором ListBox с некоторыми записями (датами). При щелчке правой кнопкой мыши я хотел бы, чтобы появилось окно ввода, где пользователь может изменить выбранную дату. Это хорошо работает, если конкретный элемент уже сфокусирован (не только выбран, но и сфокусирован). Но если вы щелкнете правой кнопкой мыши по элементу без фокуса, появится окно и измените дату сфокусированной записи, а не всегда ту, которую вы щелкнули правой кнопкой мыши.

Я нашел этот ответ (http://www.vbarchiv.net/tipps/tipp_920-rechtsklick-in-der-standard-listbox-erkennen.html), но в VBA это невозможно. Есть ли у кого-нибудь решение для VBA?

Мне действительно нужно изменить сфокусированный элемент при щелчке правой кнопкой мыши, прежде чем появится окно.

Спасибо


person Philipp Gfeller    schedule 01.02.2012    source источник


Ответы (1)


Обычно это делается с помощью Hit Testing, который не поддерживают списки, вот хакерский способ;

Добавьте еще один список с именем lbTest где-нибудь в форме, дважды щелкните его свойство BorderStyle, пока оно не станет пустым белым полем, установите его visible в false

Private LBI_HEIGHT As Long

Private Sub UserForm_Initialize()
   'get the height of a single list item in twips based on the fact the box will resize itself automatically;
   With lbTest
       .Width = 100
       .Height = 1
       .AddItem "X"
       LBI_HEIGHT = .Height
   End With

   'add test data
   Dim i As Long
   For i = 1 To 50
       ListBox1.AddItem "item " & i
   Next
End Sub

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   'get the item at the Y coord based on the scroll position & item height
   Dim derivedIndex As Long
   derivedIndex = (Y \ LBI_HEIGHT) + ListBox1.TopIndex

   Me.Caption = derivedIndex & " = " & ListBox1.List(derivedIndex)
End Sub
person Alex K.    schedule 01.02.2012
comment
Вау, это довольно круто. Большое спасибо за быстрый и компетентный ответ. Короткий тест показал именно тот результат, который был нужен. - person Philipp Gfeller; 01.02.2012