Кафедра «Информационных систем и технологий управления в строительстве»
Кафедра «Информационных систем и технологий управления в строительстве»
Методические указания по выполнению
Лабораторных работ
по дисциплине
«Программное обеспечение АСОИУ»
для студентов факультета ИСТАС, специальность 230102 «Автоматизированные системы обработки
Информации и управлении»
Москва 2009 г.
С.А. Королев. Методические указания по выполнению лабораторных работы студентов по дисциплине «программное обеспечение АСОИУ». – Москва, 2009. – 70 стр.
Лабораторная работа №1
Цель: Ознакомится со средой Visual Studio 2008, создать WinForm приложение.
Visual Studio 2008 – среда интерактивной разработки приложений, имеющая интуитивно понятный пользовательский интерфейс, предназначена, для разработки программных продуктов различной сложности и позволяющих решать задачи, в рамках АСО ИУ.
О среде .NET Framework.
Оболочка .NET Framework определяет среду для разработки и выполнения сильно распределенных приложений, основанных на использовании компонентных объектов. Она позволяет "мирно сосуществовать" различным языкам программирования и обеспечивает безопасность, переносимость программ и общую модель программирования для платформы Windows. Важно при этом понимать, что .NET Framework по своему существу не ограничена применением в Windows, т.е. программы, написанные для нее, можно затем переносить в среды, отличные от Windows. Связь среды .NET Framework с С# обусловлена наличием двух очень важных средств. Одно из них, Common Language Runtime (CLR), представляет собой систему, которая управляет выполнением пользовательских программ. CLR — это составная часть .NET Framework, которая делает программы переносимыми, поддерживает многоязыковое программирование и обеспечивает безопасность. Второе средство, библиотека классов .NET-оболочки, предоставляет программам доступ к среде выполнения. Например, если вам нужно выполнить операцию ввода- вывода, скажем, отобразить что-либо на экране, то для этого необходимо использовать .NET-библиотеку классов. Если вы — новичок в программировании, термин класс вам может быть незнаком. Ниже вы найдете подробное объяснение этого понятия, а пока ограничимся кратким его определением: класс — это объектно-ориентированная конструкция, с помощью которой организуются программы. Если программа ограничивается использованием средств, определенных .NET-библиотекой классов, она может выполняться везде (т.е. в любой среде), где поддерживается .NET- система. Поскольку С# автоматически использует .NET-библиотеку классов, С#- программы автоматически переносимы во все .NET-среды.
1. Дизайнер форм приложения
2. Набор основных компонентов
3. Обозреватель проекта
4. Главное меню приложения
5. Функции запуска и отладки, выбор режима сборки (Release, Debug).
6. Окно свойств объектов (по умолчанию св-ва проекта)
Процедура: создание проекта Windows Forms Application
1. File -> New->Project
2. Вводим имя проекта в поле ввода Name и нажимаем кнопку OK.
3. Система готова к работе.
Обозреватель проекта.
1. Папка Properties содержит некоторую служебную информацию о решении.
2. Описывает список подключенных библиотек.
3. Файлы проекта, файл реализации.
Основные события формы.
Предварительно выделим форму, щелчком левой кнопки мыши, затем в окне свойств объектов выберем , для перехода на вкладку событий объекта.
Load – Событие наступает еще до создания формы, но при уже загруженном приложении.
Paint – Прорисовка формы. Наступает при любом изменении какого-либо элемента формы.
Shown – Событие наступает после того как форма нарисована (наступает только при первой прорисовке формы).
Form Closed – Событие наступает после закрытия окна.
Для того чтобы проверить наступление событий, двойной щелчок мышке на событие и осуществляется переход в дизайнер кода, прописываем команду MessageBox.Show(”Имя события”); при запуске программы, можем отследить, когда это событие наступает.
Функции отладки
Для ознакомления с функциями отладки перейдем в пункт меню Debug
Самостоятельно:
1. Добавить к проекту файл реализации.
2. Ознакомиться со структурой проекта на диске.
3. Выполнить сборку в двух режимах Release и Debug.
4. Создать несколько событий формы.
5. Прописать команду отображения сообщения в событиях.
6. Поставить контрольные точки и пройти проект в режиме отладки.
Лабораторная работа №2
Создание Главного меню.
С панели основных компонентов поместим на нашу форму элемент под названием MenuStrip (Рис. 3), это можно сделать путем перетаскивания компонента на форму.
Рис. 3
Создадим несколько пунктов меню. Для этого щелкнем в поле (TypeHere) и впишем туда текст пункта меню (например Файл), значок «&» ставиться после буквы которую необходимо подсветить , в дальнейшем при нажатии сочетаний клавиш (подсвеченная буква + Alt) мы сможем приходить в этот пункт меню. Рис 4.
Рис. 4
Также настройку данного компонента можно произвести из специального меню, для этого щелкнем правой кнопкой мышки по компаненту и выберем пункт «Edit Item». Перед нами откроется следующее меню настройки. Рис 5.
Рис. 5
Создавая каждый пункт меню любым из способов, впоследствии, в окне «Properties» мы можем изменять его свойства и создавать события. Обязательно при создании пунктов необходимо указать их свойство «(Name)». При создании меню главные пункты называются «MenuItem», все остальные дочерние элементы называются «SubItem». При создании дочерних элементов изменяя свойство «ShortcutKeys» можно выставить название кнопки на клавиатуре или сочетание клавиш, которые будут дублировать вызов данного пункта.
Самостоятельно создадим следующие пункты.
Text | Name | ShortcutKeys | Type |
Ф&айл | File_MenuItem | MenuItem | |
С&охранить | Save_SubItem | SubItem | |
Сохранить как | SaveAS_SubItem | SubItem | |
В&ыход | Exit_SubItem | SubItem | |
П&равка | Edit_MenuItem | MenuItem | |
Д&обавить | Add_SubItem | F6 | SubItem |
У&далить | Dell_SubItem | F8 | SubItem |
И&зменить | Change_SubItem | F7 | SubItem |
О&бновить | Refresh_SubItem | F5 | SubItem |
После этого главное меню у нас должно принять следующий вид (Рис 6 и 7)
Рис 6.
Рис 7.
Создание компонента панель.
С панели основных компонентов поместим на нашу форму элемент под названием Panel. это можно сделать путем перетаскивания компонента на форму.
Изменить свойства данного компонента на следующие:
Название свойства | Заначение |
(Name) | MainPanel |
Dock | Left |
MinimumSize | |
Width |
После создания данного компонента наша форма выглядит следующим образом. Рис 15.
Рис 15
Создание объекта документа.
Для создания объекта класса документ объявим его в описании класса MainForm, для этого в файле реализации MainForm пропишем следующую информацию.
… using System.Windows.Forms; namespace ASU_Sklad { public partial class MainForm : Form { TSpr1 _TSpr1; public MainForm() { InitializeComponent(); _TSpr1 = new TSpr1(); } … |
Вызов объекта документ.
Теперь сделаем таким образом, чтобы при выборе элемента в дереве у нас создавалась рабочая форма, работающая с передаваемым ей классом, для этого изменим в файле MainForm.cs следующий код.
private bool CreateWorkForm(string sNameForm, string sClassName) { WorkForm newf; //object a = switch (sClassName) { case "Spr1": newf = new WorkForm((IDocuments)_TSpr1); break; default: newf = new WorkForm(); break; } newf.Text = sNameForm; newf.MdiParent = this; newf.Show(); return true; } private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { for (int i = this.MdiChildren.Length - 1; i >= 0; i--) { if (MdiChildren[i].Text == e.Node.Text) { MdiChildren[i].Activate(); return; } } string []sClassName = e.Node.Name.Split('_'); bool bFormOpen = (e.Node.Parent != null) ? CreateWorkForm(e.Node.Text,sClassName[1]) : false; } |
Создание свойств документа.
Каждый документ уникален, но с ним можно выполнять определенные действия, такие как: отображение информации, добавление информации, изменение информации, удаление информации, обновление информации. Каждые из этих действий в свою очередь тоже уникальны, но мы можем заложить в программу возможность этих действий и в определенный момент вызвать соответствующие операции. Как раз для этого мы и создали специальные классы для документов и интерфейс, через который вызывается соответствующий класс. Теперь применим это на практике. Сделаем так чтобы при открытии документа (в нашем примере справочник Spr1) кнопки на панели ToolStrip и соответствующие пункты меню становились доступными или нет, для этого проделаем следующие действия.
- Создание свойств документа.
Создадим специальные переменные в классе Spr1, которые будут определять возможность пользоваться функциями добавления, изменения и удаления, для этого файл Spr1.cs изменим следующим образом.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ASU_Sklad { class TSpr1 : IDocuments { // Переменные определяющие возможность // добавления изменения и удаления bool _bAdd, _bChange, _bDell; // Свойство только для чтения возвращающее заначение // соответсвующей переменной public bool bAdd { get { return _bAdd;} } public bool bChange { get { return _bChange; } } public bool bDell { get { return _bDell; } } // Конструктор класс где задаются значения переменных public TSpr1() { _bAdd = true; _bChange = true; _bDell = true; } } } |
- Описание интерфейса.
Для того чтобы созданными свойствами можно было пользоваться и они были одинаковы для всех документов необходимо их описать в интерфейсе IDocuments, для этого в файле IDocuments.cs изменим код следующим образом.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ASU_Sklad { public interface IDocuments { // Свойства документа bool bAdd {get ; } bool bChange{ get ; } bool bDell{ get;} } } |
- Доступность объектов из главной формы в дочерних формах.
Теперь необходимо сделать так чтобы при создании формы для документа изменялись свойства кнопок на ToolStrip и MenuStrip. Это можно сделать путем создания события для рабочей формы WorkForm, это событие должно обрабатываться в момент активации формы на экране, но перед этим необходимо сделать доступность изменяемых объектов главной формы в дочерних формах. Нас будут интересовать следующие объекты, представленные в таблице и измененные их свойства.
Имя объекта (Name) | Свойство Modifiers | Свойство Enabled |
ToolBT_Add | Public | False |
ToolBT_Dell | Public | False |
ToolBT_Change | Public | False |
ToolBT_Refresh | Public | False |
Add_SubItem | Public | False |
Dell_SubItem | Public | False |
Change_SubItem | Public | False |
Refresh_SubItem | Public | False |
После изменения свойств объектов необходимо сделать так чтобы объект MainForm был доступен во всех дочерних формах, для этого необходимо изменить код в файле Programs.cs следующим образом.
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace ASU_Sklad { static class Program { // Описане объекта public static MainForm _MainForm; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // Заказ памяти для объекта. _MainForm = new MainForm(); Application.Run(_MainForm); } } } |
- Создание события активации формы WorkForm.
Перейдем в дизайнер формы WorkForms, в окне свойств создадим событие Activated. Перейдем в редактор кода данного события, укажем, чтобы при наступлении данного события кнопки и пункты меню главной формы соответствовали значениям свойств документа, а также обработаем возможные исключения, возникающие при присваивания этих свойств. В случае возникновения исключений соответствующие пункты меню и кнопки сделаем недоступными. Для этого пропишем следующий код.
private void WorkForm_Activated(object sender, EventArgs e) { try { Program._MainForm.ToolBT_Add.Enabled = _IDocuments.bAdd; Program._MainForm.Add_SubItem.Enabled = _IDocuments.bAdd; Program._MainForm.ToolBT_Change.Enabled = _IDocuments.bChange; Program._MainForm.Change_SubItem.Enabled = _IDocuments.bChange; Program._MainForm.ToolBT_Dell.Enabled = _IDocuments.bDell; Program._MainForm.Dell_SubItem.Enabled = _IDocuments.bDell; Program._MainForm.ToolBT_Refresh.Enabled = true; Program._MainForm.Refresh_SubItem.Enabled = true; } catch(Exception ex) { Program._MainForm.ToolBT_Add.Enabled = false; Program._MainForm.Add_SubItem.Enabled = false; Program._MainForm.ToolBT_Change.Enabled = false; Program._MainForm.Change_SubItem.Enabled = false; Program._MainForm.ToolBT_Dell.Enabled = false; Program._MainForm.Dell_SubItem.Enabled = false; Program._MainForm.ToolBT_Refresh.Enabled = false; Program._MainForm.Refresh_SubItem.Enabled = false; } } |
- После запуска программы мы должны увидеть следующее. Рис. 4, 5
Рис. 4.
Рис 5.
Самостоятельно:
8. По аналогии со справочником №1 создать класс для справочника №2 и подключить их к событиям в дереве.
9. Создать классы для входных документов и подключить их к событиям в дереве.
10. Создать класс для выходного документа и подключить его к событию в дереве.
Лабораторная работа №4
Создание файла с данными.
Для работы с входным документом сделаем файл, в том же хранилище где и файлы справочников, с именем InDoc.dat, структура файла должна выглядеть следующим образом.
id | ID_SPR1 | DateInCome | Count |
01.01.2008 | |||
01.02.2008 | |||
01.03.2008 | |||
01.04.2008 | |||
01.05.2008 | |||
01.06.2008 |
Разделитель между колонками такой же, как и в справочниках «^».
Добавление свойств.
Добавим в класс существующих справочников переменную
Создадим в этих же класса свойство, определяющее имя представления.
В интерфейсе IDocuments подключим наше свойство, чтоб к нему был доступ.
В созданную переменную мы запишем имя таблицы, так как для справочников представление создавать мы не будем. В конструкторе каждого класса справочника присвоим значение переменных. Для справочника 1 это
Для справочника 2 соответствующие данные.
После этого необходимо изменить код события активации формы для рабочей формы. Для этого перейдем в файл реализации WorkForm в событие Activated и изменим, параметр для выводимого объекта из DataSet в GridView, для этого поменяем следующую строку.
Запустим нашу программу, все функции для справочников, которые мы создали до этого, должны работать.
Класс входного документа.
Так как класс входного документа наследуется от интерфейса IDocuments, в нем должны быть описаны все необходимые переменные и свойства, также необходимо снять комментарий с описания класса (описание конструкора измениться далее по тексту) заказа памяти и секции в событии компонента MainTreeView для класса TInDoc1. При формировании представления для входного документа нам понадобятся данные из справочника 1, для удобства работы с этими данными нам понадобиться передать в класс TInDoc1 ссылку на класс TSpr1.
В файле входного документа подключим два необходимых пространства имен System.IO и System.Data. Создадим все необходимые переменные для класса TInDoc1 по аналогии с представленным далее кодом.
Далее в этом же классе опишем все необходимые свойства.
Конструктор класса TInDoc1 должен выглядеть следующим образом.
Теперь создадим функцию InitDataTable() где опишем объекты таблицы и представления и все необходимые для этого элементы, Сначала таблицу потом представление.
Теперь в эту же функцию добавим описание представления для первого входного документа.
Теперь переступим к созданию функции, которая будет объединять две таблицы и формировать представление для вывода данных входного документа 1.
Для этого сделаем следующую функцию
Теперь для работы с нашим входным документом необходимо в конструкторе главной формы, где мы заказываем память для классов, указать следующий код для заказа памяти класса TInDoc1.
После этого запустим программу и вызовем первый входной документ. Должно получиться нечто следующее. Рис 1.
Рис 1.
Самостоятельно:
Создать второй входной документ, который будет связан с двумя справочниками.
Spr2.dat
id | NameOBJ | Adress | Telefon | Fax | |
Объект 1 | Москва ул. дм. 1 | 123-45-76 | 123-45-77 | [email protected] | |
Объект 2 | Москва ул. дм. 2 | 123-55-76 | 123-55-75 | [email protected] | |
Объект 3 | Москва ул. дм. 3 | 123-45-36 | 123-45-37 | [email protected] |
InDoc2.dat
id | ID_SPR1 | ID_SPR2 | DateOutCome | Count |
03.01.2008 | ||||
03.02.2008 | ||||
03.03.2008 | ||||
03.04.2008 | ||||
03.05.2008 | ||||
03.06.2008 |
Создать представление для вывода данных из входного документа 2.
id | NameSP1 | WidthSP1 | HeightSP1 | NameOBJ | Adress | DateOutCome | Count |
Лабораторная работа №6
Создание событий.
Теперь необходимо сделать так чтобы по нажатию кнопки «ToolBT_Add», которая расположена на «toolStrip1» главной формы, открывалась созданная панель, также эта панель должна открываться для активного в данный момент документа. Так как мы это делаем для соответствующего документа то обработку события кнопки «ToolBT_Add» необходимо делать в рабочей форме. Для этого выполним следующие шаги:
1. Создадим событие «ToolBT_Add_Click» в фале реализации рабочей формы.
2. Присвоим кнопке «ToolBT_Add» созданное событие в момент активации рабочей формы. Для этого в событии «WorkForm_Activated», в секции «try { }», добавим следующий код, который будет выполняться в случае если в вызываемом классе параметр определяющий активность кнопки выставлен в true. Данный код надо прописать после того как мы изменяем значение «Enabled» для кнопки «ToolBT_Add».
3. Создадим событие «Deactivate» для рабочей формы, для того чтобы когда форма станет не активной у кнопки «ToolBT_Add» отключить присвоенное событие. Для этого
a. в дизайнере формы «WorkForm» выберем нашу форму;
b. перейдем в ее свойства;
c. перейдем в события;
d. найдем там событие «Deactivate»;
e. зайдем в редактирование кода данного события и пропишем там следующий код.
Запустим приложение, выберем в дереве документ, и после нажатия на кнопку «добавить» у нас открывается наша панель.
Далее необходимо сделать так чтоб по нажатию на кнопки «button_Ok» и «button_Cancell», а также при переходе на другой открытый документ наша панель закрывалась, для этого проделаем следующие шаги:
- Первоначально надо сделать функцию, которая будет очищать события кнопок «button_Ok» и «button_Cancell».Для этого в классе рабочей формы создадим следующую функцию.
- Теперь в этом же классе создадим события для кнопок, «button_Ok» и «button_Cancell», по нажатию которых мы будем закрывать панель. Для этого добавим следующий код.
- После этого необходимо изменить событие для кнопки «ToolBT_Add». Чтобы выглядело следующим образом.
Запустим программу. При выборе документа и нажатии кнопки «Добавить» у нас открывается панель с двумя кнопками при нажатии, на которые, она закрывается. Также если у нас открыто два документа, мы нажали кнопку «Добавить» и после этого, выбрали другой документ, то панель тоже закрывается.
Label
Название свойства | Значение |
Name | label_name |
Text | Наименование |
Название свойства | Значение |
Name | label_Width |
Text | Ширина |
Название свойства | Значение |
Name | label_Height |
Text | Высота |
TextBox
Название свойства | Значение |
Name | textBox_name |
Text |
Название свойства | Значение |
Name | textBox_Width |
Text |
Название свойства | Значение |
Name | textBox_Height |
Text |
В итоге у нас должна получится вот такая форма. Рис 2.
Именно эти компоненты мы и будем использовать для справочника №1. Для этого нам понадобится код, который описывает объявление и создание данных компонентов, и нам остается только его взять и правильно изменить для нашего справочника. Проделаем следующие действия:
1. Перейдем в файл реализации дизайна формы <фома>.Disigner.cs.
2. Из этого файла нам, сначала, понадобиться секция, которая описывает созданные компоненты. На рис. 3. эта секция выделена красным, копируем ее и вставляем в класс нашего справочника (рекомендую данную секцию поместить между операторами определяющими регион #region и #endregion ).
Рис 3.
3. После того как мы объявили эти компоненты нам надо заказать для них память, поместить их на панель и выставить соответствующие свойства, все это можно проделать программным путем, для этого в созданную до этого функцию «CreateInterfaseAddChange» справочника №1 мы можем скопировать еще часть кода например рис 4. (Из одного проекта копируем в другой)
Рис. 4
Единственное необходимо уточнить, что когда мы вставим этот код в функцию «CreateInterfaseAddChange» необходимо удалить операторы «this.». Таким образом, мы для наших компонентов закажем память.
4. Теперь эти компоненты необходимо поместить на панель, для этого нам понадобиться следующий код рис 5.
Рис. 5
Только в место this.panel1. надо прописать панель, которую мы передаем в функцию
После этого наша функция «CreateInterfaseAddChange» для справочника №1 должна выглядеть следующим образом. Рис 6.
Рис. 7
5. После этого для этих компонентов необходимо определить их координаты расположения, размер, отображаемый текст, для этого нам в эту функцию понадобиться добавить следующий код, для «Label» рис 8. для «TextBox» рис 9.
Рис 8.
Рис 9.
6. Далее необходимо сделать функцию, которая бы удаляла созданные компоненты. Для этого мы в функцию «DeleteInterfaseAddChange()» пропишем следующий код. Рис 10
Рис 10.
Самостоятельно.
1. Сделать так чтобы событие, при котором открывается панель для добавления, работало и для пункта меню «Добавить».
2. Сделать так чтобы при открытии панели для добавления, кнопка «Добавить» и пункт меню «Добавить» были не активны.
3. Сделать аналогичный интерфейс добавления для всех остальных документов (кроме входного).
Для справочника №2
Label
Название свойства | Значение |
Name | label_NameOBJ |
Text | Наименование объекта |
Название свойства | Значение |
Name | label_Adres |
Text | Адрес |
Название свойства | Значение |
Name | label_Telefon |
Text | Телефон |
Название свойства | Значение |
Name | label_Fax |
Text | Факс |
Название свойства | Значение |
Name | label_Mail |
Text | Почта |
TextBox
Название свойства | Значение |
Name | textBox_NameOBJ |
Text |
Название свойства | Значение |
Name | textBox_Adres |
Text |
Название свойства | Значение |
Name | textBox_Telefon |
Text |
Название свойства | Значение |
Name | textBox_Fax |
Text |
Название свойства | Значение |
Name | textBox_Mail |
Text |
Для Входного документа №1
Label
Название свойства | Значение |
Name | label_NameSP1 |
Text | Наименование материала |
Название свойства | Значение |
Name | label_InCome |
Text | Дата поступления |
Название свойства | Значение |
Name | label_Count |
Text | Количество |
ComboBox
Название свойства | Значение |
Name | comboBox_NameSP1 |
Text |
DateTimePicker
Название свойства | Значение |
Name | dateTimePicker_InCome |
Text |
TextBox
Название свойства | Значение |
Name | textBox_Count |
Text |
Для Входного документа №2
По аналогии с первым входным документом
Лабораторная работа №7
Самостоятельно сделать подобные функции для справочника №2.
Самостоятельно сделать подобные функции для входного документа №2.
Лабораторная работа №8
Самостоятельно.
Для остальных документов и справочника сделать так, чтобы можно было изменять данные.
Лабораторная работа №9
Цель: Удаление данных.
Для выполнения лабораторной работы №9 необходимо выполнить все шаги предыдущих лабораторных работ.
Удаление данных.
Процесс удаление данных намного проще, чем процессы добавление и изменения, так как для него нет необходимости строить интерфейс, данные должны удаляться по нажатию кнопки на панеле быстрых кнопок. Удаление будет происходить из «DataSet» после того как данные будут удалены из него мы перезапишем информацию в файл, после этого его заново прочитаем, тем самым визуально будет казаться что произошло удаление.
Для работы данного процесса нам понадобятся следующие события и функции.
- Создать событие для кнопки на панеле быстрых кнопок.
- Организовать присваивание в событии активации рабочей формы.
- Снять присваивание события в момент деактивации формы.
- Создать описание функции удаления в интерфейсе.
- Создать функцию удаления информации из «DataSet» для каждого документа кроме выходного.
- Вызвать функцию Commit() после того как данные будут удалены из «DataSet».
- Обновить данные функцией Refresh().
Преступим к реализации. Для начала добавим следующие функции в класс справочника №1.
- Создадим функцию, которая будет удалять строку соответствующего кода из таблицы.
- Не забудем подключить данную функцию в интерфейсе «IDocuments».
- Для остальных документов создадим временную заглушку, чтобы не было ошибки при запуске программы.
- В файле реализации рабочей формы создадим событие для кнопки удалить.
- Подключим это событие в момент активации формы.
- Отключим событие в момент деактивации рабочей формы.
- Запустим программу. Если все правильно сделано то когда мы будем нажимать кнопку удалить у нас будут удаляться данные из справочника №1.
Самостоятельно.
- Для остальных документов и справочника сделать так, чтобы можно было удалять данные.
- Для пунктов меню «Добавить», «Удалить», «Изменить» сделать так чтобы они дублировали нажатие кнопок на панеле быстрых кнопок.
- Кнопка «Обновить» и пункт меню «Обновить», должны обновлять данные в таблице, т.е. по нажатию этих кнопок должна вызываться функция Refresh() соответствующего документа.
Кафедра «Информационных систем и технологий управления в строительстве»