5122

Работа с типизированными файлами

Лабораторная работа

Информатика, кибернетика и программирование

Работа с типизированными файлами. Цель работы: - Знакомство с файловыми типами в Паскале. - Получение навыков операций с файлами - Применение навыков проектирования сложных программ - Применение навыков создания пользовательского интерфе...

Русский

2012-12-03

207 KB

160 чел.

Работа с типизированными файлами.

Цель работы:

- Знакомство с файловыми типами в Паскале.

- Получение навыков операций с файлами

- Применение  навыков проектирования сложных программ

- Применение навыков создания  пользовательского интерфейса

Содержание отчета

Отчет должен содержать:

  1.  Постановка задачи
  2.  Таблица спецификаций, включая структуру записи файла.
  3.  Схема иерархии модулей.
  4.  Блок-схемы основных модулей или словесное описание алгоритма по пунктам.
  5.  Таблица тестов.
  6.  Результаты тестирования (копии экранов).
  7.  Листинг основных подпрограмм.

Задания

Общее условие

Программа должна включать следующие функции: открытие (создание в случае его отсутствия), сохранение файла, добавление, изменение полей записи, удаление записи, просмотр содержимого файла, обработка запросов. Выбор действия осуществляется посредством меню (MainMenu). Обработка ошибок пользовательского ввода обязательна! При выполнении данного задания следует показать умение пользоваться изученными компонентами.

Для открытия/сохранения файлов использовать стандартные диалоговые окна (компоненты OpenDialog и SaveDialog со страницы Dialogs). Данные читать в переменную типа record, структура которой соответствует варианту задания (использовать типизированный файл). Для отображения данных использовать компонент StringGrid.

Также на форме следует разместить кнопки «Изменить», «Удалить», «Добавить» или использовать контекстное меню (PopupMenu). При выборе редактирования/добавления новой записи следует вызывать форму, на которой размещаются компоненты (Edit, MaskEdit, CheckBox, RadioGroup и др. в соответствии с заданием). Для запоминания выбранной строки в StringGrid для редактирования использовать событие onSelectCell (параметр ARow – номер выбранной строки).

Следует учитывать, что в StringGrid для доступа к конкретной ячейке используется метод Cell[j,i], в котором сначала указывается столбец, а потом строка (счет с 0).

Все изменения, производимые во время выполнения приложения, хранятся в StringGrid, при выборе пункта «Сохранить» – заносятся в файл.

Дополнительное задание: переделать приложение таким образом, чтобы все изменения параллельно отражались на форме и в файле (для удаления записи из файла необходимо создать временный файл, в который перенести все записи, кроме удаляемой; затем старый файл удалить, а временный переименовать по имени удаленного).

Варианты заданий

1 (17). Дан файл student.dat. Поля записи содержат следующие данные: фамилия, имя, отчество, шифр группы, пол, семейное положение (0/1), номер комнаты в общежитии (0-если не в общежитии).

Обработка следующих запросов:

  •  по номеру комнаты вывести список жильцов;
  •  вывести список всех семейных студентов;
  •  по ФИО и шифру группы указать N комнаты проживания;
  •  выдать список студентов с фамилией на заданную букву.

2 (18). База данных heap.dat. Структура записей:  номер изделия, наименование изделия, количество изделий, цена 1 изделия, стоимость.

Обработка следующих запросов:

  •  по номеру изделия выдать справку о наличии его на складе;
  •  выдать общую стоимость всех изделий, хранящихся на складе
  •  выдать список всех изделий c номерами  в заданном интервале;
  •  найти изделие с самой большой ценой.
  •  выдать список изделий на складе, наименование которых начинается с заданной буквы.

3 (19). Записи файла plan.dat имеют вид: шифр специальности, наименование дисциплины, шифр кафедры [БукваЦифраЦифра], количество лекций, количество практик, количество лабораторных, признак: 2 – экзамен, 1 – зачет, 0 – нет ничего.

Обработка следующих запросов:

  •  по шифру кафедры подсчитать общее количество проводимых ею занятий;
  •  вывести список дисциплин для  заданной специальности;
  •  найти план занятий по заданным специальности и дисциплине;
  •  вывести список дисциплин, читаемых заданной кафедрой.

