Книга: Windows Script Host для Windows 2000/XP

Создание объекта для обмена данными между 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);
}
 

Оглавление книги


Генерация: 1.150. Запросов К БД/Cache: 4 / 1
поделиться
Вверх Вниз