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