4 (20). База данных table.dat содержит данные о расписании занятий на факультете. Структура записей: шифр группы, день недели, время начала занятия, предмет, номер аудитории, фамилия преподавателя.

Обработка следующих запросов:

  •  выдать расписание на всю неделю для указанной группы;
  •  выдать расписание для указанной группы в указанный день;
  •  найти выходные дни для указанной группы;
  •  выдать номера аудиторий, где проходят занятия по заданному предмету.

5 (21). Справочная gai.dat содержит записи следующего наполнения: марка автомобиля, номер, цвет, год регистрации в ГАИ, фамилия владельца.

Обработка следующих запросов:

  •  выдать фамилии владельцев и номера автомобилей заданной марки;
  •  выдать количество автомобилей заданной марки;
  •  выдать список всех а/м заданной марки, зарегистрированных не раньше заданного года;
  •  поиск владельца а/м по цвету, по марке и по первой букве  номера а/м.

6 (22). База данных study.dat содержит записи вида: номер зачетки, фамилия И.О., номер варианта, отметка о выдаче задания 1 (1/0), отметка о выполнении задания 1 в баллах, отметка о выдаче задания 2 (1/0), отметка о выполнении задания 2 в баллах, отметка о выдаче задания 3 (1/0), отметка о выполнении задания 3 в баллах.

Требуется обеспечить выдачу:

  •  общей ведомости;
  •  справки о студенте по номеру зачетки;
  •  ведомости о выполнении студентами задания с указанным номером;
  •  списка студентов с заданным номером варианта, имеющих заданную сумму баллов по всем 3 задачам;
  •  списка студентов, не получивших задание с указанным номером.

7 (23). База данных table.dat содержит данные о расписании занятий на факультете. Структура записей: шифр группы, день недели, время начала занятия, предмет, номер аудитории, фамилия преподавателя.

Обработка следующих запросов:

- выдать расписание на всю неделю для указанного преподавателя;

- выдать номер аудитории для указанной группы в заданные день и время;

- найти выходные дни для указанного преподавателя;

- выдать список групп, занимающихся в указанный день в заданной
    ауд
итории.

8 (24). В базе book.dat хранятся записи, содержащие: номер каталога, номер книги, наименование книги, год издания, цена 1 экземпляра.

Обеспечить выдачу следующих справок:

  •  по автору книги найти все его книги;
  •  по номеру книги найти наименование книги и автора;
  •  выдать список книг, изданных в указанном году;
  •  найти книги по фамилии автора, году издания.

9 (25). В базе bus.dat хранятся записи, содержащие: номер маршрута, начало маршрута, конец маршрута, тип автобуса, количество автобусов на линии, номер автобазы.

Обеспечить выдачу следующих справок:

  •  определить общее число городских автобусов;
  •  по номеру автобуса определить его маршрут;
  •  выдать список номеров автобусов, маршруты которых проходят через заданный пункт;
  •  выдать список маршрутов, которые обслуживает автобаза с указанным номером.

10 (26). В базе export.dat содержатся сведения об экспорте товаров: наименование товара, страна, импортирующая товар, объем поставляемой партии в штуках, страна-производитель.

Обработка следующих запросов:

  •  найти страны, в которые экспортируется данный товар;
  •  вывести список товаров, поставляемых указанной страной;
  •  вывести наименование товаров, начинающихся с заданной буквы;
  •  вывести общий объем товаров, поставляемых в указанную страну.

11 (27). Дан файл toys.dat, содержащий сведения об игрушках: указывается название игрушки (кукла, мяч, кубики и т.д.), ее стоимость в тыс. руб. и возрастные границы детей, для которых игрушка предназначена.

Получить следующую информацию:

  •  названия самых дорогих игрушек (цена которых отличается от цены самой дорогой не более чем на 1 тыс. руб.);
  •  цены всех игрушек с заданным названием;
  •  найти игрушки, предназначенные детям от N лет;
  •  найти игрушку на заданную букву.

12 (28). База содержит phone.dat номера телефонов сотрудников учреждения: указывается фамилия, инициалы сотрудника, номер телефона и его адрес.

Обработка следующих запросов:

  •  найти телефон сотрудника по его фамилии;
  •  найти список телефонов сотрудников, чьи фамилии начинаются с заданной буквы;
  •  найти список сотрудников, чьи телефоны начинаются с заданной цифры;
  •  найти адрес сотрудника по номеру его телефона.

