FM20 – Label
Label to kontrolka ActiveX z zestawu biblioteki FM20 (standardowy przybornik) dla kompilacji Office 32/64 bit.
Ktoś mógłby zapytać: Co nas może zaskoczyć kontrolka służąca do opisu innych kontrolek, głównie używana czysto informacyjnie niż użytkowo. Spróbuję zatem troszkę powydziwiać i sprawić że coś z poniższych informacji będziecie mogli ponad tą wiedzę uzyskać.
Faktycznie kontrolka label nie sławi się niczym szczególnym, ale możemy parę jej właściwości omówić na przykładach. Może któreś z opisanych wam się spodoba.
Na pierwszy rzut oka nic szczególnego, ale kontrolka posiada przydatne właściwości takie jak Accelerator. Czyli skrót wywołania. Ale skoro do kontrolki nie można wejść i prze-edytować jej treść w wyświetlonej formie to po co wywołanie? Otóż w VBA należy się sugerować parametrem TabIndeks, czyli kolejnością przechodzenia klawiszem [TAB] i w powiązaniu z inną kontrolką wywołanie przez skrót spowoduje iż automatycznie przeskoczymy do innej kontrolki. Przykład:
Accelerator to odwołanie do dowolnej litery wyświetlanego tekstu. Nie ma możliwości odwołać się do drugiej takiej samej litery. W pow przykładzie wykorzystałem cyfrę 1 aby po naciśnięciu [Alt+1] przeskoczyć do kontrolki Textbox. Dodatkowo wykorzystałem parametr ControlTipText (czyli chmurkę) aby poinformować użytkownika, po najechaniu myszą na obręb kontrolki Label o takiej możliwości.
Inną sympatyczną możliwością, jest przekazanie danych do Label od strony kodu. Np dajmy na to, iż mamy napełnioną kontrolkę ListBox z kilkoma elementami. Elementy te będziemy zaznaczać. Informacje o tym będziemy chcieli pokazać jako całkowita ilość elementów lub ilość zaznaczonych elementów (lub obie informacje) może być przekazana do kontrolki Label. Budujemy zatem formę z dwoma labelami (pierwsza funkcja opisowa), kontrolka Listbox i dane w arkuszu. Pożądana sytuacja wygląda następująco:
Na pow obrazku widać iż pobrano 9 wierszy do kontrolki, a zaznaczono 4 z nich. Przy większej lub ograniczonej ilości taka informacja może być bardzo użyteczna. Jak to wygląda od strony kodu:
Private Sub UserForm_Initialize()
Dim x&, max_r&: max_r = Cells(Rows.Count, "a").End(xlUp).Row
For x = 1 To max_r 'od pierwszego rekordu do ostatniego
ListBox1.AddItem Cells(x, "a") 'dane z komórki do kontrolki listBox
Next
ListBox1.MultiSelect = fmMultiSelectExtended 'zaznaczanie wielokrotne
Label2.Caption = "0/" & ListBox1.ListCount 'wyświetlenie kontrolki ma zaznaczonych zero
End Sub
Private Sub ListBox1_Change() 'reakcja na kliknięcie w kontrolkę listy
If ListBox1.ListCount > 0 Then 'jeśli są jakieś elementy na liście
Dim x&, ile&: ile = 0 'deklaracja zmiennych
For x = 0 To Me.ListBox1.ListCount - 1 'pętla do elementach kontrolki
If ListBox1.Selected(x) Then ile = ile + 1 'dodawanie zaznaczonych
Next
Label2.Caption = ile & "/" & ListBox1.ListCount 'zwrot ilości zaznaczonych wraz z liczbą całkowitą
Else
Label2.Caption = "0/0" 'jeśli nie załadowano do kontrolki żadnych rekordów to zero po obu stronach
End If
End Sub
Inną możliwością kontrolki Label to, za-symulowanie linka. Niestety, w VBA nie ma takiej kontrolki, która posiadałaby taką funkcjonalność, ale przy dodatkowej obróbce można uzyskać podobny efekt (i użytkownik się nie zorientuje). Czyli dla przykładu forma a na niej zwykły Label. Zmieniamy jego Caption (treść wyświetlaną) oraz dodajemy Tipa (coś do chmurki). Resztę załatwia kod:
A więc jak to zrobić kodem, aby po najechaniu Label zmienił się w link (inny kolor czcionki, podkreślenie, zmiana ikony):
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Label1.ForeColor = &HFF0000 'zmiana koloru labela
Label1.Font.Underline = True 'nadanie podkreślenia czcionki
Label1.MousePointer = 10 'zmiana ikony myszy na strzałkę w górę (nie ma łapki niestety)
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Label1.ForeColor = &H80000012 'wystarczy znaleźć się w przestrzeni formy aby wyzerować kolor, ikonę i podkreślenie
Label1.Font.Underline = False
Me.MousePointer = 0
End Sub
Private Sub Label1_Click()
ShellExecute 0, "open", "http://www.vbatools.pl/lista-aplikacji/", "", "", 0 'otwieramy stronę na klikniecie w label
End Sub
----- do modułu wrzucamy poniższe API (bo w formie być nie może)
Public Declare Function ShellExecute Lib "Shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Gotowe. Klikamy i mamy otwarcie domyślnej przeglądarki z zadeklarowaną w kodzie stroną. Macie jakieś inne pomysły?
Jeśli uważasz że pokazane materiały są godne polecenia – podziel się tą wiadomością z innymi pozostawiając odnośnik to tego materiału.
(c) Shon Oskar – http://VBATools.pl
Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.