The following lines describe the syntax for declaring a structure:
PUBLIC STRUCT Identifier Field_1 [ Embedded array declaration ] AS [ Datatype ] Field_2 [ Embedded array declaration ] AS [ Datatype ] ... Field_n [ Embedded array declaration ] AS [ Datatype ] END STRUCT
This declaration defines the structure of students with 5 fields:
Public Struct Schueler Jahrgangsstufe As Integer GebDatum As Date Nachname As String DG1Kurs As String DG2Kurs As String End Struct
Note that when declaring a structure as an access right, you can only set Public. The fields from Year to DG2Course are variables with the Public access right.
The special feature of the following declaration of a structure course is that in the structure student the field course list[8] is an array with elements of type Struct from the course declaration:
Public Struct Kurs KursFach As String Kurslehrer As String End Struct Public Struct Schueler Jahrgangsstufe As Integer GebDatum As Date Nachname As String KursListe[8] As Struct Kurs End Struct
Arrays with elements of the type Struct are not real arrays, because they have very few methods of the original array class:
You can then declare variables of the user-defined (pseudo-)type Struct. First a variable course participant of type Struct and then an array course list[22], in which the relevant data of 22 students are stored and whose elements are of type Struct:
Public KursTeilnehmer As Struct Schueler Public Schueler As New Schueler ' Das funktioniert alternativ auch ... Public KursListe[22] As Struct Schueler Public KursListe[22] As New Schueler ' → Fehlermeldung
After you have declared structures, you will learn how to access the structure declared in the previous section and its fields read and write using variables of type Struct. The following program interface is used to enter the values of the individual fields and their display:
Figure 7.2.1.3.1: Program interface
First, access to the input mask is released. Then all 5 fields of the variable course participants of type Struct (student) are assigned values or the default values are overwritten and the current content of the variable course participants is inserted into the array course list[22].
Public Sub SaveNewRecord() KursTeilnehmer.Jahrgangsstufe = cmbJGS.Text KursTeilnehmer.Nachname = txbNachname.Text KursTeilnehmer.GebDatum = dbGebDatum.Value KursTeilnehmer.DG1Kurs = cmbDGF1.Text KursTeilnehmer.DG2Kurs = cmbDGF2.Text ' Neuen Record im Array Kursliste[] speichern KursListe[iRecordNumber] = KursTeilnehmer End ' SaveNewRecord()
Alternatively, you can use the With statement to write simplified assignments. The source code is easier to read:
Public Sub SaveNewRecord() With KursTeilnehmer .Jahrgangsstufe = cmbJGS.Text .Nachname = txbNachname.Text .GebDatum = dbGebDatum.Value .DG1Kurs = cmbDGF1.Text .DG2Kurs = cmbDGF2.Text End With KursListe[iRecordNumber] = KursTeilnehmer End ' SaveNewRecord()
A compact alternative is recommended if you immediately insert the contents of a record in the price list array[22]:
Public Sub SaveNewRecord() KursListe[iRecordNumber].Jahrgangsstufe = cmbJGS.Text KursListe[iRecordNumber].Nachname = txbNachname.Text KursListe[iRecordNumber].GebDatum = dbGebDatum.Value KursListe[iRecordNumber].DG1Kurs = cmbDGF1.Text KursListe[iRecordNumber].DG2Kurs = cmbDGF2.Text End ' SaveNewRecord()
The following two procedures demonstrate how to read access the contents of the individual fields of a structure:
Public Sub ShowCurrentRecord() cmbJGS.Text = KursListe[iCurrentRecord].Jahrgangsstufe txbNachname.Text = KursListe[iCurrentRecord].Nachname dbGebDatum.Value = KursListe[iCurrentRecord].GebDatum cmbDGF1.Text = KursListe[iCurrentRecord].DG1Kurs cmbDGF2.Text = KursListe[iCurrentRecord].DG2Kurs End ' ShowCurrentRecord()
Public Sub ShowRecords() Dim iCount As Integer TextArea1.Clear For iCount = 0 To iRecordNumber TextArea1.Insert(KursListe[iCount].Jahrgangsstufe & gb.NewLine) TextArea1.Insert(KursListe[iCount].Nachname & gb.NewLine) TextArea1.Insert(Format(KursListe[iCount].GebDatum, "dddd - dd. mmmm yyyy") & gb.NewLine) TextArea1.Insert(KursListe[iCount].DG1Kurs & gb.NewLine) TextArea1.Insert(KursListe[iCount].DG2Kurs & gb.NewLine) If iCount < iRecordNumber Then TextArea1.Insert("-------------------------" & gb.NewLine) Next ' iCount TextArea1.Pos = Len(TextArea1.Text) ' ---> Sprung in die letzte Zeile End ' ShowRecords()
Die folgenden Zeilen beschreiben die Syntax für die Deklaration einer Struktur:
PUBLIC STRUCT Identifier Field_1 [ Embedded array declaration ] AS [ Datatype ] Field_2 [ Embedded array declaration ] AS [ Datatype ] ... Field_n [ Embedded array declaration ] AS [ Datatype ] END STRUCT
Diese Deklaration definiert die Struktur Schueler mit 5 Feldern:
Public Struct Schueler Jahrgangsstufe As Integer GebDatum As Date Nachname As String DG1Kurs As String DG2Kurs As String End Struct
Beachten Sie, dass Sie bei der Deklaration einer Struktur als Zugriffsrecht nur Public setzen können. Die Felder von Jahrgangsstufe bis DG2Kurs sind p.d. Variablen mit dem Zugriffsrecht Public.
Die Besonderheit der folgenden Deklaration einer Struktur Kurs besteht darin, das in der Struktur Schueler das Feld Kursliste[8] ein Array mit Elementen vom Typ Struct aus der Kurs-Deklaration ist:
Public Struct Kurs KursFach As String Kurslehrer As String End Struct Public Struct Schueler Jahrgangsstufe As Integer GebDatum As Date Nachname As String KursListe[8] As Struct Kurs End Struct
Arrays mit Elementen vom Typ Struct sind keine echten Arrays, denn sie verfügen nur über sehr wenige Methoden der originalen Array-Klasse:
Anschließend können Sie Variablen vom benutzerdefinierten (Pseudo-)Typ Struct deklarieren. Zuerst eine Variable KursTeilnehmer vom Typ Struct und anschließend ein Array Kursliste[22], in dem die relevanten Daten von 22 Schülern gespeichert werden und dessen Elemente vom Typ Struct sind:
Public KursTeilnehmer As Struct Schueler Public Schueler As New Schueler ' Das funktioniert alternativ auch ... Public KursListe[22] As Struct Schueler Public KursListe[22] As New Schueler ' → Fehlermeldung
Nach der Deklaration von Strukturen erfahren Sie, wie man auf die im vorangegangenen Abschnitt deklarierte Struktur und deren Felder lesend und schreibend über Variablen vom Typ Struct zugreift. Für die Eingabe der Werte der einzelnen Felder und deren Anzeige wird die folgende Programmoberfläche genutzt:
Abbildung 7.2.1.3.1: Programmoberfläche
Zuerst wird der Zugriff auf die Eingabemaske freigegeben. Dann werden allen 5 Feldern der Variablen KursTeilnehmer vom Typ Struct (Schueler) Werte zugewiesen oder die Vorgabewerte überschrieben. Abschließend wird der aktuelle Inhalt der Variablen KursTeilnehmer in das Array Kursliste[22] eingefügt.
Public Sub SaveNewRecord() KursTeilnehmer.Jahrgangsstufe = cmbJGS.Text KursTeilnehmer.Nachname = txbNachname.Text KursTeilnehmer.GebDatum = dbGebDatum.Value KursTeilnehmer.DG1Kurs = cmbDGF1.Text KursTeilnehmer.DG2Kurs = cmbDGF2.Text ' Neuen Record im Array Kursliste[] speichern KursListe[iRecordNumber] = KursTeilnehmer End ' SaveNewRecord()
Mit Hilfe der With-Anweisung können alternativ die Zuweisungen vereinfacht geschrieben werden. Der Quelltext ist besser lesbar:
Public Sub SaveNewRecord() With KursTeilnehmer .Jahrgangsstufe = cmbJGS.Text .Nachname = txbNachname.Text .GebDatum = dbGebDatum.Value .DG1Kurs = cmbDGF1.Text .DG2Kurs = cmbDGF2.Text End With KursListe[iRecordNumber] = KursTeilnehmer End ' SaveNewRecord()
Eine kompakte Alternative bietet sich an, wenn Sie den Inhalt eines Records sofort in die das Array Kursliste[22] einfügen:
Public Sub SaveNewRecord() KursListe[iRecordNumber].Jahrgangsstufe = cmbJGS.Text KursListe[iRecordNumber].Nachname = txbNachname.Text KursListe[iRecordNumber].GebDatum = dbGebDatum.Value KursListe[iRecordNumber].DG1Kurs = cmbDGF1.Text KursListe[iRecordNumber].DG2Kurs = cmbDGF2.Text End ' SaveNewRecord()
Die folgenden zwei Prozeduren demonstrieren, wie man auf die Inhalte der einzelnen Felder einer Struktur lesend zugreift:
Public Sub ShowCurrentRecord() cmbJGS.Text = KursListe[iCurrentRecord].Jahrgangsstufe txbNachname.Text = KursListe[iCurrentRecord].Nachname dbGebDatum.Value = KursListe[iCurrentRecord].GebDatum cmbDGF1.Text = KursListe[iCurrentRecord].DG1Kurs cmbDGF2.Text = KursListe[iCurrentRecord].DG2Kurs End ' ShowCurrentRecord()
Public Sub ShowRecords() Dim iCount As Integer TextArea1.Clear For iCount = 0 To iRecordNumber TextArea1.Insert(KursListe[iCount].Jahrgangsstufe & gb.NewLine) TextArea1.Insert(KursListe[iCount].Nachname & gb.NewLine) TextArea1.Insert(Format(KursListe[iCount].GebDatum, "dddd - dd. mmmm yyyy") & gb.NewLine) TextArea1.Insert(KursListe[iCount].DG1Kurs & gb.NewLine) TextArea1.Insert(KursListe[iCount].DG2Kurs & gb.NewLine) If iCount < iRecordNumber Then TextArea1.Insert("-------------------------" & gb.NewLine) Next ' iCount TextArea1.Pos = Len(TextArea1.Text) ' ---> Sprung in die letzte Zeile End ' ShowRecords()