13 (29). В базе apteka.dat хранятся записи, содержащие информацию о лекарствах: номер аптеки, название лекарства, цена, количество.

Обработка следующих запросов:

  •  получить сведения о наличии лекарства в определенной аптеке;
  •  получить общую стоимость всех лекарств во всех аптеках;
  •  по названию лекарства выдать список аптек, в которых оно имеется;
  •  найти самое дешевое лекарство.

14 (30). В базе данных school.dat хранятся сведения о годовых оценках учеников  школы: ФИО ученика, класс (4-11), индекс класса (А-Ж), оценки за год по литературе, русскому языку, математике, физкультуре, истории.

Обработка следующих запросов:

  •  выдать список учеников-отличников определенного класса;
  •  выдать названия классов, в которых учеников больше 20;
  •  подсчитать неуспевающих учеников в школе;
  •  подсчитать число медалистов.

15 (31). База данных worker.dat содержит записи вида: номер отдела, название отдела, ФИО, пол, год рождения, стаж работы, количество детей.

Требуется выдать:

  •  по номеру отдела информацию обо всех сотрудниках;
  •  фамилии сотрудников, имеющих детей;
  •  список сотрудников со стажем работы больше заданного;
  •  список сотрудников с заданным годом рождения.

16 (32). Дан файл reader.dat с записями вида: индекс издания, наименование, период подписки (количество месяцев), цена 1-го месяца, ФИО подписчика, адрес подписчика, стоимость подписки, N почтового отделения связи.

Обеспечить выдачу следующих справок:

  •  для заданного N почтового отделения создать файл reestr.dat с записями вида: индекс издания, наименование, количество подписчиков по месяцам, общая стоимость подписки;
  •  по фамилии подписчика выдать справку обо всех выписанных им изданиях;
  •  по индексу издания выдать список всех подписавшихся на него;

найти ФИО подписчика, который выписал издания на самую большую сумму в заданном почтовом отделении.

Теоретические сведения, необходимые для выполнения курсовой работы

1. Система программирования Delphi

Среда разработчика Delphi позволяет визуально строить приложение. После запуска системы на экране размещается пустая форма – главное окно приложения. На данной форме можно размещать различные компоненты, а также добавлять в проект новые формы приложения – дочерние.

Проект имеет расширение *.dpr, формы – *.dfm, исходные тексты модулей – *.pas, *.dcu – откомпилированные модули.

В верхней части располагается главное меню Delphi, ниже представлены страницы палитры компонент, в левой части отображается окно инспектора объектов (Object Inspector), с помощью которого можно на этапе проектирования изменять различные свойства компонентов (закладка Properties) и описывать реакцию на события (Events).

Структура программы, созданной с помощью Delphi, несколько отличается от традиционной, что, в свою очередь, обусловливает особенности создания подобных программ. Подобную программу можно представить себе, состоящей из двух частей: интерфейса – части программы, предназначенной для ввода в программу и вывода из нее информации, и собственно операторов, предназначенных для непосредственного решения задачи. В своей работе программа взаимодействует с операционной системой, различными внешними устройствами, базами данных, файлами, другими программами и .т.п.

Интерфейс представляет собой совокупность объектов, с помощью которых осуществляется передача информации в соответствующем направлении, – формы, диалоговые окна, элементы управления и т.д. Во многом выбранный интерфейс определяет структуру всей программы.

Так как объекты в программе являются достаточно автономными, для передачи информации между ними, а также между программой и операционной системой, программой и внешними устройствами и т.д. используется система сообщений. Обычно программа после своего запуска находится в режиме ожидания очередного сообщения, при появлении которого программа анализирует его, определяет, какие действия следует выполнить, и выполняет их, после чего ожидает следующее сообщение. Так как при появлении различных сообщений программа, как правило, выполняет различные действия, все исполняемые операторы представляют собой совокупность подпрограмм, оформленных в виде тех или иных методов различных объектов (включая и методы обработки сообщений и событий), либо самостоятельных подпрограмм.

Приложение – основной связующий объект проекта, организующий цикл по обработке поступающих сообщений.

