ПиОА_1 семестр_1 / ПОСОБИЕ_VB.Net
.pdf
Отображает клавиши быстрого вызова в пункте
ShowShortcutKeys меню
Определяет название пункта меню. Если вместо Text слова поставить знак минус, элемент станет разде-
лителем: создаст интервал между пунктами меню
Каждый пункт меню имеет свое имя, которое присваивается ему при создании и именовании, для каждого пункта можно написать свою событийную процедуру.
На рис. 10.7 представлен пример пользовательского меню с восемью пунктами. После двойного щелчка на созданном пункте меню (…ToolStripMenuItem) будет сформирована процедура обработки события …ToolStripMenuItem_Click с соответствующим именем.
Рис. 10.7 Пример оформления пользовательского меню
Ниже приведены примерные коды для использования
MenuStrip.
Код для открытия другой формы:
Private Sub ОткрытьToolStripMenuItem_Click (…) _ Handles ОткрытьToolStripMenuItem.Click
Form2.Show()
End Sub
Код для скрытия формы:
Private Sub ЗакрытьToolStripMenuItem_Click (…) _ Handles ЗакрытьToolStripMenuItem.Click
Form2.Hide
End Sub
128
Код для закрытия проекта:
Private Sub ВыходToolStripMenuItem_Click (…) _ Handles ВыходToolStripMenuItem.Click
Close()
End Sub
Примечание. Знак подчеркивания в приведенных выше текстах кода программы означает, что оператор VB.Net продолжается на следующей строке.
10.2.Создание модуля
Ранее мы создавали программные коды только в файлах формы. Все переменные, пользовательские подпрограммы и другие объекты были описаны в коде формы. Когда же создаются многооконные приложения, то возникает необходимость использования одних и тех же объектов в программных кодах разных форм. При работе с общими переменными, пользовательскими процедурами и функциями в Vb.Net используется модуль проекта (Module).
Модуль следует использовать для хранения кодов подпрограмм и описания переменных, глобальных относительно всего приложе-
ния, т.е. доступных в программном коде любой формы приложения. Программные коды модуля хранятся отдельно от всей программы,
что уменьшает вероятность ошибки. |
|
|
||
Создать |
модуль |
можно, |
выполнив |
команду |
Project → Add Module.В появившемся окне Add |
New Item |
|||
нажмите кнопку Add. Далее в окно Module1.vb следует поместить коды общих процедур, функций, а также описание глобальных для всего проекта переменных.
Переменные и подпрограммы, объявленные в Module с помощью оператора Public становятся глобальными по отношению ко всем формам проекта.
Например, в представленном ниже модуле глобально описаны:
-одномерный массив arr,
-две пользовательские процедуры Sl_O (заполнение одномерного массива случайными числоми) и Vivod (вывод одномерного массива в текстовое окно),
-пользовательская функция Max (нахождение максимального элемента в одномерном массиве).
129
Module Module1
Public arr() As Int32 ' Динамический массив
Public Sub SL_O(ByRef x() As Int32)
Dim c As New Random ' Объект класса Random
For i As Byte = 0 To x.Length - 1
x(i) = c.Next(-10, 10)
Next i
End Sub
Public Sub Vivod(ByVal x() As Int32, ByVal B As TextBox)
B.Text = ""
For i As Byte = 0 To x.Length - 1
B.Text &= Convert.ToString(x(i)) & " "
Next i
End Sub
Public Function Max(ByVal x() As Int32) As Int32
max = x(0)
For i As Byte = 1 To x.Length - 1 If x(i) > max Then max = x(i)
Next i
End Function End Module
10.3.Практическая часть. Создание многооконных приложений
Задача 10.1. Несколькими станциями наблюдений ведется измерение траекторных параметров полета объекта.
Каждая из станций ведет последовательную запись значений изучаемого параметра со своей частотой, фиксируя моменты времени регистрации параметров.
После объединения записей измерений разными станциями получается общий двумерный массив, первый столбец которого составляет моменты времени, а второй – значение параметра, соответствующее этим моментам времени.
Создать многооконное приложение, которое позволяет:
130
-Записывать, корректировать и считывать данные из текстовых файлов.
-Объединять полученные данные в единый двумерный массив.
-Сортировать объединенные данные по возрастанию методом обмена, используя условие Айверсона.
-Модифицировать двумерный массив, содержащий отсортированные данные, оставляя максимальный параметр при одинаковом времени измерения и записывать результат в новый текстовый файл.
-Показывать на экране результат объединения, сортировки и модификации данных.
-Строить график изменения регистрируемого параметра в зависимости от времени.
Описание проекта
Проект будет содержать семь форм:
-Главная форма проекта (Form1) содержит меню задачи.
-Вторая форма (Form2) позволяет считывать данные из файлов.
-Третья форма (Form3) позволяет записывать данные в файл.
-Четвертая форма (Form4) позволяет корректировать данные в файле.
-Пятая форма (Form5) позволяет сортировать считанные данные.
-Шестая форма (Form6) позволяет модифицировать отсортированные данные.
-Седьмая форма (Form7) позволяет визуализировать модифицированные данные.
Кроме того, в проект включен модуль (Module1), в котором описаны массивы и процедуры, предназначенные для глобального использования в проекте.
Меню многооконного приложения создано с помощью объекта класса MenuStrip. На рис. 10.8 представлен интерфейс формы, которая открывается при запуске приложения.
131
Рис. 10.8 Интерфейс главной формы приложения (Form1)
Ниже представлен программный код, позволяющий открывать необходимые формы при выборе соответствующих пунктов меню.
Public Class Form1
Private Sub _
СчитатьДанныеИзФайлаToolStripMenuItem_Click(…) Handles … Form2.Show()
End Sub
Private Sub _
ЗаписатьДанныеВФайлToolStripMenuItem_Click(…) Handles … Form3.Show()
End Sub
Private Sub _
СкорректироватьДанныеВФайлеToolStripMenuItem_Click(…) Handles …
Form4.Show()
End Sub
132
Private Sub _
СортироToolStripMenuItem_Click(…) Handles … Form5.Show()
End Sub
Private Sub _
МодифицироватьToolStripMenuItem_Click(…) Handles … Form6.Show()
End Sub
Private Sub _
ВизуализироватьДанныеToolStripMenuItem_Click(…) Handles … Form7.Show()
End Sub
Private Sub ВыходToolStripMenuItem_Click(…) Handles … Close()
End Sub
End Class
Пункт меню Файл (рис. 10.9) позволяет открывать формы, связанные с чтением (Form2), записью (Form3) и коррекцией (Form4) исходных данных, находящихся в текстовых файлах. Интерфейс этих форм представлен на рис. 10.10.
Рис. 10.9 Пункт меню Файл
133
Form2 |
Form3 |
Form4 |
Рис. 10.10. Интерфейс форм Чтения, Записи и Корректировки данных
Ниже представлены программные коды чтения, записи и корректировки данных в текстовых файлах.
Программный код формы Form2:
Imports System.IO
Imports System.Collections.ArrayList
Public Class Form2
Private Sub Button1_Click(…) Handles Button1.Click
Dim n As Int32 = 0
Dim R As StreamReader
Static s As New ArrayList
If RadioButton1.Checked Then
OpenFileDialog1.Filter = "Text files (*.txt)|*.txt" If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
'открытие потока для чтения данных
R = File.OpenText(OpenFileDialog1.FileName) R.ReadLine()'пропуск первой строки файла
Do
'добавление прочитанной строки файла в коллекцию ArrayList s.Add(R.ReadLine())
Loop Until R.Peek = -1 'признак конца файла R.Close()'закрытие потока
134
MsgBox("Данные из файла считаны")
End If
End If
If RadioButton2.Checked Then
n = s.Count количество элементов в коллекции s
Dim matr() As String ReDim arr(n - 1, 1)
For i As Int32 = 0 To n – 1
'строка коллекции по пробелу разделяется на массив подстрок matr = Convert.ToString(s(i)).Split()
'каждая подстрока конвертируется в соответствующий 'элемент строки числового массива
For j As Int32 = 0 To 1
arr(i, j) = Convert.ToDouble(matr(j))
Next j
Next i
'вызов процедуры вывода массива в объект класса DataGridView out_put(arr, DataGridView1)
End If
End Sub
End Class
Пояснение. При выборе переключателя RadioButton1 начинает работать часть программного кода, которая позволяет считывать строки текстового файла и запоминать их в коллекции S класса ArrayList. Коллекция была выбрана из соображений динамичного изменения ее размера, так как заранее неизвестно, сколько записей из текстовых файлов будет считано. Кроме того, коллекция объявлена как Static, что позволяет сохранять в ней значения после завершения работы процедуры.
При выборе переключателя RadioButton2 начинает работать часть программного кода, позволяющий конвертировать коллекцию S в двумерный массив arr, который описан глобально в Module, и доступен всем формам приложения. Переменная n содержит количество элементов в коллекции S.
Массив arr выводится в объект класса DataGridView с помощью процедуры out_put, которая описана в Module и доступна всем формам приложения.
135
Программный код формы Form3:
Public Class Form3
Private Sub Button1_Click(…) Handles Button1.Click
out_file(SaveFileDialog1, TextBox1)
End Sub
End Class
Пояснение. Данные, которые нужно записать в текстовый файл, вводятся по строчкам в текстовое окно: вначале первый парамеметр, затем через пробел второй параметр.
Процедура Button1_Click вызывает процедуру out_file, которая и записывает данные из заполненого текстового окна в файл.
Процедура out_file описана в Module и доступна всем формам приложения.
Программный код формы Form4:
Imports System.IO
Public Class Form4
Private Sub Form4_Load(…) Handles MyBase.Load
OpenFileDialog1.Filter = "Text files (*.txt)|*.txt"
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
'открытие потока для чтения данных
Dim R As StreamReader = _
File.OpenText(OpenFileDialog1.FileName)
Do
TextBox1.Text &= R.ReadLine() & Chr(13) & Chr(10)
Loop Until R.Peek = -1
R.Close()
End If
End Sub
Private Sub Button1_Click(…) Handles Button1.Click
out_file(SaveFileDialog1, TextBox1)
End Sub
End Class
136
Пояснение. Процедура Form4_Load начинает работать, когда открывается форма Form4. Эта процедура заполняет по строкам текстовое окно данными из потока, связанного с выбранным файлом.
Процедура Button1_Click с помощью процедуры out_file записывает скорректированные данные из текстового окна в заданный файл.
Пункт меню Обработать данные (рис. 10.11) позволяет открывать формы, связанные с сортировкой Form5 и модифицированием Form6 исходных данных.
Интерфейс этих форм представлен на рис. 10.12…
Рис. 10.11 Пункт меню Обработать данные
137
Form5 |
Form6 |
Рис. 10.12. Интерфейс форм Сортировки и Модификации данных
Ниже представлены программные коды сортировки и модификации данных.
Программный код формы Form5:
Public Class Form5
Private Sub Form5_Load(…) Handles MyBase.Load
out_put(arr, DataGridView1)
End Sub
Private Sub Button1_Click(…) Handles Button1.Click Dim n, m As Int32
Dim t As Boolean 'позволяет реализовать условие Айверсона Dim p() As Double 'вспомогательный массив для перестановки Dim i As Int32 = 0 'счетчик шагов сортировки
n = arr.GetLength(0) m = arr.GetLength(1) ReDim p(n - 1)
t = True
While (i < n - 1) And t 'условие продолжения сортировки 'очередной шаг сортировки осуществляется, если еще не все шаги 'реализованы и на предыдущем шаге была перестановка элементов
138
t = False
For j As Int32 = 0 To n - i - 2
If arr(j, 0) > arr(j + 1, 0) Then
'перестановка строк двумерного массива
For k As Int32 = 0 To m - 1 p(k) = arr(j, k)
arr(j, k) = arr(j + 1, k) arr(j + 1, k) = p(k)
'изменение переменной t, если перестановка была t = True
Next k
End If
Next j
i += 1
End While
out_put(arr, DataGridView2)
End Sub
End Class
Пояснение. При загрузке формы исходный массив передается в объект DataGridView1 процедурой out_put.
Процедура Button1_Click сортирует массив методом обмена, который для одномерного массива был описан и реализован в разделе 6 (задача 6.16). Данная процедура сортирует по первому параметру двумерный массив методом обмена. Метод является улучшенным за счет использования условия Айверсона, которое заключается в том, что если на очередном шаге сортировки обменом не было ни одной перстановки, то массив уже отсортирован, и процесс можно прервать. Реализовать условие Айверсона позволяет логическая переменная t.
Программный код формы Form6:
Public Class Form6
Private Sub Form6_Load(…) Handles MyBase.Load
out_put(arr, DataGridView1)
End Sub
Private Sub Button1_Click(…) Handles Button1.Click Dim c(,) As Double
Dim n, m, k, i, j As Int32
n = arr.GetLength(0)
139
m = arr.GetLength(1)
'расчет количества строк, с одинаковыми соседними первыми элементами
For i = 0 To n - 2
If arr(i, 0) = arr(i + 1, 0) Then k += 1
Next i
'выделение памяти под массив c, в котором будут храниться 'модифицированные данные
ReDim c(n - k - 1, m - 1) k = 0
'заполнение первой строки массива c
'элементами первой строки отсортированного массива arr
For j = 0 To m - 1
c(k, j) = arr(0, j)
Next j
i = 1
'цикл по строкам массива arr, начиная со второй строки
While i <= n - 1
'перенесение в массив c строки массива arr с максимальным 'вторым элементом при одинаковом первом элементе
If arr(i, 0) = c(k, 0) Then
If arr(i, 1) >= c(k, 1) Then c(k, 1) = arr(i, 1) Else: k += 1
For j = 0 To m - 1
c(k, j) = arr(i, j)
Next j
End If
i += 1
End While
'перенесение в массив c последней строки массива arr, если 'строки с таким первым элементом в массив c еще не было
If arr(n - 2, 0) <> arr(n - 1, 0) Then
For j = 0 To m - 1
c(k, j) = arr(n - 1, j)
Next j
k += 1 'счетчик строк массива c
End If
'замена массива arr массивом c
ReDim arr(k - 1, m - 1)
140
n = arr.GetLength(0) : m = arr.GetLength(1)
For i = 0 To n - 1 For j = 0 To m - 1
arr(i, j) = c(i, j)
Next j
Next
'вызов процедуры вывода модифицированного массива arr out_put(arr, DataGridView2)
End Sub
Private Sub Button2_Click(…) Handles Button2.Click
'сохранение массива arr в текстовом файле
out_file(SaveFileDialog1, arr)
End Sub
End Class
Пояснение. При загрузке формы исходный массив передается в объект DataGridView1 процедурой out_put.
По условию задачи в отсортированном массиве необходимо оставить строки, которые имеют максимальный второй элемент при одинаковом первом элементе.
Для упрощения программного кода необходимые строки массива arr вначале заносятся в промежуточный двумерный массив с, а затем массив arr очищается, меняет свою размерность и в него переносятся все элементы массива с.
Пункт меню Визуализировать данные позволяет открыть форму (Form7), связанную с построением графика модифицированных данных: по оси X откладывается первый столбец полученного двумерного массива (время), по оси Y откладывается второй столбец полученного двумерного массива (исследуемый параметр).
Интерфейс этой формы представлен на рис. 10.13.
141
Рис. 10.13 Интерфейс формы Визуализация данных
Ниже представлен фрагмент программного кода построения самого графика изменения исходных данных с течением времени. Процедуры расчетов масштаба и смещения, построения линий сетки, осей, засечек можно взять из раздела 9 (задача 9.2).
...
'Построение графика
For i As Int32 = 0 To arr.GetLength(0) - 2 Graph.DrawLine(pn, _
Convert.ToInt32(arr(i, 0) * m_x) + sx, _ Convert.ToInt32(arr(i, 1) * m_y) + sy, _ Convert.ToInt32(arr(i + 1, 0) * m_x) + sx, _ Convert.ToInt32(arr(i + 1, 1) * m_y) + sy)
Next i
...
142
Ниже представлен программный код модуля Module1, в котором глобально описан массив arr, и пользовательские процедуры out_put и out_file, используемые в формах проекта.
Imports System.IO
Module Module1
Public arr(,) As Double
Public Sub out_put(ByVal a(,) As Double,
ByVal b As DataGridView)
b.RowCount = a.GetLength(0) + 1 b.ColumnCount = 2 b.ColumnHeadersVisible = False b.RowHeadersVisible = False
b.Rows(0).DefaultCellStyle.BackColor = Color.LightGray b.Rows(0).Cells(0).Value = "t" b.Rows(0).Cells(1).Value = "p"
For i As Int32 = 1 To a.GetLength(0) For j As Int32 = 0 To 1 b.Columns(j).Width = 50
b.Rows(i).Cells(j).Value =Convert.ToString(a(i-1, j))
Next j
Next i
End Sub '*********************************
Public Sub out_file(ByVal a As SaveFileDialog, _ ByVal b As TextBox)
a.Filter = "Text files (*.txt)|*.txt" If a.ShowDialog() = DialogResult.OK Then
Dim W As StreamWriter = File.CreateText(a.FileName) W.WriteLine(b.Text)
W.Close()
End If
End Sub '*********************************
Public Sub out_file(ByVal a As SaveFileDialog, _ ByVal b(,) As Double)
Dim S As String
a.Filter = "Text files (*.txt)|*.txt"
If a.ShowDialog() = DialogResult.OK Then
Dim W As StreamWriter = File.CreateText(a.FileName)
For i As Int32 = 0 To b.GetLength(0) - 1 S = Convert.ToString(b(i, 0)) & " " _
& Convert.ToString(b(i, 1))
143
W.WriteLine(S)
Next i
W.Close()
End If
End Sub '*********************************
End Module
Пояснение. Процедура out_file перегруженная. Это означает, что при ее вызове в качестве второго параметра передается либо объект класса TextBox, либо двумерный массив.
Задача 10.2. Сравнить время работы:
1) некоторых операций над массивами Array и списками
ArrayList:
-формирования 10000000 элементов целых числовых данных
-перестановки 10000000 элементов целых числовых данных в обратном порядке (метод Reverse)
-сортировки 10000000 элементов целых числовых данных (метод
Sort)
-сортировки 10000 элементов строковых данных (метод Sort)
2) метода Sort класса Array и пользовательского метода быстрой сортировки quick_sort, описанного в разделе 6.
Пояснение. В библиотеке классов FCL каркаса Framework есть класс Stopwatch, который предоставляет набор методов и средств, используемых для измерения времени затраченного программным кодом.
Средство |
|
Действие |
|
Метод Start() |
запускает или продолжает измерение затраченного |
||
времени для интервала |
|||
|
|||
|
|
|
|
Метод Stop() |
останавливает |
измерение затраченного времени |
|
для интервала |
|
||
|
|
||
|
|
||
Метод Reset() |
останавливает измерение интервала времени и об- |
||
нуляет затраченное время |
|||
|
|||
|
|
||
Свойство Elapsed |
возвращает общее затраченное время, измеренное |
||
текущим экземпляром |
|||
|
|||
|
|
|
|
|
144 |
|
|
Прежде чем начать измерение затраченного времени необходимо создать экземпляр класса Stopwatch и экземпляр класса Time-
Span.
Каждый вызов метода Start начинает подсчет совокупного затраченного времени; каждый вызов метода Stop завершает текущий интервал подсчета и фиксирует совокупное затраченное время. Затраченное время при помощи свойства Elapsed помещается в экземпляр класса TimeSpan. Метод TotalSeconds, примененный к экземпляру TimeSpan, возвратит время в секундах. Чтобы очистить совокупное затраченное время в существующем экземпляре Stopwatch, необходимо использовать метод Reset.
Описание проекта
Проект будет содержать три формы:
-Главная форма проекта (Form1) содержит меню задачи.
-Вторая форма (Form2) позволяет оценить время некоторых операций над массивами Array и списками ArrayList.
-Третья форма (Form3) позволяет оценить время работы метода Sort класса Array и пользовательской процедуры быстрой сортировки quick_sort.
Меню многооконного приложения создано с помощью объекта класса MenuStrip. На рис. 10.14 представлен интерфейс формы, которая открывается при запуске приложения.
Рис. 10.14 Меню задачи 10.2 (Form1)
Ниже представлен программный код, позволяющий открывать необходимые формы при выборе соответствующих пунктов меню.
Public Class Form1
Private Sub ВремяМассивСпискиToolStripMenuItem_Click(…) _ Handles ВремяМассивСпискиToolStripMenuItem.Click
Form2.Show()
End Sub
145
Private Sub ВремяСортировкиToolStripMenuItem_Click(...) _ Handles ВремяСортировкиToolStripMenuItem.Click
Form3.Show()
End Sub
End Class
Первый пункт меню позволяет открыть форму, связанную с исследованием времени некоторых операций над массивами Array и
списками ArrayList.
Интерфейс формы представлен на рис. 10.15. Видно, что по сравнению с массивами Array коллекции ArrayList работают гораздо медленнее.
Рис. 10.15 Интерфейс второй формы проекта (Form2)
Ниже представлен программный код данной формы:
Public Class Form2
Private Sub Button1_Click(...) Handles Button1.Click
Dim d As New Stopwatch()'создание экземпляра класса Stopwatch
Dim time As TimeSpan |
'создание экземпляра класса TimeSpan |
||
Dim c1(10000000) As Int32 |
'массив |
||
Dim a1 As New ArrayList(10000000) 'список |
|||
d.Reset() |
'обнуление времени |
||
|
|
|
|
|
|
|
146 |
d.Start() |
'запуск измерения времени |
'Формирование 10000000 элементов массива целых числовых данных
For i As Int32 = 0 To 10000000 - 1 c1(i) = i
Next i
d.Stop() 'остановка измерения времени time = d.Elapsed 'общее затраченное время
'метод TotalSeconds возвращает секунды из формата TimeSpan
TextBox1.Text = time.TotalSeconds.ToString("0.000000")
'Формирование 10000000 элементов списка целых числовых данных d.Reset()
d.Start()
For i As Int32 = 0 To 10000000 - 1 a1.Add(i)
Next i
d.Stop()
time = d.Elapsed
TextBox2.Text = time.TotalSeconds.ToString("0.000000")
'Перестановка 10000000 элементов массива целых числовых данных 'в обратном порядке (метод Reverse)
d.Reset()
d.Start()
Array.Reverse(c1)
d.Stop()
time = d.Elapsed
TextBox3.Text = time.TotalSeconds.ToString("0.000000")
'Перестановка 10000000 элементов списка целых числовых данных 'в обратном порядке (метод Reverse)
d.Reset()
d.Start()
a1.Reverse()
d.Stop()
time = d.Elapsed
TextBox4.Text = time.TotalSeconds.ToString("0.000000")
'Сортировка Sort 10000000 элементов массива целых числовых данных d.Reset()
d.Start()
Array.Sort(c1)
d.Stop()
time = d.Elapsed
147
