|
Der Inhalt eines ImageList-Steuerelements, aus dem andere Steuerelemente der Microsoft Common Controls (etwa ListView, TreeView oder ToolBar) ihre Symbole beziehen, muss nicht zur Laufzeit unverändert bleiben. Sie können jederzeit neue Bilder hinzufügen, wie auch welche entfernen. Damit der geändert Inhalt das Ende einer Anwendung überdauern und beim nächsten Start wieder zur Verfügung gestellt werden kann, müssen Sie ihn speichern und wieder einlesen können.
Dazu bietet sich das PropertyBag-Objekt an - ab Visual Basic 6 können Sie es selbst instanzieren und Sie können den Inhalt komplett über die Contents-Eigenschaften auslesen oder wieder einlesen.
Der folgenden Funktion ImageListStore übergeben Sie das zu sichernde ImageList-Steuerelement und erhalten ein mit dem Inhalt gefülltes PropertyBag-Objekt zurückgegeben. Darin sind die Bilder als auch die jeweils dazugehörenden Schlüssel abgelegt. Das Byte-Array, das Ihnen die Contents-Eigenschaft des PropertyBag-Objekts liefert, können Sie beliebig speichern - in einer Datei, in einer Datenbank, oder wo auch immer.
Public Function ImageListStore(ImageList As ImageList) _
As PropertyBag
Dim nPropbag As PropertyBag
Dim nListImage As ListImage
Dim nPicture As StdPicture
Dim i As Integer
Set nPropbag = New PropertyBag
With nPropbag
.WriteProperty "Count", ImageList.ListImages.Count, 0
For i = 1 To ImageList.ListImages.Count
Set nListImage = ImageList.ListImages(i)
.WriteProperty "Key" & i, nListImage.Key, ""
Set nPicture = nListImage.Picture
.WriteProperty "Img" & i, nPicture
Next
End With
Set ImageListStore = nPropbag
End Function
Umgekehrt instanzieren Sie selbst ein zunächst leeres PropertyBag-Objekt und lesen das gespeicherte Byte-Array wieder in dessen Contents-Eigenschaft ein. Dann übergeben Sie es zusammen mit dem zu füllen ImageList-Steuerelement an die folgende Prozedur ImageListRestore. Setzen Sie deren optionalem Parameter Clear auf True, wird das ImageList-Steuerelement geleert, bevor die gespeicherten Bilder und Schlüssel aus dem PropertyBag-Objekt wieder eingelesen werden.
Public Sub ImageListReStore(ImageList As ImageList, _
PropBag As PropertyBag, Optional ByVal Clear As Boolean)
Dim i As Integer
Dim nKey As String
With ImageList.ListImages
If Clear Then
.Clear
End If
For i = 1 To PropBag.ReadProperty("Count", 0)
nKey = PropBag.ReadProperty("Key" & CStr(i), "")
If Len(nKey) Then
.Add , nKey, PropBag.ReadProperty("Img" & CStr(i))
Else
.Add , , PropBag.ReadProperty("Img" & CStr(i))
End If
Next 'l
End With
End Sub
|