Форма – интерфейсный элемент, посредством которого осуществляется обмен информацией между приложениями и внешними устройствами. Формы размещаются в приложении, а само приложение может содержать одну или несколько форм.

Компоненты – объекты, размещаемые на формах и предназначенные для выполнения тех или иных операций по отображению, получению и преобразованию информации.

2. Основные свойства компонентов

Свойство – важный атрибут любого компонента. Изменение свойства в инспекторе объектов сразу отражается на визуальной компоненте. Например, если выделить главную форму и в инспекторе объектов поменять свойства Width, то незамедлительно изменится ширина окна формы. Значение свойств можно менять и программно, в ходе выполнения приложения.

Рассмотрим основные свойства, присущие большинству компонентов.

Name – имя компоненты.

Height – длина компоненты.

Width – ширина компоненты.

Top – положение левого верхнего угла компоненты по оси Y.

Left – положение левого верхнего угла компоненты по оси X.

Caption – заголовок.

Font – шрифт текста компоненты.

Style – стиль.

Text – отображаемый текст (например, для компоненты ввода Edit)

и др.

Для программного изменения свойства следует указать имя компонента и свойство через точку. Например:

Form1.Caption:=’Мое первое Windows-приложение’;

If CheckBox1.Checked=true then ….

3. События компонентов

Обработка событий заключается в написании кода – обработчика реакции на какое-либо событие. Например, при активном главном окне найдем в инспекторе объектов на закладке Events событие OnClose, которое возникает при закрытии окна. Дважды щелкнув на пустое поле справа от имении события, Delphi автоматически построит каркас обработчика – создаст процедуру:

procedure TИмяФормы.FormClose(Sender: TObject; var Action: TCloseAction);

begin

{Тело процедуры}

end;,

в теле которой можно написать, например, код для отображения окна сообщения:

ShowMessage('Форма закрывается!');

Событие OnCreate возникает при создании компонента, OnClick – при щелчке мышкой по компоненте, OnDblClick – для двойном щелчке мышкой по компоненте, OnMouseMove – при движении курсора мыши над компонентом и т.п.

Таким образом, чтобы, например, вызвать другую форму при нажатии кнопки, необходимо написать соответствующий код в обработчике события OnClick для данной кнопки.

4. Компоненты Delphi

Палитра компонентов содержит несколько страниц (Standard, Additional, Dialog, Sample и др.)

Рассмотрим некоторые компоненты страницы Standard (стандартные компоненты).

1) MainMenu – главное окно программы. Служит для создания сложных иерархических меню.

2) PopupMenu – вспомогательное меню, обычно появляется в виде отдельного окна после нажатия правой кнопки мыши. Привязывается к конкретному компоненту.

3) Label – метка. Используется для размещения на форме не очень длинных однострочных надписей.

4) Edit – строка ввода. Предназначена для ввода и/или отображения одной текстовой строки.

5) Memo – многострочный текстовый редактор. Используется для ввода и/или отображения многострочного текста.

6) Button – командная кнопка. Обработчик события OnClick обычно используется для реализации некоторой команды.

7) CheckBox – независимый переключатель. Щелчок мышью по компоненту в работающей программе изменяет логическое свойство Checked.

8) RadioButton – зависимый переключатель. Обычно объединяется как минимум еще с одним таким же компонентом в группу. Щелчок по переключателю приводит к автоматическому освобождению ранее выбранного переключателя в той же группе.

9) ListBox – список выбора. Содержит список предлагаемых вариантов (опций) и дает возможность проконтролировать текущий выбор.

10) ComboBox – комбинированный список выбора. Представляет собой комбинацию списка выбора и текстового редактора.

11) GroupBox – группа элементов. Используется для группировки нескольких связанных по смыслу компонентов.

12) RadioGroup – группа зависимых переключателей. Содержит специальные свойства для обслуживания нескольких связанных зависимых переключателей.

13) Panel – Панель. Используется для визуального объединения нескольких компонентов.

Некоторые компоненты страницы Additional:

1) BitBtn – командная кнопка с надписью и пиктограммой.

2) SpeedButton – пиктографическая кнопка. Обычно используется для быстрого доступа к тем или иным опциям главного меню.

3) MaskEdit – специальный текстовый редактор. Способен фильтровать вводимый текст, например, для правильного ввода даты (задается маска).

