VBATools

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.

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.

Obrazek

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
Obrazek

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:

Obrazek

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:

Obrazek

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.