ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 21.08.2000

Diese Seite wurde zuletzt aktualisiert am 21.08.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicAddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zur AVB-Web-Site, Kontakt und Impressum

Zurück...

Speicher-Schlangen

Zurück...

(-hg) mailto:hg_queue@aboutvb.de

Mit in Klassen verpackten MSDN Library - VB CollectionCollections können Sie leicht einfache Speicher- und Ablage-Konzepte realisieren. Eines der schlichtesten Konzepte dieser Art ist eine so genannte Queue, eine "Schlange". Das Prinzip kennen Sie von den Warteschlangen am Bankschalter usw. her: Die neu eintreffenden Kunden stellen sich hinten an, und die Bedienung am Schalter "entfernt" den jeweils vordersten Kunden in der Schlange, indem er bedient wird. Ein ähnliches Konzept finden Sie unter Stapeln mit Push und Pop"Stapeln mit Push und Pop".

Mit einer Collection realisieren Sie eine solche Schlange, indem Sie einfach neue Elemente ans Ende hinzufügen - und nur vom Anfang her entnehmen:

MeineCollection.Add Item

und

Item = MeineCollection(1)
MeineCollection.Remove 1

Haben Sie Objekt-Referenzen auf dem Stapel abgelegt, müssen Sie beim Entnehmen noch unterscheiden:

If IsObject(MeineCollection(1)) Then
  Set Item = MeineCollection(1)
Else
  Item = MeineCollection(1)
End If
MeineCollection.Remove 1

Verpacken Sie diese Funktionalität in eine eigene Collection-Klasse, erhalten Sie eine Collection, die sich immer automatisch nach diesem Prinzip verhält.

Und - wenn schon, denn schon: Auf die Information, wie "lang" die "Schlange" ist (Eigenschaft Count), brauchen Sie genau so wenig zu verzichten, wie auf die Möglichkeit, den Inhalt eines beliebigen in die Schlange eingereihten Elements zu erfragen (Eigenschaft Item) oder zu entfernen (Methode Remove mit optional angegebenem Index oder Schlüssel). Dazu noch eine Methode, die das Collection-Objekt sowieso vermissen lässt, nämlich mit einem simplen Clear den Inhalt der ganzen Schlange auf einen Schlag ins (Daten-)Nirwana zu befördern.

Die Methode Remove zum Entfernen eines Elements aus der Schlange ist übrigens nicht als Funktion ausgeführt, wie Sie vielleicht erwartet hätten. Wäre sie als Funktion ausgeführt, die das entnommene Element als Rückgabewert übergibt, könnten Sie beim Aufruf nicht feststellen, ob Ihnen gerade ein Objekt zurückgegeben wird. Da Ihnen das Element jedoch als Rückgabe-Parameter übergeben wird, können Sie erst mit IsObject prüfen, ob es sich um ein Objekt handelt.

Private mQueue As Collection

Public Enum QueueErrorConstants
  qErrUnknown = vbObjectError + 10000
  qErrInvalidKeyIndex = vbObjectError + 10001
  qErrKeyExists = vbObjectError + 10002
  qErrQueueIsEmpty = vbObjectError + 10003
End Enum

Public Property Get Count() As Long
  Count = mQueue.Count
End Property

Public Property Get Item(KeyIndex As Variant) As Variant
' Prozedur-ID (Voreinstellung) in den Prozedurattributen
  Const ProcName = "cQueue.Item"
  
  On Error GoTo Item_Error
  If IsObject(mQueue(KeyIndex)) Then
    Set Item = mQueue(KeyIndex)
  Else
    Item = mQueue(KeyIndex)
  End If
  
  Exit Property
  
Item_Error:
  If Err.Number = 5 Then
    Err.Raise qErrInvalidKeyIndex, ProcName
  Else
    Err.Raise qErrUnknown, ProcName
  End If
End Property

Public Sub Add(Item As Variant, Optional Key As String)
  Const ProcName = "cQueue.Add"
  
  On Error Resume Next
  mQueue.Add Item, Key
  Select Case Err.Number
    Case 0
    Case 457
      On Error GoTo 0
      Err.Raise qErrKeyExists, ProcName
    Case Else
      On Error GoTo 0
      Err.Raise qErrUnknown, ProcName
  End Select
End Sub

Public Sub Clear()
  Set mQueue = New Collection
End Sub

Public Sub Remove(Item As Variant, Optional KeyIndex As Variant = 1)
  Const ProcName = "cQueue.Item"
  
  If mQueue.Count Then
    On Error GoTo Remove_Error
    If IsObject(mQueue(KeyIndex)) Then
      Set Item = mQueue(KeyIndex)
    Else
      Item = mQueue(KeyIndex)
    End If
    mQueue.Remove KeyIndex
  Else
    Err.Raise qErrQueueIsEmpty, ProcName
  End If
  
  Exit Sub
  
Remove_Error:
  If Err.Number = 5 Then
    Err.Raise qErrInvalidKeyIndex, ProcName
  Else
    Err.Raise qErrUnknown, ProcName
  End If
End Sub

Public Function NewEnum() As IUnknown
' Prozedur-ID -4 in den Prozedurattributen
  Set NewEnum = mQueue.[_NewEnum]
End Function

Private Sub Class_Initialize()
  Set mQueue = New Collection
End Sub

Private Sub Class_Terminate()
  Set mQueue = Nothing
End Sub


Die Klasse cQueue (cQueue.zip - ca. 2,8 KB)



Komponenten-Übersicht

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2023 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...