4) StringGrid – таблица строк. Обладает мощными возможностями для представления текстовой информации в табличном виде.

5) DrawGrid – произвольная таблица. Строки этого компонента могут содержать произвольную информацию, в том числе и рисунки.

6) Image – рисунок. Предназначен для отображения рисунков.

7) Shape – фигура. Помогает вставить правильную графическую фигуру – прямоугольник, эллипс, окружность и т.п.

При изучении возможностей компонентов следует воспользоваться встроенной справочной службой Delphi.

5. Работа с формами

Как известно, существуют информационные окна (формы) и диалоговые. Информационное окно предназначено в основном для вывода информации пользователю. Диалоговые окна – специальные формы, предназначенные для организации диалога пользователя с программой посредством этого окна. Здесь возможна двусторонняя передача информации – как программе, так и пользователю.

Окна могут быть также модальными и немодальными. При открытии окна в немодальном режиме, возможен переход на окно, его вызвавшее, и на другие. При вызове окна в модальном режиме невозможен переход на другие окна до тех пор, пока не закроется модальное окно.

Вызов модального окна осуществляется с помощью метода ShowModal:

Имя_формы.ShowModal;

Немодальное окно вызывается методом Show.

Метод Close закрывает окно (при этом возникает событие закрытия  окна OnClose), Hide – делает скрытым (для его отображения используется метод Show).

С каждой формой связан модуль (*.pas). Определив глобальные переменные, например, в главной форме, их можно сделать доступными в дочерних окнах с помощью пункта меню FileUse unit и указать модуль, содержащий описание глобальных переменных.

Обратиться к компоненте другой формы можно, указав сначала имя формы, затем имя компоненты и требуемое свойство. Например,

If Form2.Edit1.Text = '' {Если не введено значение} then

Begin

// Выдаем сообщение об ошибке

  ShowMessage('Пустое поле!');

// Устанавливаем курсор на Edit1 для ввода

  Form2.Edit1.SetFocus;

End;

6. Пример обработки исключительных ситуаций

Пусть на форме размещены: StringGrid1(5x5), Button1. Таблица должна хранить матрицу целых чисел. При нажатии на кнопку данные из таблицы должны сохраниться в массив, с которым впоследствии можно производить различные действия. При этом должна пройти проверка правильности введенных в ячейки значений. Если есть ошибка, то выдать сообщение и обнулить значение ячейки с ошибочными данными. Код модуля выглядеть следующим образом.

unit Unit1;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;

type

  EError = class(Exception)

  end;

 TForm1 = class(TForm)

   StringGrid1: TStringGrid;

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form1: TForm1;

 A: array[0..4,0..4] of integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

i,j:integer;

begin

//Заполняем матрицуA  введенными в StringGrid1 значениями

for i:=0 to StringGrid1.RowCount-1 do

 for j:=0 to StringGrid1.ColCount-1 do

 begin

  try //начало опасного блока

  A[i,j]:=StrToInt(StringGrid1.cells[i,j]);

  if abs(A[i,j])>1000 then

  //создаем собственное исключение

  raise EError.Create('Число должно быть в диапазоне [-1000,1000]!');

  except // обработка  исключительных ситуаций

   on E: EError do ShowMessage(E.Message);

    on EConvertError do begin

                  StringGrid1.Cells[i,j]:='0';

                  ShowMessage('Ошибка в записи числа!');

                      end;

   end;

 end;

end;

end.

Для исключения возможных ошибок ввода следует использовать компоненты MaskEdit – ввод с маской, SpinEdit, ComboBox, ListBox, RadioGroup, CheckBox, позволяющие выбрать возможные значения из фиксированного набора.

7. Пример реализации приложения

Пусть требуется хранить следующую информацию о лицах: Фамилия, Имя, Возраст. Запрос: подсчитать средний возраст всех лиц.

Создадим новый проект приложения. На главной форме (назовем ее Main – в свойстве Name) разместим компонент MainMenu с пунктами: «Файл» (Открыть, Сохранить, Сохранить как…, Выход), и «Поиск». Также разместим StringGrid и кнопки «Добавить», «Удалить», «Изменить».

