Extension Methods

    • VB.NET

      Extension Methods

      Hab mich heute mal ein bißchen rumgespielt und einige Extension-Methods gebastelt. Wenn ihr dieses Modul in euer Projekt einfügt, dann habt ihr drei neue Methoden bei euren Steuerelementen (getestet mit Buttons): Shrink, Grow, Attention.
      Es richtet sich an die Bastler, für die Profis unter euch wird das nichts Neues sein. Die Bastler haben hier vielleicht einen Anreiz für eigene Ideen... (und die "Copy-und-Paste"-Kiddies... nun ja; Werdet glücklich damit;-) )

      Extension-Methods wurden mit VB2008 eingeführt, laufen also nicht vorher.

      VB.NET-Quellcode

      1. 'Erweitert die Controls mit Hilfe des Extensions-Attributs, deshalb:
      2. Imports System.Runtime.CompilerServices
      3. ''' <summary>
      4. ''' enthält diverse Erweiterungen für Controls.
      5. ''' </summary>
      6. ''' <remarks></remarks>
      7. Module Erweiterungen
      8. ''' <summary>
      9. ''' lässt das Control auf Breite=0 zusammenschrumpfen und dann verschwinden
      10. ''' </summary>
      11. ''' <param name="ct">wird auf dieses Control angewandt</param>
      12. ''' <remarks></remarks>
      13. <Extension()> Sub Shrink(ByVal ct As Control)
      14. 'Aktuelle Breite abfragen
      15. Dim breite As Integer = ct.Width
      16. 'die Schrift wird während des Vorgangs ausgeblendet
      17. Dim temptext As String = ct.Text
      18. ct.Text = ""
      19. 'das Control wird auf Breite=0 geschrumpft
      20. For q = breite To 0 Step -1
      21. ct.Width = q
      22. Next
      23. '...und zum Schluß unsichtbar gemacht
      24. ct.Visible = False
      25. 'die Breite wird wieder zurückgesetzt auf Original
      26. ct.Width = breite
      27. '...und die Beschriftung auch
      28. ct.Text = temptext
      29. End Sub
      30. ''' <summary>
      31. ''' lässt das Control erscheinen und von Breite=0 wachsen
      32. ''' </summary>
      33. ''' <param name="ct">wird auf dieses Control angewandt</param>
      34. ''' <remarks></remarks>
      35. <Extension()> Sub Grow(ByVal ct As Control)
      36. 'Wenn das Control unsichtbar ist...
      37. If ct.Visible = False Then
      38. 'die Beschriftung merken
      39. Dim temptext As String = ct.Text
      40. 'und vom Control entfernen
      41. ct.Text = ""
      42. 'die Breite merken
      43. Dim breite As Integer = ct.Width
      44. '...und auf den Startwert setzen
      45. ct.Width = 0
      46. 'dann das Control sichtbar machen
      47. ct.Visible = True
      48. 'und auf die Originalgrösse wachsen lassen
      49. For q = 0 To breite
      50. 'die Breite setzen
      51. ct.Width = q
      52. 'bei jedem 2. Schleifendurchlauf das Neuzeichnen des Controls erzwingen
      53. If CBool(q Mod 2) Then ct.Refresh()
      54. Next
      55. '...und den Text wieder auf den Originaltext setzen
      56. ct.Text = temptext
      57. End If
      58. End Sub
      59. ''' <summary>
      60. ''' bestimmt die Richtung des Attention-Effekts
      61. ''' </summary>
      62. ''' <remarks></remarks>
      63. Friend Enum enRichtung
      64. UhrzeigerSinn
      65. GegenUhrzeigerSinn
      66. End Enum
      67. ''' <summary>
      68. ''' bestimmt die Dauer des Attention-Effekts
      69. ''' </summary>
      70. ''' <remarks></remarks>
      71. Friend Enum enDauer
      72. kurz
      73. normal
      74. lang
      75. End Enum
      76. ''' <summary>
      77. ''' bestimmt, wie intensiv der Attention-Effekt ist
      78. ''' </summary>
      79. ''' <remarks></remarks>
      80. Friend Enum enIntensität
      81. sanft
      82. normal
      83. heftig
      84. End Enum
      85. ''' <summary>
      86. ''' die Aufmerksamkeit auf das Control legen
      87. ''' </summary>
      88. ''' <param name="ct">wird auf dieses Control angewandt</param>
      89. ''' <param name="dauer">die Dauer des Effekts</param>
      90. ''' <param name="Intensität">die Intensität des Effekts</param>
      91. ''' <param name="Richtung">in welcher Richtung</param>
      92. ''' <remarks>das Control wird dazu gebracht, zu "shaken", um die Aufmerksamkeit des Benzutzers zu bekommen</remarks>
      93. <Extension()> _
      94. Sub Attention(ByVal ct As Control, _
      95. Optional ByVal dauer As enDauer = enDauer.normal, _
      96. Optional ByVal Intensität As enIntensität = enIntensität.normal, _
      97. Optional ByVal Richtung As enRichtung = enRichtung.UhrzeigerSinn)
      98. 'die Anzahl der Durchläufe
      99. ' (entspricht der Dauer des Effektes)
      100. Dim Anzahl As Integer
      101. 'Abfragen des Enum-Wertes "Dauer"
      102. Select Case dauer
      103. Case enDauer.kurz
      104. Anzahl = 2
      105. Case enDauer.lang
      106. Anzahl = 15
      107. Case enDauer.normal
      108. Anzahl = 9
      109. End Select
      110. 'die Intensität des Effektes
      111. ' (soweit wird das Control nach allen Seiten bewegt)
      112. Dim iIntensität As Integer
      113. 'Abfragen des Enum-Wertes "Intensität"
      114. Select Case Intensität
      115. Case enIntensität.heftig
      116. iIntensität = 9
      117. Case enIntensität.normal
      118. iIntensität = 5
      119. Case enIntensität.sanft
      120. iIntensität = 3
      121. End Select
      122. 'den aktuellen Mauszeiger merken
      123. Dim oldMouse As System.Windows.Forms.Cursor
      124. oldMouse = ct.Cursor
      125. 'Mauszeiger ändern auf "Sanduhr"
      126. ct.Cursor = Cursors.WaitCursor
      127. 'Richtung einstellen
      128. If Richtung = enRichtung.GegenUhrzeigerSinn Then iIntensität = -iIntensität
      129. ''================================
      130. ''
      131. ''und hier geht der Effekt los...
      132. ''
      133. ''================================
      134. 'die aktuelle Position speichern
      135. 'diese Variablen werden zur Hilfe genommen, um die Position zu berechnen
      136. Dim oben As Integer = ct.Top
      137. Dim links As Integer = ct.Left
      138. 'i deklarieren (weil ich nicht immer "iIntensität" schreiben will ;-} )
      139. Dim i As Integer = iIntensität ''''''''''''''''''' mit i ist es hier momentan noch leichter
      140. Dim r As Integer = CInt(IIf(i < 0, 1, -1))
      141. 'Hilfsvariablen für die Schleifen
      142. Dim verPos, horPos As Integer
      143. ''Den Button zuerst mal in die Startposition bringen
      144. For verPos = 0 To i Step r
      145. ct.Top = oben + verPos
      146. Next
      147. For horPos = 0 To i Step r
      148. ct.Left = links + horPos
      149. Next
      150. ''Jetzt geht die Schleife los, und zwar...
      151. '' ...[Anzahl] Mal.
      152. Dim anz As Integer
      153. For anz = 1 To Anzahl
      154. 'in der Höhe in die eine Richtung gehen
      155. For verPos = i To -i Step r
      156. ct.Top = oben + verPos
      157. Next
      158. 'und jetzt in der horizontalen Richtung
      159. For horPos = i To -i Step r
      160. ct.Left = links + horPos
      161. Next
      162. 'in der Höhe ans andere Ende
      163. For verPos = -i To i Step -r
      164. ct.Top = oben + verPos
      165. Next
      166. 'und wieder auf der Horizontalen
      167. For horPos = -i To i Step -r
      168. ct.Left = links + horPos
      169. Next
      170. Next
      171. ''Jetzt kommt der Button wieder in die Ausgangsposition
      172. For verPos = i To 0 Step r
      173. ct.Top = oben + verPos
      174. Next
      175. For horPos = i To 0 Step r
      176. ct.Left = links + horPos
      177. Next
      178. 'und den Mauszeiger wieder zurücksetzen
      179. ct.Cursor = oldMouse
      180. End Sub
      181. End Module

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „der_Kurt“ ()