Создание объекта для обмена данными между XML-файлом и формой

Создание объекта для обмена данными между XML-файлом и формой

В отличие от рассмотренного выше сценария PhoneBook.wsf, в сценарии IEPhoneBook.js функции для работы с записной книжкой не будут разделены по разным заданиям, поэтому для более четкой организации сценария мы воспользуемся объектно-ориентированным подходом и создадим два объекта Person и ListPersons, методы которых и будут осуществлять обработку данных и связь между XML-файлом и пользовательской формой.

Как и раньше, в свойствах объекта Person будет храниться запись об одном человеке. Кроме этого, мы добавим в объект Person метод LoadDialog, который будет заполнять поля ввода в форме данными из соответствующих свойств объекта Person:

//Конструктор объекта Person

function Person() {

 //Инициализируем свойства объекта

 this.LastName="";

 this.Name="";

 this.Phone="";

 this.Street="";

 this.House="";

 this.App="";

 this.Note="";

 //Устанавливаем для метода LoadDialog указатель на

 //функцию Person_LoadDialog

 this.LoadDialog=Person_LoadDialog;

}

//Заполнение полей в форме для текущей записи

function Person_LoadDialog() {

 //Заполняем поля ввода в форме значениями соответствующих

 //свойств объекта Person

 doc.all.txtLastName.value = this.LastName;

 doc.all.txtName.value=this.Name;

 doc.all.txtPhone.value=this.Phone;

 doc.all.txtStreet.value=this.Street;

 doc.all.txtHouse.value=this.House;

 doc.all.txtApp.value = this.App;

 doc.all.txtNote.value = this.Note;

}

Принцип доступа к полям ввода формы по их именам, который используется в методе LoadDialog(), объясняется ниже (см. разд. "Обработка событий, генерируемых элементами управления формы").

Основным объектом, который обеспечивает обмен данными между XML-файлом записной книжки и разработанной нами формой, является объект ListPersons. Этот объект будет содержать три свойства и десять методов.

Первым свойством объекта ListPersons мы сделаем массив PersonArr объектов Person; этот массив будет служить промежуточным буфером при чтении данных из XML-файла для отображения в форме и при записи измененных данных из формы в файл. В остальных двух свойствах СurRecord и IsChanged объекта ListPersons будут соответственно храниться номер текущей записи и логическое значение (true или false), являющееся признаком того, были ли изменены пользователем данные в форме.

Назначение методов объекта ListPersons ясно из комментариев, которые приведены в конструкторе этого объекта (листинг 7.7). 

Листинг 7.7. Конструктор объекта ListPersons

function ListPersons() {

 //          Свойства объекта

 //Создаем массив PersonArr экземпляров объекта Person

 this.PersonArr = new Array();

 //Инициализируем номер текущей записи

 this.CurRecord = 0;

 //Сбрасываем признак изменения данных в форме

 this.IsChanged = false;

 //          Методы объекта

 //Устанавливаем для методов указатели на соответствующие функции

 this.FileToArray=ListPersons_FileToArray;

 this.SaveData=ListPersons_SaveData;

 this.LoadDialog=ListPersons_LoadDialog;

 this.RefreshDialog=ListPersons_RefreshDialog;

 this.NextRecord=ListPersons_NextRecord;

 this.PreviousRecord=ListPersons_PreviousRecord;

 this.FirstRecord=ListPersons_FirstRecord;

 this.FinalRecord=ListPersons_FinalRecord;

 this.NewRecord=ListPersons_NewRecord;

 this.DelRecord = ListPersons_DelRecord;

}

Текст всех методов объекта ListPersons с подробными комментариями приведен в листинге 7.8. 

Листинг 7.8. Методы объекта ListPersons

//Считывание данных из XML-файла в массив объектов Person

function ListPersons_FileToArray() {

 var Root,CurrNode,i;

 //Создаем объект XML DOM

 XML = WScript.CreateObject("Msxml.DOMDocument");

 //Загружаем XML-документ из файла

 XML.load(PathBook);

 //Сохраняем в переменной Root ссылку на корневой элемент

 //документа

 Root=XML.documentElement;

 //Обнуляем массив PersonArr

 this.PersonArr.length=0;

 //Перебираем все дочерние элементы первого уровня вложенности

 //для корневого элемента

 for (i=1; i<=Root.childNodes.length-1;i++) {

  //Выделяем в коллекции XML-элементов i-й элемент

  CurrNode=Root.childNodes.item(i);

  //Создаем новый экземпляр PersonRec объекта Person

  PersonRec=new Person();

  //Заполняем поля объекта PersonRec

  PersonRec.LastName=GetTagVal(CurrNode,"LastName");

  PersonRec.Name=GetTagVal(CurrNode,"Name");

  PersonRec.Phone=GetTagVal(CurrNode,"Phone");

  PersonRec.Street=GetTagVal(CurrNode,"Street");

  PersonRec.House=GetTagVal(CurrNode,"House");

  PersonRec.App=GetTagVal(CurrNode,"App");

  PersonRec.Note=GetTagVal(CurrNode,"Note");

  //Сохраняем объект PersonRec в массиве PersonArr

  this.PersonArr[this.PersonArr.length]=PersonRec;

 }

}

//Запись данных из формы в XML-файл

function ListPersons_SaveData() {

 var Root,CurrNode,ElemList;

 //Сохраняем в переменной Root ссылку на корневой элемент

 //документа

 Root=XML.documentElement;

 //Сохраняем в переменной CurrNode ссылку на (CurRecord+1)-й

 //элемент Person

 CurrNode=Root.childNodes.item(this.CurRecord+1);

 //Записываем данные из полей ввода формы в соответствующие

 //XML-элементы, которые являются дочерними узлами

 //относительно  CurrNode

 SetTagVal(CurrNode,"LastName",doc.all.txtLastName.value);

 SetTagVal(CurrNode,"Name",doc.all.txtName.value);

 SetTagVal(CurrNode,"Phone",doc.all.txtPhone.value);

 SetTagVal(CurrNode,"Street",doc.all.txtStreet.value);

 SetTagVal(CurrNode,"House",doc.all.txtHouse.value);

 SetTagVal(CurrNode,"App",doc.all.txtApp.value);

 SetTagVal(CurrNode,"Note",doc.all.txtNote.value);

 //Сохраняем XML-файл на диске

 XML.save(PathBook);

}

//Загрузка данных для текущей записи в форму

function ListPersons_LoadDialog() {

 //Вызываем метод LoadDialog для объекта Person,

 //который является CurRecord-м элементом массива PersonArr

 this.PersonArr[this.CurRecord].LoadDialog();

}

//Обновление данных в форме

function ListPersons_RefreshDialog(IsGoTop) {

 //Обнуляем массив PersonArr

 this.PersonArr.length=0;

 //Заново загружаем данные из XML-файла в массив PersonArr

 this.FileToArray();

 if (IsGoTop)

  //Переходим к первой записи в массиве

  this.FirstRecord()

 else

  //Переходим к последней записи в массиве

  this.FinalRecord();

 //Загружаем в форму данные для текущей записи

 this.LoadDialog();

}

//Переход к следующей записи

function ListPersons_NextRecord() {

 if (this.CurRecord<this.PersonArr.length - 1)

  //Если текущая запись не является последней, увеличиваем

  //номер текущей записи

  this.CurRecord++;

}

//Переход к предыдущей записи

function ListPersons_PreviousRecord() {

 if (this.CurRecord > 0)

  //Если текущая запись не является первой, уменьшаем

  //номер текущей записи

  this.CurRecord--;

}

//Переход к первой записи

function ListPersons_FirstRecord() {

 this.CurRecord = 0;

}

//Переход к последней записи

function ListPersons_FinalRecord() {

 this.CurRecord = this.PersonArr.length - 1;

}

//Добавление новой записи

function ListPersons_NewRecord() {

 var Root,NewElem;

 //Сохраняем в переменной Root ссылку на корневой элемент

 //документа

 Root=XML.documentElement;

 //Создаем новый элемент Person

 NewElem=XML.createElement("Person");

 //Добавляем новый элемент в XML-файл

 Root.appendChild(NewElem);

 //Сохраняем XML-файл на диске

 XML.save(PathBook);

 //Обновлем в форме данные для последней добавленной записи

 this.RefreshDialog(false);

}

//Удаление текущей записи

function ListPersons_DelRecord() {

 var Root,DelNom;

 //Сохраняем в переменной Root ссылку на корневой элемент

 //документа

 Root=XML.documentElement;

 //В переменной DelNom сохраняем номер удаляемого элемента Person

 DelNom=this.CurRecord+1;

 //Удаляем DelNom-й элемент Person из XML-файла

 Root.removeChild(Root.childNodes.item(DelNom))

 //Сохраняем XML-файл на диске

 XML.save(PathBook);

 //Выводим сообщение о том, что запись удалена

 WshShell.Popup("Запись N "+DelNom+" удалена",0,"Информация",

  vbInformation+vbOkOnly);

 //Обновлем в форме данные для первой записи

 this.RefreshDialog(true);

} 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

8.1. Создание дисков с архивными данными на Data CD/DVD

Из книги Nero 8 автора Кашеваров А

8.1. Создание дисков с архивными данными на Data CD/DVD Часто возникает необходимость записать на компакт-диск различную информацию. Например, сохранить нужные вам документы, записать на один диск различные программы. Это нужно делать не только с целью освобождения свободного


Создание новых записей в форме, связанной с данными

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Создание новых записей в форме, связанной с данными Для создания новой записи в связанном с данными приложении на основе Windows Forms нужно использовать метод AddNew объекта BindingContext. При выполнении этого метода любые связанные с данными элементы управления очищаются для ввода