Настроим компонент StringGrid. Свойство FixedRow = 1 (фиксированное число строк для заголовков), FixedCols = 0, ColCount = 4 (Количество столбцов - Фамилия, Имя, Пол, Возраст). В составном свойстве Options установим goEditing = False (запретим ручное редактирование в таблице), goRowSelect = True (разрешим выделение всей строки).

Кнопки «Изменить» и «Добавить» первоначально сделаем недоступными (свойство Enabled = False).

Главная форма на этапе проектирования приложения представлена на рис. 1.

Рис. 1. Главная форма на этапе проектирования

С событием OnShow для формы свяжем следующий код:

procedure TMain.FormShow(Sender: TObject);

begin

//Задаем заголовки столбцов

 StringGrid1.Cells[0,0]:='Фамилия';

 StringGrid1.Cells[1,0]:='Имя';

 StringGrid1.Cells[2,0]:='Пол';

 StringGrid1.Cells[3,0]:='Возраст';

 Kol:=0;

 Nomer:=1;

end;

После запуска приложения (F9) форма примет следующий вид (рис.2):

Рис. 2. Главная форма на этапе выполнения приложения

Опишем необходимые переменные в модуле главной форме (Unit1).

Type

Zap = Record   //описание записи

  Fam: String[20];

  Name: String[15];

  Pol: Char;

  Age: 18..60;

 End;

Var

 F: File of Zap; //описание типизированного файла

 Rec: Zap;

 Nomer: Integer; //номер редактируемой строки

 I: integer;

 Kol: integer; // количество записей

 S: integer; // сумма всех возрастов

 Sr: Real; //средний возраст

 add: boolean;//признак нажатия кнопки «Добавить»

Для доступа к конкретному элементу записи используется следующая конструкция:

Zap.Fam:=’Иванов’;

Или с оператором присоединения (With):

With Zap do

begin

  Fam:=’Сидоров’;

  Name:=’Сидор’;

  Pol:=’м’;

  Age:=20;

end;

При нажатии кнопок «Добавить» и «Изменить» должно открываться окно для добавления/редактирования записи (назовем его EditRecord). Свойство BorderStyle (рамка формы) желательно установить равным bsDialog.

Компоненты ввода связываются с конкретными полями записи. Разместим на форме Label, Edit, SpinEdit (страница Samples) RadioGroup, две кнопки.

Пример формы ввода/корректировки (рис. 3):

Рис. 3. Форма редактирования на этапе проектирования приложения

Для компонента SpinEdit, содержащего информацию о возрасте, установим максимальное (MaxValue=60) и минимальное значение (MinValue=18), Value = 18 (текущее значение), EditorEnabled = False (значение будет только выбираться).

Для компоненты RadioGroup зададим свойства Caption, Items («мужской» и «женский» – должны располагаться в разных строках), ItemIndex = 0 (включенный переключатель. Нумерация с нуля. Значение «-1» означает, что никакой переключатель не выбран). Можно также использовать компонент ComboBox.

Если в главной форме была нажата кнопка «Добавить», то все элементы ввода должны очиститься, если «Изменить» - заполниться значениями изменяемой записи.

Реакция на нажатие кнопки «Добавить»:

procedure TMain.Button1Click(Sender: TObject);

begin

Edit_Record.Caption:='Добавление записи';//Меняем заголовок

add:=true;

Edit_Record.ShowModal;//Вызываем форму Edit_Record

end;

Реакция на нажатие кнопки «Изменить»:

procedure TMain.Button2Click(Sender: TObject);

begin

Edit_Record.Caption:='Изменение записи';//Меняем заголовок

add:=false;

Edit_Record.ShowModal;//Вызываем форму Edit_Record

end;

При отображении формы Edit_Record сделаем необходимые действия (для события OnShow):

procedure TEdit_Record.FormShow(Sender: TObject);

begin

if add=true then //была нажата кнопка "Добавить"

begin

 //Очищаем поля ввода

 Edit_Record.Edit1.Text:='';

 Edit_Record.Edit2.Text:='';

 //Задаем значения по умолчанию

 Edit_Record.SpinEdit1.Value:=18;

 Edit_Record.RadioGroup1.ItemIndex:=0;

end else //нажали кнопку "Изменить"

begin

 //необходимо занести поля выделенной записи в элементы ввода

Edit1.Text:=Main.StringGrid1.Cells[0,Nomer];

