In Variant-Variablen gespeicherte Objekte
Objekte können in Variant-Variablen gespeichert werden. Dies kann nützlich sein, wenn Sie verschiedene Datentypen, einschließlich Objekte, effizient verarbeiten müssen. Beispielsweise müssen alle Elemente in einem Array denselben Datentyp haben. Legen Sie den Datentyp des Arrays auf „Variant“ fest, um Objekte zusammen mit anderen Datentypen im selben Array zu speichern.
Array
Wenn Sie Erfahrung in der Programmierung in anderen Sprachen haben, müssen Sie mit dem Konzept von Arrays vertraut sein. Dank Arrays können Sie auf eine Reihe gleichnamiger Variablen verweisen und diese numerisch identifizieren (indizieren). In vielen Situationen kann die Verwendung von Arrays Programme verkürzen und vereinfachen, da Sie mithilfe von Indexwerten eine Schleife entwerfen können, um mehrere Situationen effizient zu bewältigen. Arrays haben Ober- und Untergrenzen, und die Elemente des Arrays sind innerhalb der Ober- und Untergrenzen fortlaufend. Da Visual Basic jedem Indexwert Speicherplatz zuweist, sollten Sie kein Array deklarieren, das unrealistisch groß ist.
Beachten Sie, dass es sich bei den in diesem Abschnitt behandelten Arrays um Arrays von im Programm deklarierten Variablen handelt. Sie unterscheiden sich von Steuerelement-Arrays, die zur Entwurfszeit durch Festlegen der Index-Eigenschaft des Steuerelements angegeben werden. Variablen-Arrays sind immer zusammenhängend; im Gegensatz zu Kontroll-Arrays können Array-Elemente nicht aus der Mitte eines Arrays geladen oder entladen werden.
Alle Elemente in einem Array haben denselben Datentyp. Wenn der Datentyp Variant ist, kann jedes Element natürlich verschiedene Datentypen (Objekte, Zeichenfolgen, Werte usw.) enthalten. Arrays aller grundlegenden Datentypen können deklariert werden, einschließlich benutzerdefinierter Typen (siehe „Erstellen eigener Datentypen“ in Kapitel 8, „Erneut programmieren“) und Objektvariablen (siehe Kapitel 9, „Programmieren mit Objekten“).
In Visual Basic gibt es zwei Arten von Arrays: Arrays mit fester Größe, die immer die gleiche Größe behalten, und dynamische Arrays, deren Größe sich zur Laufzeit ändern kann. Dynamische Arrays werden später in diesem Kapitel unter „Dynamische Arrays“ ausführlich besprochen.
Deklarieren Sie ein Array mit fester Größe
Es gibt drei Möglichkeiten, ein Array mit fester Größe zu deklarieren. Welche Methode Sie verwenden, hängt vom gültigen Bereich ab, den das Array haben sollte:
Um ein öffentliches Array zu erstellen, deklarieren Sie das Array mit der Public-Anweisung im Deklarationsabschnitt des Moduls.
Um ein Array auf Modulebene zu erstellen, deklarieren Sie das Array mit der PRivate-Anweisung im Deklarationsabschnitt des Moduls.
Erstellen Sie ein lokales Array und deklarieren Sie das Array dabei mit der Private-Anweisung.
Legen Sie Ober- und Untergrenzen fest
Beim Deklarieren eines Arrays folgt auf den Array-Namen eine in Klammern eingeschlossene Obergrenze. Die Obergrenze darf den Bereich des Long-Datentyps (-2.147.483.648 bis 2.147.483.647) nicht überschreiten. Beispielsweise kann die folgende Array-Deklaration im Deklarationsabschnitt eines Moduls erscheinen:
DimCounters(14)AsInteger '15 Elemente.
DimSums(20)AsDouble '21 Elemente.
Um ein öffentliches Array zu erstellen, ersetzen Sie Dim direkt durch Public.
PublicCounters(14)AsInteger
PublicSums(20)AsDouble
Dieselbe Deklaration verwendet Dim in der Prozedur: DimCounters(14)AsIntegerDimSums(20)AsDouble Die erste Deklaration erstellt ein Array mit 15 Elementen, indiziert von 0 bis 14. Die zweite Deklaration erstellt ein Array mit 21 Elementen, indiziert von 0 bis 20. Die standardmäßige Untergrenze ist 0.
Um eine Untergrenze anzugeben, verwenden Sie das Schlüsselwort To, um eine explizite Untergrenze anzugeben (für den Long-Datentyp):
DimCounters(1To15)AsInteger
DimSums(100To120)AsString
In der vorherigen Anweisung haben Zähler Indexwerte im Bereich von 1 bis 15, während Summen Indexwerte im Bereich von 100 bis 120 haben.
Arrays, die andere Arrays enthalten
Es ist möglich, Arrays mit Variant-Datentypen zu erstellen und diese zusammen mit Arrays mit anderen Datentypen anzuordnen. Der folgende Code erstellt zwei Arrays, eines mit Ganzzahlen und das andere mit Zeichenfolgen. Dann deklarieren Sie ein drittes Variant-Array und platzieren Sie die Integer- und String-Arrays darin:
PrivateSubCommand1_Click()
DimintXAsInteger 'Zählervariable deklarieren.
'Deklarieren und platzieren Sie ein Array von Ganzzahlen.
DimcountersA(5)AsInteger
ForintX=0To4
countersA(intX)=5
NextintX
'Deklarieren und platzieren Sie ein Array von Strings.
DimcountersB(5)AsString
ForintX=0To4
countersB(intX)=Hallo
NextintX
DimarrX(2)AsVariant 'Deklarieren Sie ein neues Array mit zwei Mitgliedern.
arrX(1)=countersA() 'Andere Arrays in das Array verschieben.
arrX(2)=countersB()
MsgBoxarrX(1)(2) 'Jedes Array-Mitglied anzeigen.
MsgBoxarrX(2)(3)
EndSub
mehrdimensionales Array
Manchmal ist es notwendig, relevante Informationen in einem Array zu verfolgen. Um beispielsweise jedes Pixel auf einem Computerbildschirm zu verfolgen, müssen Sie seine X- und Y-Koordinaten referenzieren. Zu diesem Zeitpunkt sollten mehrdimensionale Arrays zum Speichern von Werten verwendet werden. Mehrdimensionale Arrays können mit Visual Basic deklariert werden. Die folgende Anweisung deklariert beispielsweise ein zweidimensionales 10×10-Array innerhalb einer Prozedur.
StaticMatrixA(9,9)AsDouble
Sie können eine oder beide Dimensionen mit einer expliziten Untergrenze deklarieren:
StaticMatrixA(1To10,1To10)AsDouble
All dies kann auf Arrays mit mehr als zwei Dimensionen verallgemeinert werden. Zum Beispiel:
DimMultiD(3,1To10,1To15)
Diese Deklaration erstellt ein dreidimensionales Array der Größe 4×10×15. Die Gesamtzahl der Elemente ist das Produkt der drei Dimensionen, also 600.
Beachten Sie, dass bei Vergrößerung der Dimension eines Arrays der vom Array belegte Speicherplatz erheblich zunimmt. Daher sollten mehrdimensionale Arrays mit Vorsicht verwendet werden. Seien Sie besonders vorsichtig, wenn Sie Variant-Arrays verwenden, da diese mehr Speicherplatz benötigen.
Verwenden von Schleifen zum Bearbeiten von Arrays
Sie können verschachtelte For-Schleifen verwenden, um mehrdimensionale Arrays effektiv zu verarbeiten. In MatrixA wird beispielsweise jedem Element basierend auf seiner Position im Array ein Wert zugewiesen:
DimIAsInteger,JAsInteger
StaticMatrixA(1To10,1To10)AsDouble
ForI=1To10
FürJ=1To10
MatrixA(I,J)=I*10 J
WeiterJ
WeiterIch
Weitere InformationenWeitere Informationen zu Schleifen finden Sie im Abschnitt „Schleifenstrukturen“ weiter unten in diesem Kapitel.
dynamisches Array
Wie groß ein Array sein sollte, ist manchmal unbekannt. Daher hoffe ich, die Größe des Arrays zur Laufzeit ändern zu können.
Dynamische Arrays können ihre Größe jederzeit ändern. In Visual Basic sind dynamische Arrays am flexibelsten und bequemsten und helfen dabei, den Speicher effektiv zu verwalten. Sie können beispielsweise ein großes Array für kurze Zeit verwenden und dann den Speicherplatz für das System freigeben, wenn das Array nicht verwendet wird.
Wenn Sie kein dynamisches Array verwenden, deklarieren Sie ein Array mit der größtmöglichen Größe und löschen Sie dann unnötige Elemente. Wenn diese Methode jedoch übermäßig verwendet wird, wird die Speicherbetriebsumgebung langsamer.
Gehen Sie folgendermaßen vor, um ein dynamisches Array zu erstellen:
1. (Wenn Sie möchten, dass das Array ein öffentliches Array ist, dann) deklarieren Sie das Array mit der Public-Anweisung, oder (wenn Sie möchten, dass das Array eine Modulebene ist, dann) deklarieren Sie das Array mit der Dim-Anweisung auf Modulebene , oder (wenn Sie möchten, dass das Array ein lokales Array ist, dann) in Verwenden Sie die Static- oder Dim-Anweisung, um das Array während der Prozedur zu deklarieren. Deklarieren Sie das Array als dynamisch, indem Sie ihm eine leere Dimensionstabelle anhängen.
DimDynArray()
2. Verwenden Sie die ReDim-Anweisung, um die tatsächliche Anzahl von Elementen zuzuweisen.
ReDimDynArray(X 1)
ReDim-Anweisungen können nur innerhalb von Prozeduren erscheinen. Anders als die Dim-Anweisung und die Static-Anweisung ist die ReDim-Anweisung eine ausführbare Anweisung. Aufgrund dieser Anweisung führt die Anwendung einen Vorgang zur Laufzeit aus. Die ReDim-Anweisung unterstützt eine Syntax, die mit der für feste Arrays verwendeten identisch ist. Für jede Dimension kann jede ReDim-Anweisung die Anzahl der Elemente sowie die Ober- und Untergrenzen ändern. Die Abmessungen des Arrays können jedoch nicht geändert werden.
ReDimDynArray(4to12)
Verwenden Sie beispielsweise zum ersten Mal das auf Modulebene erstellte dynamische Array Matrix1:
DimMatrix1()AsInteger
Weisen Sie dann in der Prozedur Speicherplatz für das Array zu:
SubCalcValuesNow()
.
.
.
ReDimMatrix1(19,29)
EndSub
Die ReDim-Anweisung weist hier der Matrix eine 20×30-Ganzzahlmatrix zu (die Gesamtelementgröße beträgt 600). Es gibt eine andere Möglichkeit, Variablen zum Festlegen der Grenzen dynamischer Arrays zu verwenden:
ReDimMatrix1(X,Y)
Beachten Sie, dass Sie einem Byte-Array variabler Größe eine Zeichenfolge zuweisen können. Ein Byte-Array kann auch einem String variabler Länge zugewiesen werden. Es ist wichtig zu beachten, dass die Anzahl der Bytes in der Zeichenfolge je nach Plattform variiert. Die gleiche Zeichenfolge hat auf einer Unicode-Plattform doppelt so viele Bytes wie auf einer Nicht-Unicode-Plattform.
Behalten Sie den Inhalt eines dynamischen Arrays bei
Bei jeder Ausführung einer ReDim-Anweisung gehen alle aktuell im Array gespeicherten Werte verloren. Visual Basic setzt den Wert eines Array-Elements auf Empty (für ein Variant-Array), auf 0 (für ein Numeric-Array), auf eine Zeichenfolge der Länge Null (für ein String-Array) oder auf Nothing (für ein Array von Objekten) zurück. .
Dies ist nützlich, wenn Sie ein Array für neue Daten vorbereiten oder wenn Sie die Arraygröße reduzieren möchten, um Speicherplatz zu sparen. Manchmal möchten Sie die Größe eines Arrays ändern, ohne die Daten im Array zu verlieren. Dies kann mithilfe der ReDim-Anweisung mit dem Schlüsselwort Preserve erfolgen. Wenn Sie beispielsweise die UBound-Funktion verwenden, um auf die Obergrenze zu verweisen, wird das Array erweitert und ein Element hinzugefügt, ohne dass der Wert des vorhandenen Elements verloren geht:
ReDimPreserveDynArray(UBound(DynArray) 1)
Wenn Sie das Schlüsselwort Preserve verwenden, können Sie nur die Obergrenze der letzten Dimension in einem mehrdimensionalen Array ändern. Wenn Sie die Untergrenze anderer Dimensionen oder der letzten Dimension ändern, tritt zur Laufzeit ein Fehler auf. Es kann also so programmiert werden:
ReDimPreserveMatrix(10,UBound(Matrix,2) 1)
Anstatt so zu programmieren:
ReDimPreserveMatrix(UBound(Matrix,1) 1,10)
Ausführlichere Informationen zu dynamischen Arrays finden Sie unter „ReDim-Funktion“ in der Sprachreferenz. Informationen zu Objekt-Arrays finden Sie in Kapitel 9, „Programmieren mit Objekten“.
->