Владимир Волков - Программирование для карманных компьютеров
19. Процедура загрузки данных для текущего дня в компонент ListView приведена в листинге 6.8.
Листинг 6.8Private 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.9Private 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 Sub21. Остальные процедуры будут не столь объемны. После того как файл был загружен и его содержимое было отображено в элементе ListView, надо написать обработчики событий для щелчков на компонентах PictureBox, которые играют роль кнопок. Поскольку при написании этих обработчиков понадобятся переменные, через которые данные будут передаваться из формы в форму, нужно создать модуль и объявить в нем эти переменные.
22. Выполнить команду Project ? Add Module. На экран будет выведено соответствующее диалоговое окно. В строке Name нужно вместо предлагаемого имени указать имя Data, после чего нужно нажать кнопку Open. В окне редактора кода будет открыт пустой модуль. В нем нужно указать код, приведенный в листинге 6.10.
Листинг 6.10Module Data
Public categorySt, startOfSt, endOfSt, noteSt As String
End Module23. Процедура сохранения информации текущего дня при закрытии приложения описана в листинге 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 Sub24. Обработчик щелчка на кнопке 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 Sub25. Обработчик щелчка на кнопке 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 Sub26. Обработчик щелчка на кнопке 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