KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Владимир Волков - Программирование для карманных компьютеров

Владимир Волков - Программирование для карманных компьютеров

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Владимир Волков, "Программирование для карманных компьютеров" бесплатно, без регистрации.
Перейти на страницу:

19. Процедура загрузки данных для текущего дня в компонент ListView приведена в листинге 6.8.

Листинг 6.8

Private Sub Data_Load(ByVal MyDate As String)

'Открываем файл, для это сначала получаем полный путь каталога,

'в котором расположена программа в строковую переменную dirStr

dirStr = IO.Path.GetDirectoryName_

(Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase.ToString)

'Создаем экземпляр объекта XmlTextReader

Dim xmlrdrMy As New Xml.XmlTextReader(dirStr + В«2005.xmlВ»)

Dim MyCount, MyIndex As Integer

Dim lvItem As ListViewItem

'Не реагируем на пробелы и управляющие символы

xmlrdrMy.WhitespaceHandling = xmlrdrMy.WhitespaceHandling.None

'Переходим к содержимому, пропуская заголовочную часть

xmlrdrMy.MoveToContent()

'В цикле считываем значения из файла, добавляем новую строку в ListView

'для каждого тега Index и копируем значения атрибутов тега Index в

'соответствующие поля записи ListView

ListView1.Items.Clear()

ListView1.Refresh()

While Not xmlrdrMy.EOF

If xmlrdrMy.Name = В«DataВ» Then

If xmlrdrMy.GetAttribute(В«valueВ») = MyDate Then

MyIndex = CInt(xmlrdrMy.GetAttribute(В«CntВ»))

For MyCount = 0 To MyIndex – 1

xmlrdrMy.Read()

lvItem = New ListViewItem(xmlrdrMy.GetAttribute(В«CategoryВ»))

ListView1.Items.Add(lvItem)

ListView1.Items.Item(MyCount). SubItems.Add_

(xmlrdrMy.GetAttribute(В«StartOfВ»))

ListView1.Items.Item(MyCount). SubItems.Add(xmlrdrMy.GetAttribute(В«EndOfВ»))

ListView1.Items.Item(MyCount). SubItems.Add(xmlrdrMy.GetAttribute(В«NoteВ»))

Next

End If

End If

'Считываем следующий элемент из файла XML

xmlrdrMy.Read()

End While

'Закрываем файл

xmlrdrMy.Close()

End Sub

В этом случае мы воспользовались классом XmlTextReader для считывания информации из файла. Класс XmlTextReader также позволяет разбирать содержимое XML-документа, но он не создает копию файла в памяти, а считывает его в один проход элемент за элементом. Переход к следующему элементу осуществляется вызовом метода Read().

20. Теперь нужно создать процедуру сохранения данных текущего дня в файл. Эта процедура должна запускаться при переходе от одной даты к другой, а также в момент закрытия приложения. Ее код приведен в листинге 6.9.

Листинг 6.9

Private Sub Data_Save(ByVal MyDate As String)

Dim MyCount, MyIndex As Integer

'Создаем объект XmlDocument

Dim myxml As New Xml.XmlDocument

dirStr = IO.Path.GetDirectoryName_

(Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase.ToString)

'Загружаем файл в объект XmlDocument

myxml.Load(dirStr + В«2005.xmlВ»)

'Перебираем все узлы уровня Data и находим сохраняемую дату

For MyCount = 0 To myxml.ChildNodes(1). ChildNodes.Count – 1

If myxml.ChildNodes(1). ChildNodes(MyCount). Attributes(0). InnerText = MyDate Then

'Удаляем все содержимое этого узла

myxml.ChildNodes(1). ChildNodes(MyCount). RemoveAll()

'Рзаполняем его текущим содержимым полей ListView. При этом мы создаем

'заново атрибуты узла Data и узлы Index со всеми атрибутами для каждой

'строки ListView

'Создаем атрибут value для текущего узла Data

Dim myValue As Xml.XmlAttribute = myxml.CreateAttribute(В«valueВ»)

'Присваиваем атрибуту value значение текущей даты

myValue.InnerText = MyDate

'Добавляем атрибут value к текущему узлу Data

myxml.ChildNodes(1). ChildNodes(MyCount). Attributes.Append(myValue)

'Проделываем предыдущие операции с атрибутом Cnt

Dim mIndex As Xml.XmlAttribute = myxml.CreateAttribute(В«CntВ»)

mIndex.InnerText = ListView1.Items.Count

myxml.ChildNodes(1). ChildNodes(MyCount). Attributes.Append(mIndex)

