Tematy: Xml Zapis i odczyt stopnia przy pomocy serializacji. Zapis i odczyt całego wału przy pomocy własnych procedur. Zamierzamy dodać do aplikacji nowe funkcjonalności: 1. Zapis i odczyt pojedynczego stopnia wału serializacją. 2. Zapis i odczyt całego wału metodą tekstową. 3. Zapis i odczyt kolekcji stopniami. Funkcjonalności te dodamy do zadania z zajęć 3. Kod dodany wyróżniono kolorem żółtym. Class1.vb Public Class Stopien_walu_parametry Private _Srednica_stopnia As Single Private _Dlugosc_stopnia As Single Private _Faza As Single Private _Modyfikacja_stopnia As String 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 Public Property Faza As Single Get Return _Faza End Get Set(ByVal value As Single) _Faza = value End Set End Property Public Property Modyfikacja_stopnia As String Get Return _Modyfikacja_stopnia End Get Set(ByVal value As String) _Modyfikacja_stopnia = value End Set End Property Public Sub Rysuj(ByVal pozycja_x As Single, ByVal pozycja_y As Single, _ ByVal dlugosc As Single, ByVal srednica As Single) 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) Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 1
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) 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 objrys.drawrectangle(objpiorowal, pozycja_x + faza, pozycja_y, _ dlugosc - faza, srednica) objrys.drawline(objpiorowal, pozycja_x, pozycja_y + faza, _ pozycja_x, pozycja_y + srednica - faza) objrys.drawline(objpiorowal, pozycja_x, pozycja_y + faza, pozycja_x + faza, _ pozycja_y) objrys.drawline(objpiorowal, pozycja_x, pozycja_y + srednica - faza, _ pozycja_x + faza, pozycja_y + srednica) ElseIf faza < 0 Then faza_rys = Math.Abs(faza) objrys.drawrectangle(objpiorowal, pozycja_x, pozycja_y, dlugosc - faza_rys, _ srednica) objrys.drawline(objpiorowal, pozycja_x + dlugosc, pozycja_y + faza_rys, _ pozycja_x + dlugosc, pozycja_y + srednica - faza_rys) objrys.drawline(objpiorowal, pozycja_x + dlugosc, pozycja_y + faza_rys, _ pozycja_x + dlugosc - faza_rys, pozycja_y) objrys.drawline(objpiorowal, pozycja_x + dlugosc, _ pozycja_y + srednica - faza_rys, pozycja_x + dlugosc - faza_rys, _ pozycja_y + srednica) Public Class Modyfikacja Public Overridable Sub Rysuj(ByVal X1 As Single, ByVal Y1 As Single, _ ByVal X2 As Single, ByVal Y2 As Single, _ ByVal X3 As Single, ByVal Y3 As Single, _ ByVal X4 As Single, ByVal Y4 As Single) Public Class Pret Inherits Modyfikacja Public Overrides Sub Rysuj(ByVal X1 As Single, ByVal Y1 As Single, _ ByVal X2 As Single, ByVal Y2 As Single, _ ByVal X3 As Single, ByVal Y3 As Single, _ ByVal X4 As Single, ByVal Y4 As Single) Dim objrys As System.Drawing.Graphics Dim objpiorowalu As New System.Drawing.Pen(Color.Red, 1) objrys = Form1.CreateGraphics objrys.drawline(objpiorowalu, X1, Y1, X4, Y4) objrys.drawline(objpiorowalu, X2, Y2, X3, Y3) Public Class Gwint Inherits Modyfikacja Public Overrides Sub Rysuj(ByVal X1 As Single, ByVal Y1 As Single, _ ByVal X2 As Single, ByVal Y2 As Single, _ ByVal X3 As Single, ByVal Y3 As Single, _ ByVal X4 As Single, ByVal Y4 As Single) Dim objrys As System.Drawing.Graphics Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 2
Dim objpiorowalu As New System.Drawing.Pen(Color.Red, 1) objrys = Form1.CreateGraphics objrys.drawline(objpiorowalu, X1, Y1, X3, Y3) objrys.drawline(objpiorowalu, X2, Y2, X4, Y4) Public Class Stopien_walu_powiazania Inherits Stopien_walu_parametry Public Stopien_walu_odziedziczony As Stopien_walu_parametry Public Adres_po As Stopien_walu_parametry Form1.vb Imports System.IO Imports System.Xml 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 Dim x_nowy_stopien As Single Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load objrys = Me.CreateGraphics mode = 0 Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) _ Handles Me.MouseMove LabelKoordynaty.Text = "X=" & e.x & " Y=" & e.y 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 Dim i As Integer Dim objmodyf As Modyfikacja Dim srednica As Single Dim dlugosc As Single objrys.drawline(objpioroos, X_osi, Y_osi, 600, Y_osi) objrys.drawline(objpioroos, X_osi, X_osi, X_osi, 350) Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 3
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 x_pocz = x_pocz + szerokosc Liczba_stopni = Liczba_stopni + 1 mojstopien.dlugosc_stopnia = szerokosc mojstopien.srednica_stopnia = wysokosc mojstopien.faza = faza 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) x_nowy_stopien = x_pocz ElseIf mode = 13 Then x1 = e.x objrys.clear(systemcolors.control) i = 1 Do Until x1 > x_pocz And x1 <= x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia x_pocz = x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia i = i + 1 Kolekcja_stopni_walu.Remove(i) Liczba_stopni = Liczba_stopni - 1 Call Narysuj() ElseIf mode = 21 Then 'pręt x1 = e.x i = 1 Do Until x1 > x_pocz And x1 <= x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia x_pocz = x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia i = i + 1 mojstopien = Kolekcja_stopni_walu.Item(i) mojstopien.modyfikacja_stopnia = "Pret" objmodyf = New Pret srednica = mojstopien.srednica_stopnia dlugosc = mojstopien.dlugosc_stopnia objmodyf.rysuj(x_pocz, Y_osi - srednica / 2, x_pocz, Y_osi + srednica / 2, x_pocz + dlugosc, Y_osi - srednica / 2, x_pocz + dlugosc, Y_osi + srednica / 2) x_pocz = x_nowy_stopien ElseIf mode = 22 Then 'gwint x1 = e.x i = 1 Do Until x1 > x_pocz And x1 <= x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 4
x_pocz = x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia i = i + 1 mojstopien = Kolekcja_stopni_walu.Item(i) mojstopien.modyfikacja_stopnia = "Gwint" objmodyf = New Gwint srednica = mojstopien.srednica_stopnia dlugosc = mojstopien.dlugosc_stopnia objmodyf.rysuj(x_pocz, Y_osi - srednica / 2 + 8, x_pocz, Y_osi + srednica / 2-8, x_pocz + dlugosc, Y_osi - srednica / 2 + 8, x_pocz + dlugosc, Y_osi + srednica / 2-8) x_pocz = x_nowy_stopien ElseIf mode = 40 Then 'XML - zapisywanie stopnia do pliku, Serializacja x1 = e.x i = 1 Do Until x1 > x_pocz And x1 <= x_pocz + _ Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia x_pocz = x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia i = i + 1 mojstopien = Kolekcja_stopni_walu.Item(i) Dim SerializacjaDoPlikuXml As Serialization.XmlSerializer Dim plikxml As FileStream = New FileStream("Dane_stopnia.xml", _ FileMode.Create, FileAccess.Write, FileShare.None) SerializacjaDoPlikuXml = _ New Serialization.XmlSerializer(GetType(Stopien_walu_parametry)) SerializacjaDoPlikuXml.Serialize(plikXML, mojstopien) plikxml.close() MsgBox("Plik XML dla stopnia został zbudowany.") x_pocz = x_nowy_stopien Private Sub PokażToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles PokażToolStripMenuItem.Click Call Narysuj() Private Sub SkasujToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles SkasujToolStripMenuItem.Click objrys.clear(systemcolors.control) 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 Dim objmodyf As Modyfikacja Dim srednica As Single Dim dlugosc As Single objrys.drawline(objpioroos, X_osi, Y_osi, 600, Y_osi) objrys.drawline(objpioroos, X_osi, X_osi, X_osi, 350) Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 5
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 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) srednica = wsk_kolekcji.srednica_stopnia dlugosc = wsk_kolekcji.dlugosc_stopnia If wsk_kolekcji.modyfikacja_stopnia = "Pret" Then objmodyf = New Pret objmodyf.rysuj(x_pocz, Y_osi - srednica / 2, x_pocz, Y_osi + srednica / 2, x_pocz + dlugosc, Y_osi - srednica / 2, x_pocz + dlugosc, Y_osi + srednica / 2) ElseIf wsk_kolekcji.modyfikacja_stopnia = "Gwint" Then objmodyf = New Gwint objmodyf.rysuj(x_pocz, Y_osi - srednica / 2 + 8, x_pocz, Y_osi + srednica / 2-8, x_pocz + dlugosc, Y_osi - srednica / 2 + 8, x_pocz + dlugosc, Y_osi + srednica / 2-8) x_pocz = x_pocz + szerokosc Next Private Sub NowyWałekToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles NowyWałekToolStripMenuItem.Click mode = 0 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) Private Sub StopnieBezFazyToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles StopnieBezFazyToolStripMenuItem.Click mode = 10 faza = 0 Private Sub StopnieZFazaZLewejStronyToolStripMenuItem_Click(sender As Object, _ e As EventArgs) Handles StopnieZFazaZLewejStronyToolStripMenuItem.Click mode = 10 faza = 8 Private Sub StopnieZFazaZPrawejStronyToolStripMenuItem_Click(sender As Object, _ e As EventArgs) Handles StopnieZFazaZPrawejStronyToolStripMenuItem.Click mode = 10 faza = -8 Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 6
Private Sub NicNieRóbToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles NicNieRóbToolStripMenuItem.Click mode = 0 Private Sub UsuńStopieńToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles UsuńStopieńToolStripMenuItem.Click mode = 13 Private Sub PrętToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles PrętToolStripMenuItem.Click mode = 21 Private Sub GwintToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles GwintToolStripMenuItem.Click mode = 22 Private Sub StopieńZapiszToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles StopieńZapiszToolStripMenuItem.Click mode = 40 Private Sub StopieńCzytajToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles StopieńCzytajToolStripMenuItem.Click ' XML stopień czytaj; Serializacja Dim mojstopien As New Stopien_walu_parametry Dim PlikDanych As FileStream = File.Open("Dane_stopnia.xml", FileMode.Open, _ FileAccess.Read) Dim MojaSerializacja As New _ Serialization.XmlSerializer(GetType(Stopien_walu_parametry)) mojstopien = MojaSerializacja.Deserialize(PlikDanych) PlikDanych.Close() Kolekcja_stopni_walu.Add(mojStopien) Liczba_stopni = Liczba_stopni + 1 Call Narysuj() Private Sub WałekZapiszToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles WałekZapiszToolStripMenuItem.Click ' XML Zapis całego wałka tekstowo Dim plik As String Dim dlugosc, srednica, faza As Single Dim modyfikacja_stopnia As String plik = "Dane_walka.xml" FileOpen(1, plik, OpenMode.Output) PrintLine(1, "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>") PrintLine(1, "<Walek xmlns:xsi=" & Chr(34) & _ "http://www.w3.org/2001/xmlschema-instance" & _ Chr(34) & " xmlns:xsd=" & Chr(34) & _ "http://www.w3.org/2001/xmlschema" & Chr(34) & ">") For Each wsk_kolekcji In Kolekcja_stopni_walu PrintLine(1, "<Stopien_walu>") srednica = wsk_kolekcji.srednica_stopnia PrintLine(1, " <Srednica_stopnia>" & srednica.tostring & _ "</Srednica_stopnia>") dlugosc = wsk_kolekcji.dlugosc_stopnia PrintLine(1, " <Dlugosc_stopnia>" & dlugosc.tostring & _ "</Dlugosc_stopnia>") faza = wsk_kolekcji.faza Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 7
PrintLine(1, " <Faza>" & faza.tostring & "</Faza>") modyfikacja_stopnia = wsk_kolekcji.modyfikacja_stopnia PrintLine(1, " <Modyfikacja_stopnia>" & modyfikacja_stopnia & _ "</Modyfikacja_stopnia>") PrintLine(1, "</Stopien_walu>") Next PrintLine(1, "</Walek>") FileClose(1) MsgBox("Zapisano do pliku " & plik) Private Sub WałekCzytajToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles WałekCzytajToolStripMenuItem.Click ' Odczyt całego wałka tekstowo Dim plik, srednica, dlugosc, faza, modyfikacja_stopnia, znak, wiersz As String Dim pozycja_znaku As Integer plik = "Dane_walka.xml" FileOpen(1, plik, OpenMode.Input) Liczba_stopni = 0 Do While Not EOF(1) 'czytamy do końca pliku wiersz = LineInput(1) 'czytamy wiersz If Mid(wiersz, 1, 14) = "<Stopien_walu>" Then 'szukamy <Stopien_walu> 'jeśli odczytaliśmy ten wiersz, to następnym wierszem jest np.: ' <Srednica_stopnia>224</Srednica_stopnia> '12345678901234567890 wiersz = LineInput(1) srednica = "" pozycja_znaku = 21 'na tej pozycji leży pierwsza cyfra średnicy Do While znak <> "<" srednica = srednica & znak pozycja_znaku = pozycja_znaku + 1 ' teraz będzie długość: ' <Dlugosc_stopnia>54</Dlugosc_stopnia> '1234567890123456789 wiersz = LineInput(1) dlugosc = "" pozycja_znaku = 20 'na tej pozycji leży pierwsza cyfra długości Do While znak <> "<" dlugosc = dlugosc & znak pozycja_znaku = pozycja_znaku + 1 ' teraz będzie faza: ' <Faza>0</Faza> '12345678 wiersz = LineInput(1) faza = "" pozycja_znaku = 9 'na tej pozycji keży pierwsza cyfra fazy Do While znak <> "<" faza = faza & znak pozycja_znaku = pozycja_znaku + 1 Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 8
' teraz będzie modyfikacja_stopnia: ' <Modyfikacja_stopnia>Pret</Modyfikacja_stopnia> '12345678901234567890123 wiersz = LineInput(1) modyfikacja_stopnia = "" pozycja_znaku = 24 'na tej pozycji leży pierwszy znak modyfikacji Do While znak <> "<" modyfikacja_stopnia = modyfikacja_stopnia & znak pozycja_znaku = pozycja_znaku + 1 Dim mojstopien As New Stopien_walu_parametry mojstopien.dlugosc_stopnia = CSng(dlugosc) mojstopien.srednica_stopnia = CSng(srednica) mojstopien.faza = CSng(faza) mojstopien.modyfikacja_stopnia = modyfikacja_stopnia Kolekcja_stopni_walu.Add(mojStopien) Liczba_stopni = Liczba_stopni + 1 FileClose(1) Call Narysuj() Private Sub ZapiszKolekcjęToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ZapiszKolekcjęToolStripMenuItem.Click 'Zapisywanie kolekcji - każdy stopień w oddzielnym pliku Dim mojstopien As New Stopien_walu_parametry Dim i As Integer Dim NazwaPliku As String Dim SerializacjadoPlikuXml As Serialization.XmlSerializer For i = 1 To Liczba_stopni mojstopien = Kolekcja_stopni_walu.Item(i) NazwaPliku = "Dane_stopnia_kolekcji" & i.tostring & ".xml" Dim plikxml As FileStream = New FileStream(NazwaPliku, FileMode.Create, _ FileAccess.Write, FileShare.None) SerializacjadoPlikuXml = _ New Serialization.XmlSerializer(GetType(Stopien_walu_parametry)) SerializacjadoPlikuXml.Serialize(plikXml, mojstopien) plikxml.close() Next MsgBox("Wałek - Kolekcja stopni został zapisany.") Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 9
Private Sub CzytajKolekcjęToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles CzytajKolekcjęToolStripMenuItem.Click 'Odczyt kolekcji z wielu plików stopni. Dim i As Integer Dim NazwaPliku As String Liczba_stopni = 0 i = 1 Do Dim mojstopien As New Stopien_walu_parametry NazwaPliku = "Dane_stopnia_kolekcji" & i.tostring & ".xml" If Not File.Exists(NazwaPliku) Then MsgBox("Liczba wczytanych stopni = " & Liczba_stopni) Exit Do Dim PlikDanych As FileStream = File.Open(NazwaPliku, FileMode.Open, _ FileAccess.Read) Dim mojaserializacja As New _ Serialization.XmlSerializer(GetType(Stopien_walu_parametry)) mojstopien = mojaserializacja.deserialize(plikdanych) PlikDanych.Close() File.Delete(NazwaPliku) Kolekcja_stopni_walu.Add(mojStopien) Liczba_stopni = Liczba_stopni + 1 i = i + 1 Call Narysuj() Copyright 2016, mgr inż. Janusz Bonarowski, mgr inż. Jacek Jusis 10