9.1 Создание программ, управляемых данными

Из книги Виртуальные машины [Несколько компьютеров в одном] автора Гультяев Алексей Константинович

9.1 Создание программ, управляемых данными При создании программ, управляемых данными (data-driven programming), код и структуры данных, на которые он воздействует, четко отделяются друг от друга и проектируются так, чтобы можно было изменять логику программы путем редактирования не


Обмен данными между гостевой и хостовой ОС

Из книги Реферат, курсовая, диплом на компьютере автора Баловсяк Надежда Васильевна

Обмен данными между гостевой и хостовой ОС Virtual PC предоставляет пользователю несколько способов обмена данными между гостевой и хостовой ОС. Один из них — применение разделяемых папок — был рассмотрен ранее. В этом подразделе рассказано, как осуществить оперативный


Обмен данными между гостевой и хостовой ОС

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Обмен данными между гостевой и хостовой ОС По умолчанию любая вновь созданная ВМ способна обмениваться данными с хостовой ОС через буфер обмена. Правда, в отличие от Virtual PC, передавать в обоих направлениях можно лишь текст. Графические данные «обмену и возврату не


Обмен данными между гостевой и хостовой ОС

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей

Обмен данными между гостевой и хостовой ОС Parallels Workstation предоставляет пользователю два способа обмена данными между гостевой и хостовой ОС: передача данных через буфер обмена и пересылка данных по локальной сети. В качестве дополнительного «однонаправленного» метода


4.4. Обмен данными между приложениями Microsoft Office

Из книги Сетевые средства Linux автора Смит Родерик В.

4.4. Обмен данными между приложениями Microsoft Office Пакет Microsoft Office предлагает пользователям целый ряд средств для организации обмена между приложениями. Эти инструменты следует использовать, когда необходимо создать документ, в котором будут размещены элементы разных


9.1. Создание программ, управляемых данными

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

9.1. Создание программ, управляемых данными При создании программ, управляемых данными (data-driven programming), код и структуры данных, на которые он воздействует, четко отделяются друг от друга и проектируются так, чтобы можно было изменять логику программы путем редактирования не


78. Используйте vector (и string::c_str ) для обмена данными с API на других языках

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

78. Используйте vector (и string::c_str) для обмена данными с API на других языках Резюмеvector и string::c_str служат шлюзом для сообщения с API на других языках. Однако не полагайтесь на то, что итераторы являются указателями; для получения адреса элемента, на который ссылается vector<T>::iterator


Создание разделяемого объекта принтера

Из книги Delphi. Трюки и эффекты автора Чиртик Александр Анатольевич

Создание разделяемого объекта принтера Основное различие между разделяемыми объектами файлов и принтеров состоит в том, что в описании последнего присутствует параметр printable = Yes или print ok = Yes (эти параметры являются синонимами). Каталог, указанный в определении объекта,


Создание контейнера с Web-формой поиска

Из книги Видеосамоучитель создания реферата, курсовой, диплома на компьютере автора Баловсяк Надежда Васильевна

Создание контейнера с Web-формой поиска Откроем Web-страницу index.htm в Блокноте, найдем созданный в главе 20 фрагмент кода, создающий Web-форму поиска, и удалим его. Вместо него мы вставим сразу после открывающего тега <BODY> код, приведенный в листинге 21.4. Листинг 21.4 <DIV


Создание контейнера с Web-формой поиска

Из книги C++ для начинающих автора Липпман Стенли

Создание контейнера с Web-формой поиска Откроем Web-страницу index.htm в Блокноте, найдем созданный в главе 20 фрагмент кода, создающий Web-форму поиска, и удалим его. Вместо него мы вставим сразу после открывающего тега <BODY> код, приведенный в листинге 21.4. Листинг 21.4 <DIV


Глава 8 Обмен данными между приложениями

Из книги автора

Глава 8 Обмен данными между приложениями • СообщениеWM_COPYDATA• Использованиебуфераобмена• ПроецируемыевпамятьфайлыОрганизация обмена данными между приложениями, а именно между процессами этих приложений, является достаточно трудоемкой задачей. Архитектура Win32


5.4. Обмен данными между приложениями Microsoft Office

Из книги автора

5.4. Обмен данными между приложениями Microsoft Office Пакет Microsoft Office предлагает пользователям различные средства обмена между приложениями. Такие инструменты следует использовать, когда необходимо создать документ, в котором будут размещены элементы разных приложений Microsoft


14.2.2. Ограничение прав на создание объекта

Из книги автора

14.2.2. Ограничение прав на создание объекта Доступность конструктора определяется тем, в какой секции класса он объявлен. Мы можем ограничить или явно запретить некоторые формы создания объектов, если поместим соответствующий конструктор в неоткрытую секцию. В примере