'Заполняем узел Data вложенными элементами Index

For MyIndex = 0 To ListView1.Items.Count – 1

Dim oIndex As Xml.XmlElement = myxml.CreateElement(В«indexВ»)

myxml.ChildNodes(1). ChildNodes(MyCount). AppendChild(oIndex)

Dim oCategory As Xml.XmlAttribute = myxml.CreateAttribute(В«CategoryВ»)

oCategory.InnerText = ListView1.Items(MyIndex). SubItems(0). Text

myxml.ChildNodes(1). ChildNodes(MyCount). ChildNodes_

(MyIndex). Attributes.Append(oCategory)

Dim oStartOf As Xml.XmlAttribute = myxml.CreateAttribute(В«StartOfВ»)

oStartOf.InnerText = ListView1.Items(MyIndex). SubItems(1). Text

myxml.ChildNodes(1). ChildNodes(MyCount). ChildNodes_

(MyIndex). Attributes.Append(oStartOf)

Dim oEndOf As Xml.XmlAttribute = myxml.CreateAttribute(В«EndOfВ»)

oEndOf.InnerText = ListView1.Items(MyIndex). SubItems(2). Text

myxml.ChildNodes(1). ChildNodes(MyCount). ChildNodes_

(MyIndex). Attributes.Append(oEndOf)

Dim oNote As Xml.XmlAttribute = myxml.CreateAttribute(В«NoteВ»)

oNote.InnerText = ListView1.Items(MyIndex). SubItems(3). Text

myxml.ChildNodes(1). ChildNodes(MyCount). ChildNodes_

(MyIndex). Attributes.Append(oNote)

Next

'Если найден и заполнен требуемый узел Data, прекращаем перебор узлов

Exit For

End If

Next

'Сохраняем документ в файл

myxml.Save(dirStr + В«2005.xmlВ»)

End Sub

21. Остальные процедуры будут не столь объемны. После того как файл был загружен и его содержимое было отображено в элементе ListView, надо написать обработчики событий для щелчков на компонентах PictureBox, которые играют роль кнопок. Поскольку при написании этих обработчиков понадобятся переменные, через которые данные будут передаваться из формы в форму, нужно создать модуль и объявить в нем эти переменные.

22. Выполнить команду Project ? Add Module. На экран будет выведено соответствующее диалоговое окно. В строке Name нужно вместо предлагаемого имени указать имя Data, после чего нужно нажать кнопку Open. В окне редактора кода будет открыт пустой модуль. В нем нужно указать код, приведенный в листинге 6.10.

Листинг 6.10

Module Data

Public categorySt, startOfSt, endOfSt, noteSt As String

End Module

23. Процедура сохранения информации текущего дня при закрытии приложения описана в листинге 6.11. Листинг 6.11

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As

System.ComponentModel.CancelEventArgs) Handles MyBase.Closing

Data_Save(Label1.Text)

End Sub

24. Обработчик щелчка на кнопке PictureBox1, который осуществляет переход к предыдущему дню, приведен в листинге 6.12. Листинг 6.12

Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles PictureBox1.Click

Data_Save(Label1.Text)

D = DateAdd(DateInterval.Day, – 1, D)

Label1.Text = D.ToShortDateString

Data_Load(D.ToShortDateString)

End Sub

25. Обработчик щелчка на кнопке PictureBox2, который осуществляет переход к следующему дню, приведен в листинге 6.13. Листинг 6.13

Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles PictureBox2.Click

Data_Save(Label1.Text)

D = DateAdd(DateInterval.Day, 1, D)

Label1.Text = D.ToShortDateString

Data_Load(D.ToShortDateString)

End Sub

26. Обработчик щелчка на кнопке PictureBox3, который отвечает за добавление очередной записи в текущий день, показан в листинге 6.14. Листинг 6.14

Private Sub PictureBox3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles PictureBox3.Click

Dim lvIt As ListViewItem

'Создаем диалоговую форму редактирования

Dim MyForm As New Form2

'Устанавливаем флаг, показывающий, что был щелчок на кнопке 3

MyForm.Send = 3

'Если ListView не пустой, копируем значения полей текущей записи в

'переменные так, что время конца в текущей записи станет временем начала

'в создаваемой записи

If ListView1.Items.Count > 0 Then

categorySt = ListView1.Items.Item_

(ListView1.Items.Count – 1). SubItems(0). Text

startOfSt = ListView1.Items.Item_

(ListView1.Items.Count – 1). SubItems(2). Text

endOfSt = startOfSt

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*