Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Type als Objekt - Das UDT-Tutorial Teil 2

von RedakteurMODSeite 1 von 3

Einleitung

Willkommen beim 2. Teil des Tutorials. Für diesen Teil sollte Teil 1 auf alle Fälle gelesen sein, die Beispiele ausprobiert und möglichst durch eigene Tests erweitert worden sein. Es folgen nun ein paar Themen, die in Teil 1 nicht enthalten waren.

Indizierte Properties (Die Arrayform)

Eine indiziertes BefehlsreferenzeintragProperty ist ein Property, die sich wie ein BefehlsreferenzeintragArray verhält, außer dass wie bei einem regulären Property, eine Funktion aufgerufen wird, wenn darauf zugegriffen wird. Zum Anfang ein sehr kurzes Beispiel, nur um die Syntax zu zeigen:

Type foo
  Declare Property bar(ByVal index As Integer, ByVal value As Integer)
  Declare Property bar(ByVal index As Integer) As Integer

  dummy As Integer
End Type

Property foo.bar(ByVal index As Integer, ByVal value As Integer)
  Print "Property set, index=" & index & ", value=" & value
End Property

Property foo.bar(ByVal index As Integer) As Integer
  Print "Property get, index=" & index
  Property = 0
End Property

Dim baz As foo

baz.bar(0) = 42
Print baz.bar(0)

Wie man sieht, ist die Deklaration unseres indizierten Properties ziemlich ähnlich zu einem regulären Property, außer dass wir diesmal ein Argument für den Index angegeben haben. Der Type enthält ein Dummy-Integer Element, weil es wenigstens ein Datenelement haben muss. Wie man sieht, wird der Property dann mit (0) als Hinweis verwendet, was bedeutet, dass wir das nullte Element holen/setzen wollen, was dem ersten Element des Arrays entspricht. So wie wir das eben auch bei einem normalen Array tun würden.
Nun folgt ein etwas sinnvolleres Beispiel mit Beschreibung:

Type foo
  Declare Constructor(ByVal num_elements As Integer)
  Declare Destructor()

  Declare Property bar(ByVal index As Integer, ByVal value As Integer)
  Declare Property bar(ByVal index As Integer) As Integer

Private:
  x As Integer Ptr
  size As Integer
End Type

Constructor foo(ByVal num_elements As Integer)
  x = Callocate(num_elements * SizeOf(Integer))
  size = num_elements
End Constructor

Destructor foo()
  DeAllocate(x)
End Destructor

Property foo.bar(ByVal index As Integer, ByVal value As Integer)
  If (index >= 0) And (index < size) Then
    x[index] = value
  Else
    Error 6
  End If
End Property

Property foo.bar(ByVal index As Integer) As Integer
  If (index >= 0) And (index < size) Then
    Property = x[index]
  Else
    Error 6
  End If
End Property

Dim baz As foo = foo(10)

baz.bar(1) = 42
Print baz.bar(1)

Diesmal wurden ein BefehlsreferenzeintragConstructor und BefehlsreferenzeintragDestructor hinzugefügt, die einen dynamischen Speicherbereich x reservieren und freigeben mit der Anzahl der Elemente, die im Constructor steht. Dann, wenn die Property-Funktionen ausgeführt werden, wird beim Index geprüft, ob er innerhalb der Array-Grenzen liegt und falls ja, wird das angeforderte Holen/Setzen ausgeführt. Ist der angegebene Index außerhalb der Grenzen, tritt 'Error 6' auf, damit das Programm mit FreeBASICs 'out of bounds error' abgebrochen werden kann. Dies kann natürlich durch eigene Fehlerbehandlungsroutinen ersetzt werden. Ausprobieren lässt sich das, indem der Code 'baz.bar(1) = 42' durch 'baz.bar(10) = 42' ersetzt wird. Da wir nur 10 Elemente (Index 0-9) angegeben haben, tritt dies dann in Aktion.

Die Art der Verwendung wird im Property-Tutorial natürlich auch erklärt.

 

Gehe zu Seite Gehe zu Seite  1  2  3  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 06.09.2010 von RedakteurMOD angelegt.
  • Die aktuellste Version wurde am 28.08.2011 von RedakteurMOD gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen