Tematy: Procedura Rysuj - metoda klasy.
Fazy z lewej i prawej strony – przeciążanie procedury
Class1.vb
Mamy zbudowaną klasę Stopien_walu_parametry : Public Class Stopien_walu_parametry
Private _Srednica_stopnia As Single Private _Dlugosc_stopnia As Single Private _Faza As Single
Public Property Srednica_stopnia As Single Get
Return _Srednica_stopnia End Get
Set(ByVal value As Single) _Srednica_stopnia = value End Set
End Property
Public Property Dlugosc_stopnia As Single Get
Return _Dlugosc_stopnia End Get
Set(ByVal value As Single) _Dlugosc_stopnia = value End Set
End Property
Dodajemy właściwość (Property) Faza pozwalającą określić fazę.
Jeśli wybierzemy z menu Stopień wału z fazą – faza będzie miała stałą wartość umieszczoną w kodzie równą 8.
Public Property Faza() As Single Get
Return _Faza End Get
Set(ByVal value As Single) _Faza = value
End Set End Property
Umieszczamy procedurę (dwie procedury o tej samej nazwie) Rysuj (będzie metodą) w klasie.
Ponieważ stopień może mieć fazę lub być bez fazy - utworzymy dwie procedury Rysuj różniące się liczbą argumentów.
Taka sytuacja to przeciążenie procedury.
Public Sub Rysuj(ByVal pozycja_X As Single, ByVal pozycja_Y As Single, ByVal dlugosc As Single, ByVal srednica As Single)
'Stopień bez fazy
Dim objRys As System.Drawing.Graphics
Dim objPioroWal As New System.Drawing.Pen(Color.Red, 2) objRys = Form1.CreateGraphics
objRys.DrawRectangle(objPioroWal, pozycja_X, pozycja_Y, dlugosc, srednica) End Sub
Public Sub Rysuj(ByVal pozycja_X As Single, ByVal pozycja_Y As Single, ByVal dlugosc As Single, ByVal srednica As Single, ByVal faza As Single) 'Stopień z fazą.
'Faza DODATNIA rysowana PO LEWEJ, faza UJEMNA rysowana PO PRAWEJ.
Dim objRys As System.Drawing.Graphics
Dim objPioroWal As New System.Drawing.Pen(Color.Red, 2) Dim faza_rys As Single
objRys = Form1.CreateGraphics
If faza > 0 Then 'Faza DODATNIA rysowana PO LEWEJ.
' Rysowanie prostokata 1 – 2 – 3 – 4
objRys.DrawRectangle(objPioroWal, pozycja_X + faza, pozycja_Y, dlugosc - faza, _ srednica) ' Rysowanie linii pionowej 5 – 6
objRys.DrawLine(objPioroWal, pozycja_X, pozycja_Y + faza, _ pozycja_X, pozycja_Y + srednica - faza) ' Rysowanie linii pionowej 5 – 1
objRys.DrawLine(objPioroWal, pozycja_X, pozycja_Y + faza, pozycja_X + faza, _
pozycja_Y) ' Rysowanie linii ukośnej 6 – 4
objRys.DrawLine(objPioroWal, pozycja_X, pozycja_Y + srednica - faza, _ pozycja_X + faza, pozycja_Y + srednica) ElseIf faza < 0 Then 'Faza ujemna rysowana po prawej, patrz rys. 2
faza_rys = Math.Abs(faza)
' Rysowanie prostokata 1 - 2 - 3 - 4
objRys.DrawRectangle(objPioroWal, pozycja_X, pozycja_Y, dlugosc - faza_rys, srednica) ' Rysowanie linii 5 - 6
objRys.DrawLine(objPioroWal, pozycja_X + dlugosc, pozycja_Y + faza_rys, _ pozycja_X + dlugosc, pozycja_Y + srednica - faza_rys) ' Rysowanie linii 5 - 2
objRys.DrawLine(objPioroWal, pozycja_X + dlugosc, pozycja_Y + faza_rys, _ pozycja_X + dlugosc - faza_rys, pozycja_Y) ' Rysowanie linii 6 - 3
objRys.DrawLine(objPioroWal, pozycja_X + dlugosc, pozycja_Y + srednica - faza_rys, _ pozycja_X + dlugosc - faza_rys, pozycja_Y + srednica) End If
End Sub End Class
Form1.vb
Public Class Form1 Dim x1 As Single Dim y1 As Single
Dim objRys As System.Drawing.Graphics
Dim objPioroOs As New System.Drawing.Pen(Color.Green, 1) Dim objPioroWal As New System.Drawing.Pen(Color.Red, 2) Dim X_osi As Integer = 50
Dim Y_osi As Integer = 200 Dim x_pocz As Integer = X_osi Dim Liczba_stopni As Integer
''Dim wsk_pocz_walka As Stopien_walu_powiazania ''Dim wsk_kon_walka As Stopien_walu_powiazania Dim Kolekcja_stopni_walu As New Collection Dim mode As Integer
Dim faza As Single = 0
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load objRys = Me.CreateGraphics
mode = 0 End Sub
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) _
Handles Me.MouseMove LabelKoordynaty.Text = "X=" & e.X & " Y=" & e.Y
End Sub
Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) _
Handles Me.MouseClick Dim x_stopnia As Single
Dim y_stopnia As Single Dim szerokosc As Single Dim wysokosc As Single
Dim mojStopien As New Stopien_walu_parametry
''Dim mojStopien_powiazania As New Stopien_walu_powiazania objRys.DrawLine(objPioroOs, X_osi, Y_osi, 600, Y_osi) objRys.DrawLine(objPioroOs, X_osi, X_osi, X_osi, 350)
If mode = 10 Then x1 = e.X y1 = e.Y
x_stopnia = x_pocz y_stopnia = y1
szerokosc = x1 - x_pocz wysokosc = (Y_osi - y1) * 2 ' '' zakomentować
' ''objRys.DrawRectangle(objPioroWal, x_stopnia, y_stopnia, szerokosc, _ wysokosc) x_pocz = x_pocz + szerokosc
Liczba_stopni = Liczba_stopni + 1 mojStopien.Dlugosc_stopnia = szerokosc mojStopien.Srednica_stopnia = wysokosc mojStopien.Faza = faza
''If Liczba_stopni = 1 Then
'' mojStopien_powiazania.Stopien_walu_odziedziczony = mojStopien '' wsk_pocz_walka = mojStopien_powiazania
'' wsk_kon_walka = mojStopien_powiazania ''Else
'' mojStopien_powiazania.Stopien_walu_odziedziczony = mojStopien '' wsk_kon_walka.Adres_po = mojStopien_powiazania
'' wsk_kon_walka = mojStopien_powiazania ''End If
Kolekcja_stopni_walu.Add(mojStopien) If faza <> 0 Then
mojStopien.Rysuj(x_stopnia, y_stopnia, szerokosc, wysokosc, faza) Else
mojStopien.Rysuj(x_stopnia, y_stopnia, szerokosc, wysokosc) End If
End If End Sub
Private Sub PokażToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles PokażToolStripMenuItem.Click Call Narysuj()
End Sub
Private Sub SkasujToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles SkasujToolStripMenuItem.Click objRys.Clear(SystemColors.Control)
End Sub
Private Sub Narysuj()
Dim x_stopnia As Single Dim y_stopnia As Single Dim szerokosc As Single Dim wysokosc As Single
''Dim walek_tim As Stopien_walu_powiazania Dim wsk_kolekcji As Stopien_walu_parametry
objRys.DrawLine(objPioroOs, X_osi, Y_osi, 600, Y_osi) objRys.DrawLine(objPioroOs, X_osi, X_osi, X_osi, 350) x_pocz = X_osi
''walek_tim = wsk_pocz_walka ''For i = 1 To Liczba_stopni '' x_stopnia = x_pocz
'' y_stopnia = Y_osi - walek_tim.Stopien_walu_odziedziczony.Srednica_stopnia / 2 '' szerokosc = walek_tim.Stopien_walu_odziedziczony.Dlugosc_stopnia
'' wysokosc = walek_tim.Stopien_walu_odziedziczony.Srednica_stopnia
'' objRys.DrawRectangle(objPioroWal, x_stopnia, y_stopnia, szerokosc, wysokosc) '' x_pocz = x_pocz + szerokosc
'' walek_tim = walek_tim.Adres_po ''Next
For Each wsk_kolekcji In Kolekcja_stopni_walu x_stopnia = x_pocz
y_stopnia = Y_osi - wsk_kolekcji.Srednica_stopnia / 2 szerokosc = wsk_kolekcji.Dlugosc_stopnia
wysokosc = wsk_kolekcji.Srednica_stopnia ' '' zakomentować
' ''objRys.DrawRectangle(objPioroWal, x_stopnia, y_stopnia, szerokosc, _ wysokosc) If wsk_kolekcji.Faza <> 0 Then
wsk_kolekcji.Rysuj(x_stopnia, y_stopnia, szerokosc, wysokosc, wsk_kolekcji.Faza)
Else
wsk_kolekcji.Rysuj(x_stopnia, y_stopnia, szerokosc, wysokosc) End If
x_pocz = x_pocz + szerokosc Next
End Sub
Private Sub NowyWałekToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles NowyWałekToolStripMenuItem.Click mode = 10
x_pocz = X_osi
Kolekcja_stopni_walu.Clear() Liczba_stopni = 0
objRys.Clear(SystemColors.Control)
objRys.DrawLine(objPioroOs, X_osi, Y_osi, 600, Y_osi) objRys.DrawLine(objPioroOs, X_osi, X_osi, X_osi, 350) End Sub
Private Sub StopnieBezFazyToolStripMenuItem_Click(sender As Object, e As EventArgs)_
Handles StopnieBezFazyToolStripMenuItem.Click mode = 10
faza = 0 End Sub
Private Sub StopnieZFazaZLewejStronyToolStripMenuItem_Click(sender As Object, _ e As EventArgs) Handles StopnieZFazaZLewejStronyToolStripMenuItem.Click mode = 10
faza = 8 End Sub
Private Sub StopnieZFazaZPrawejStronyToolStripMenuItem_Click(sender As Object, _ e As EventArgs) Handles StopnieZFazaZPrawejStronyToolStripMenuItem.Click mode = 10
faza = -8 End Sub
Private Sub NicNieRóbToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles NicNieRóbToolStripMenuItem.Click mode = 0
End Sub End Class
Rysunek 1
Rysunek 2