Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПиОА_1 семестр_1 / ПОСОБИЕ_VB.Net

.pdf
Скачиваний:
658
Добавлен:
06.03.2016
Размер:
3.4 Mб
Скачать

Отображает клавиши быстрого вызова в пункте

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