CC1 – ImageList
ImageList to kontrolka ActiveX z zestawu biblioteki Common Controls 1 (plik mscomctl.ocx) dla kompilacji Office 32/64 bit.
Kontrolka służy do przechowywania ikon lub małych obrazków, które mogą być wykorzystane np w innych kontrolkach ListView, ToolBar, TabStrip, ImageCombo oraz TreeView. Magazyn ten daje możliwość odwołania się przez indeks, co ułatwia pisanie kodu przywołującego zaimportowany obrazek.

Jak działa kontrolka w praktyce: Po dodaniu jej do zestawu narzędziowego Toolbox wystarczy zaznaczyć ją myszą i wykreślić na formie jakikolwiek kształt. Kontrolka nie ma na zadaniu prezentować siebie, ale dzięki niej zmagazynować obrazki. Widok jej będzie przedstawiony jako ikona aby zaznaczyć jej zastosowanie.

Ręczne dodawanie obrazów do interfejsu kontrolki: Interfejs wywołuje się przez kliknięcie na trój-kropek parametru (Custom) i posiada 3 ekrany. Pierwszy to element określający jaką wielkość danych będziemy się spodziewać na wyjściu (jaki otrzymamy dokładny wymiar obrazka). Dodatkowo i opcjonalnie kontrolka posiada możliwość definiowania maski, która polega na użyciu przeźroczystości. Druga zakładka to dodawanie obrazków (poniżej zaprezentowano 8 obrazków imitujących progres). Każdy z obrazków posiada indeksy 1-8. Trzecia zakładka to definiowanie warstwy za obrazkiem, użyteczna w przypadku zaimportowania zdjęć z przeźroczystością lub z wykorzystaniem maski. W prostych słowach użycie takich obrazków, które będą sprawiały wrażenie okrągłych lub o innych niż kwadratowych ikon.
Programowe dodawanie obrazków do kontrolki: Kontrolkę można traktować jak kolekcję czyli odwołujemy się doń w następujący sposób, narzucając kolejność w zestawie (indeks), nazwę do której również możemy się odwołać (klucz), oraz ścieżkę do pliku z obrazkiem (gif, ico, jpg lub bmp) poprzedzona funkcją pobrania LoadPicture().
ImageList1.ListImages.Add 1, "nazwa_obrazka", LoadPicture("c:\folder\nazwa_pliku.bmp")
ImageList1.ListImages.Add 1, "nazwa_obrazka2", LoadPicture("c:\folder\nazwa_pliku.bmp") 'nazwa klucza musi być unikatowa
ImageList1.ListImages.Remove 2 'usuniecie konkretnego obrazka podając nr indeksu
ImageList1.ListImages.Clear 'czyszczenie kolekcji

Zapisany projekt z kontrolką ImageList będzie przechowywał obrazki do czasu ich skasowania, ręcznego lub kodem, czyli nie trzeba będzie ich posiadać na dysku przy odpaleniu projektu. Wykorzystanie obrazków nie musi wiązać się z jedną formą. Może ona być dodana raz, a obrazki w niej zapisane użyte w wielu kontrolkach rozsianych na rożnych formach projektu.
W takim razie mały przykład np: Jak wypakować obrazki z kontrolki. Kod umieszczony pod przyciskiem Start. Jego uruchomienie powoduje efekt obracania się kropek na obrazku:
Private Sub CommandButton1_Click()
Dim x%, myPic As Object 'Picture
For x = 1 To ImageList1.ListImages.Count
DoEvents
Set myPic = ImageList1.ListImages.Item(x).ExtractIcon 'przypsanie zdjecia do obiektu
SavePicture myPic, "C:\temp\ico_" & x & ".ico" 'zapis obiektu na dysku
Application.Wait (Now + TimeValue("00:00:01")) 'czekamy 1 sek
Image1.Picture = LoadPicture("C:\temp\ico_" & x & ".ico") 'pokazujemy zdjecie w kontrolce Image
Next
End Sub
Poniżej inny przykład, bardziej zaawansowany, gdzie obrazki prezentują flagi państw – czyli telefoniczne numery kierunkowe rozwiązania wykonującego połączenie z centralką Avaya kodem VBA. W swoich rozwiązaniach używam tej kontrolki głównie do ustawień językowych interfejsu. Nie wypakowuje je ale przekazuje do innej kontrolki:

Aby choć trochę odsłonić zależności omawianej kontrolki z przedstawioną powyżej (ImageCombo, omówionej szerzej w innym artykule), do której przekazano zdjęcia flag, muszę pokrótce omówić mechanizm zależności:

Na pow formie znajdują się co najmniej 3 kontrolki (ImageList, ImageCombo oraz Image). Mechanizm pobiera dane z pliku XMLowego, w którym są zdefiniowane flagi, przypisane do opisu, budując tym samym listę państw. Definicja flag zawiera opis pliku, który wraz z mechanizmem jest osadzony w miejscu programu (rys).
Kluczowe komendy przekazania z pliku do Image a następnie do ImageList i ImageCombo wyglądają następująco:
Private Sub PhoneCode_Make()
If FileExists("sciezka\PhoneCode.xml") = False Then GoTo brak 'jeśli pliku nie będzie
On Error GoTo brak 'jeśli będzie ale będzie miał błędy
xmlDOM.Load "sciezka\PhoneCode.xml" 'ładowanie pliku do kontrolki parsera XMLowego
On Error GoTo 0
Dim Country_name$, Phone_Area_Code$, Code_element$, strPath$, imgLst As New ImageList 'deklaracja zmiennych
Flagi_lista.ComboItems.Clear 'czyszczenie kontrolki ImageCombo
Set xmlNodes = xmlDOM.selectNodes("/ISO_3166-1_List_en/ISO_3166-1_Entry")
For Each xmlNode In xmlNodes 'pętla po łańcuchach XMLowych
Country_name = xmlNode.selectSingleNode("ISO_3166-1_Country_name").text
Phone_Area_Code = xmlNode.selectSingleNode("ISO_3166-1_Phone_Area_Code").text
Code_element = xmlNode.selectSingleNode("ISO_3166-1_Alpha-2_Code_element").text
strPath = "sciezka\" & Code_element & ".gif"
If FileExists(strPath) = False Then GoTo brak_1
If Len(Phone_Area_Code) = 0 Then GoTo brak_1
Flagi_zdjecie.Picture = LoadPicture(strPath) 'przypisanie zdjęcia do Image
imgLst.ListImages.Add Key:="El_" & Code_element, Picture:=Flagi_zdjecie.Picture 'przypisanie zdjęcia i klucza do ImageList
brak_1:
Country_name = ""
Phone_Area_Code = ""
Code_element = ""
Next
Set Flagi_lista.ImageList = imgLst
For Each xmlNode In xmlNodes
Country_name = xmlNode.selectSingleNode("ISO_3166-1_Country_name").text
Phone_Area_Code = xmlNode.selectSingleNode("ISO_3166-1_Phone_Area_Code").text
Code_element = xmlNode.selectSingleNode("ISO_3166-1_Alpha-2_Code_element").text
strPath = "sciezka\" & Code_element & ".gif"
If FileExists(strPath) = False Then GoTo brak_2
If Len(Phone_Area_Code) = 0 Then GoTo brak_2
Flagi_lista.ComboItems.Add Key:="Nr_" & Code_element & "_" & _
Phone_Area_Code, text:=Country_name, Image:="El_" & Code_element 'przypisanie elementu Imagelist do ImageCombo
brak_2:
Country_name = ""
Phone_Area_Code = ""
Code_element = ""
Next
brak:
On Error Resume Next
Set xmlNodes = Nothing
Set imgLst = Nothing
End Sub
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.