Edit2.Text:=Main.StringGrid1.Cells[1,Nomer];

SpinEdit1.Value:=StrToInt(Main.StringGrid1.Cells[3,Nomer]);

//StrToInt - преобразует строковый аргумент в целое число

if Main.StringGrid1.Cells[2,Nomer]='м' then

 RadioGroup1.ItemIndex:=0 else RadioGroup1.ItemIndex:=1;

end;

end;

Реакция на нажатие кнопки «ОК» на форме редактирования Edit_Record:

procedure TEdit_Record.Button1Click(Sender: TObject);

var d:integer;

begin

//добавляем в таблицу строку, если была нажата кнопка "Добавить"

if add then

begin

   Kol:=Kol+1;

   Main.StringGrid1.RowCount:= Kol+1;

 d:=Kol;

 if kol>0 then begin

  //Делаем доступными кнопки "Изменить" и "Удалить"

                 Main.Button2.Enabled:=True;

                 Main.Button3.Enabled:=True;

               end;

end else d:=Nomer;

//Заносим введенные значения в таблицу

Main.StringGrid1.Cells[0,d]:=Edit1.Text;

Main.StringGrid1.Cells[1,d]:=Edit2.Text;

Main.StringGrid1.Cells[3,d]:=IntToStr(SpinEdit1.Value);

//IntToStr - преобразует целое значение в строковое

if RadioGroup1.ItemIndex=0 then Main.StringGrid1.Cells[2,d]:='м'

      else Main.StringGrid1.Cells[2,Kol]:='ж';

Close;//Закрываем форму редактирования

end;

Реакция на нажатие кнопки «Отмена» на форме редактирования Edit_Record:

procedure TEdit_Record.Button2Click(Sender: TObject);

begin

 Close;//закрываем форму

end;

В событии OnSelectCell для StringGrid, которое возникает при выборе строки таблицы, сохранить номер строки:

procedure TMain.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;

 var CanSelect: Boolean);

begin

Nomer:=Arow; {сохраняем номер выделенной строки}

end;

Реакция на нажатие кнопки «Удалить»:

procedure TMain.Button3Click(Sender: TObject);

begin

if Kol<>0 then

BEGIN

for  i:=Nomer to StringGrid1.RowCount-1 do

with StringGrid1 do begin

//сдвигаем строки

 cells[0,i]:= cells[0,i+1];

 cells[1,i]:= cells[1,i+1];

 cells[2,i]:= cells[2,i+1];

 cells[3,i]:= cells[3,i+1];

end;

 Kol:=Kol-1;

 if Kol<>0 then StringGrid1.RowCount:= Kol+1 else

  begin

   //Делаем недоступными кнопки "Изменить" и "Удалить"

   Button2.Enabled:=False;

   Button3.Enabled:=False;

  end;

 end;

end;

Теперь опишем сохранение и открытие файла записей. Для отображения стандартных диалоговых окон сохранения/открытия будем использовать компоненты SaveDialog и OpenDialog со страницы Dialogs, которые разместим на главной форме. В свойство Filter установим «Файл данных|*.dat». Умалчиваемое расширение файлов (DefaultExt) – «dat». В свойстве InitialDir можно задать начальный диск/каталог для открытия/сохранения файла.

Данные компоненты являются невизуальными (т.е. не отображаются при запуске приложения).

Для работы с файлами используются следующие стандартные подпрограммы:

AssignFile(F, FileName) – связывает файл FileName с файловой переменной F.

Reset(F) – открывает файл F для чтения.

RewriteFile(F) – создает новый файл F. Если создаваемый файл уже имеется, перезаписывает его.

Read(F, V1, V2, …) – чтение данных из файла F в переменные.

Write(F, V1, V2, ...) – запись значений переменных в файл F.

Seek(F, N:LongInt) – передвигает указатель файла на N-ю компоненту (N-целое выражение). Первая компонента имеет номер 0. Для того, чтобы расширить файл, следует передвинуть указатель в конец файла функцией Seek.

Seek (F, FileSize(F)) – возвращает число записей в файле F, то есть указывает номер следующей компоненты после последней.

CloseFile(F) – закрывает файл F.

DeleteFile(F) – удаляет файл F.

RenameFile(OldName, NewName) – переименовывает файл OldName на NewName.

Реакция на выбор пункта меню «Открыть»:

procedure TMain.N3Click(Sender: TObject);

var i:integer;

begin

 if Opendialog1.Execute //если диалог выполнился

   and FileExists(OpenDialog1.FileName) then //выбранный файл существует

 begin

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

   AssignFile(f,OpenDialog1.FileName);

   Reset(f); //открываем файл

   i:=0; //номер строки

   while not eof(f) do begin //пока не конец файла

     read(f,Rec); //читаем очередную запись

     inc(i);

     stringgrid1.cells[0,i]:=Rec.Fam;

     stringgrid1.cells[1,i]:=Rec.Name;

     stringgrid1.cells[2,i]:=Rec.Pol;

     stringgrid1.cells[3,i]:=IntToStr(Rec.Age);

     stringgrid1.RowCount:=i+1; //Увеличиваем количество строк

   end;

   kol:=i; //сохраняем прочитанное количество строк

   closefile(f);//закрываем файл

 end else ShowMessage('Файл не существует!')

end;

Реакция на выбор пункта меню «Сохранить»:

procedure TMain.N5Click(Sender: TObject);

var i:integer;

begin

     if SaveDialog1.Execute then //если диалог выполнился

     begin

       assignfile(f,savedialog1.FileName);//связь файла с переменной

       if FileExists(SaveDialog1.FileName) then

        begin

         if MessageDlg('Файл с таким именем уже существует. Перезаписать?', mtConfirmation,[mbYes,mbNo],0)=mrNo then exit; //Выход

        end;

         rewrite(f,savedialog1.FileName); //создание файла

         i:=0;

         while i<>StringGrid1.rowCount-1 do begin //пока I <>кол-ву строк

           inc(i);//увеличиваем счетчик прочитанных строк

           Rec.Fam:=stringgrid1.cells[0,i];

           Rec.Name:=stringgrid1.cells[1,i];

           Rec.Pol:=stringgrid1.cells[2,i][1];

           Rec.Age:=StrToInt(stringgrid1.cells[3,i]);

           write(f,Rec); //сохраняем строку в файл

         end;

       closefile(f); //закрываем строку

     end;

end;

Для реализации запроса последовательно просмотрим все строки записей в таблице, суммируя возраст и подсчитывая количество строк. После деления суммы на количество получим средний возраст. Результат можно выдать в сообщении при помощи функции ShowMessage.

procedure TMain.N8Click(Sender: TObject);

begin

S:=0;

i:=0;

if Kol<>0 then

while i<>StringGrid1.RowCount-1 do

begin //пока I <>количеству строк

 inc(i);//увеличиваем счетчик прочитанных строк

 S:=S+StrToInt(stringgrid1.cells[3,i]);//суммируем возраст

end;

Sr:=S/I;

ShowMessage('Средний возраст='+FloatToStrF(Sr,ffGeneral,10,3));

end;

Если запрос должен возвращать несколько строк результата, то их можно отобразить на отдельной форме в StringGrid или заносить в ListBox/Memo (методы Clear – очищает список, Lines.Add (строка) – добавляет новую строку)

Рис. 4. отображает пример работающего приложения.

Рис. 4. Окно работающего приложения

На рис. 5 представлен результат запроса.

Рис. 5. Выдача сообщения с результатом запроса


 

А также другие работы, которые могут Вас заинтересовать

29697. Психология как мультипарадигмальная наука 31.5 KB
  в этой дисциплине существует несколько парадигм естественнонаучный и гуманитарный соответствующих основным психологическим теориям таким как бихевиоризм когнитивизм и психоанализ и соответственно психология мультипарадигмальная наука. В настоящий момент в психологии различают два принципиально различных подхода: естественнонаучный и гуманитарный поскольку такие теории как бихевиоризм когнитивизм психоанализ и прочие суть именно теории пусть и глобальные а с парадигмой у них очень мало общего Естественнонаучный подход...
29700. Структурализм 27.5 KB
  Ее представители называли себя структуралистами так как считали главной задачей психологии экспериментальное исследование структуры сознания. Понятие структуры предполагает элементы и их связь поэтому усилия школы были направлены на поиск исходных ингредиентов психики отождествленной с сознанием и способов их структурирования.