Введение Данная курсовая предназначалась для создания программы, которая обеспечивает ввод информации и отображение ее на экран, вывод в типизированный файл и загрузку из него. Информация должна храниться в структуре, представляющей собой двунаправленный список записей с вариантной частью, в зависимости от типа объекта. Необходимо было составить банк данных кинологов, включающий в себя фамилию и имя владельца собаки, кличку собаки, породу собаки, день и год рождения собаки, а также в зависимости от породы наличие соответствующей дополнительной информации по своему усмотрению, на основе которой придумать три критерия для отбора записей Вывод информации осуществляется по следующим критериям: по владельцу, по кличке, по породе, по дате рождения собаки. программа информация файл кинолог Глава 1. Руководство пользователю Рис.1.1 "Интерфейс программы" Данное приложение включает в себя одну форму. На рис.1.1 представлен начальный интерфейс приложения сразу после открытия. Рис.1.2 "Действия с файлом" Рис.1.3 "Действия с файлом" 1.1 Операции с файлом Нажав на кнопку File в левом верхнем углу программы позволяет открыть уже имеющийся ранее банк данных, который загрузится в программу для дальнейших действий с ним "Open…" , можно сохранить преобразованный файл, причем можно выбрать, в какую папку и с каким названием этот документ сохранится "Save As…", закрыть программу "Exit"; (Рис.1.2 "Действия с файлом"). .2 Операции со списком Нажав на кнопку Edit в левом верхнем углу программы позволяет внести в список нового человека с описанием его собаки "Add", изменить данные "Change", и удалить текущую запись из базы данных "Delete". (Рис.1.3 "Действия с файлом"). Так же существуют кнопки быстрого пользования программой, такие как: "ButtonLoad" "ButtonSaveAs" позволяющая позволяющая осуществить быструю осуществить быстрое загрузку файла, сохранение файла, "ButtonAdd" или нажав кнопку "Insert" позволяющую осуществить быстрое добавление нового клиента , "ButtonEdit" позволяющая осуществить быстрое редактирование данных и "ButtonDel" позволяющая быстро удалить данные, так же можно удалить данные нажав на кнопку "Delete". (Рис.1.4. "Действия с файлом") Рис.1.4 "Действия с файлом" Для начала заполнения банка данных необходимо нажать кнопку "Edit", в которой выбрать функцию "Add", или можно нажать на клавишу быстрого пользования "ButtonAdd" или "Insert" которые позволят внести нового человека с описанием его собаки. (Рис.1.5. "Действия со списком"). Рис.1.5 "Действия со списком" После заполнения фамилии и имени владельца собаки, клички собаки и породы, можно выбрать день, месяц и год рождения собаки. (Рис.1.6. "Действия со списком" и Рис.1.7. "Действия со списком"). Рис.1.6 "Действия со списком" Рис.1.7 "Действия со списком" При заполнении списка данных можно переключаться на следующую строчку ввода данных с помощью клавиши "Tab"; Также программу можно разворачивать и сворачивать для удобства пользователя, программа обладает прокруткой по вертикали и горизонтали. (Рис.1.8 "Действия со списком" и Рис.1.9. "Действия со списком"). Рис.1.8 "Действия со списком" Рис.1.9 "Действия со списком" После заполнения данных, можно сохранить эти данные нажав на кнопку "ОК" или же отменить ввод данных и выйти в основное меню программы нажав кнопку "Cancel" (Рис.1.10 "Действия со списком") Рис.1.10 "Действия со списком" 1.3 Вывод по критериям Для определенного поиска владельца и его собаки существует вывод по критериям, который позволяет быстро найти записи по заданным параметрам. Кликнув в "окошко" "Фамилия" можно осуществить поиск владельца собаки по его фамилии, даже набрав первую букву его фамилии поиск станет значительно проще, потому что программа выдаст фамилии начинающиеся именно с этой буквы. То же самое можно проделать c "окошками" "Кличка" собаки и "Порода" собаки. (Рис.1.11 "Вывод по критериям" и Рис.1.12 "Вывод по критериям") Рис.1.11 "Вывод по критериям" Рис.1.12 "Вывод по критериям" Глава 2. Руководство программисту 2.1 Описание структуры данных Записи объединяют фиксированное число элементов данных. Используются поля, отдельные элементы записи, имеющие имена. Каждое имя поля должно быть уникально. Чтобы объединить данные разных типов, используется вариативная запись. Она имеет конечное число полей, однако предоставляет возможность по-разному использовать области памяти, занимаемые полями. Все варианты записи располагаются в одном месте памяти и позволяют обращаться к ним по различным именам. Каждый вариант обозначается минимум одной константой. Все константы должны быть порядковыми и совместимыми по типу с меткой поля. Для обращения к конкретному полю необходимо указывать имя записи и имя поля, разделенные точкой, т. е. имя поля является составным. С полем можно выполнять все операции, которые допускаются для отдельной переменной этого же типа. Структура данных:= ^TKino;// описание типизированного указателя= record // объявление переменной типа record, previous: ptr; // указатели на предыдущую и следующую записи_fio, s_age, s_address, s_doctor: string[50]; // объявление записей, не зависящие от вариативной записиch: char of // вариантная часть 'y': (s_group, s_ill: string[30]; s_srok: TDate); // объявление записей, если есть инвалидность 'n': (s_comp: string[30]; s_reg, s_dog: TDate); // объявление записей, если нет инвалидности var: integer; // определение типа указателя: file of elem; // определение типа файла, pcur, result, p: Ptr; // объявление указателей на начало файла, текущую запись, последнюю запись, запись: TForm1; В программе используются связные списки - структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки ("связки") на следующий и/или предыдущий узел списка. В данной программе мы используем двунаправленный список, непременным условием которого является наличие взаимных ссылок двух соседних элементов друг на друга, поэтому в запись мы добавляем 2 дополнительных поля. В таком списке каждый элемент (кроме первого и последнего) связан с предыдущим и следующим за ним элементами. Каждый элемент двунаправленного списка имеет два поля с указателями: одно поле содержит ссылку на следующий элемент, другое поле - ссылку на предыдущий элемент и третье поле - информационное. Наличие ссылок на следующее звено и на предыдущее позволяет двигаться по списку от каждого звена в любом направлении: от звена к концу списка или от звена к началу списка, поэтому такой список называют двунаправленным. 2.2 Описание интерфейса приложения Для обозначения полей используется Label_fio: TLabel; // ФИО пациента_age: TLabel; // возраст пациента_address: TLabel; // адрес пациента_doctor: TLabel; //ФИО лечащего доктора_group: TLabel; // группа инвалидности_ill: TLabel; // заболевание_srok: TLabel; // срок инвалидности (в формате даты)_comp: TLabel; // страховая компания_reg: TLabel; // дата регистрации в страховой компании (в формате даты)_dog: TLabel; // дата окончания договора со страховой компанией (в формате даты) • Для ввода необходимых данных предусмотрены поля ввода • Для заполнения списка:_fio: TEdit; // ФИО пациента_age: TEdit; // возраст пациента_address: TEdit; // адрес пациента_doctor: TEdit; // ФИО лечащего доктора_group: TEdit; // группа инвалидности_ill: TEdit; // заболевание_srok: TEdit; // срок инвалидности (в формате даты)_comp: TEdit; // страховая компания_reg: TEdit; // дата регистрации в страховой компании (в формате даты)_dog: TEdit; // дата окончания договора со страховой компанией (в формате даты) • Для отбора по критериям:_kr_doc: TEdit; // ввод искомого доктора_kr_group: TEdit; // ввод искомой группы инвалидности_kr_ill: TEdit; // ввод искомого заболевания_kr_comp: TEdit; // ввод искомой страховой компании • Операции выполняются с помощью кнопок Button: • Для заполнения списка и работы с файлом: TButton; // Новый файл: TButton; // Сохранить: TButton; // Открыть файл_s: TButton; // Добавить btnInsert_s: TButton; //Вставить_s: TButton; //Удалить_s: TButton; //Просмотр_s: TSpeedButton; //Первый элемент списка_s: TSpeedButton; // Предыдущий элемент списка btnNext_s: TSpeedButton; // Следующий элемент списка_s: TSpeedButton; // Последний элемент списка_clear: TButton; // Очистить поля ввода • Для отбора по критериям:_kr_doc: TButton; // отбор по доктору_kr_group: TButton; // отбор по группе инвалидности_kr_ill: TButton; // отбор по заболеванию_kr_comp: TButton; // отбор по страховой компании_kr_dog: TButton; // отбор по сроку договора_kr_srok: TButton; // отбор по сроку инвалидности • Для вывода данных используется ListBox: ListBox • Для выбора нужного документа для сохранения или загрузки используются инструменты OpenDialog и SaveDialog: SaveDialog1: TSaveDialog; //Для сохранения: TOpenDialog; //Для загрузки .3 Описание процедур procedure ButtonAddClick - процедура для добавления записейCIRec процедура очистки полей ввода;Showw - процедура, которая помогает показать текущий элемент списка;SWrec - процедура, сохраняющая изменения в списке после добавления новых записей;TForm1.rg1Click - процедура вариантной части, которая отмечает, какие поля ввода должны быть включены для определенного варианта;TForm1.btnAdd_sClick - процедура добавления в список новой записи в конец списка;TForm1.btnInsert_sClick - процедура вставки в список новой записи после текущей записи;TForm1.btnDelete_sClick процедура удаления текущей записи из списка;TForm1.btnBrowse_sClick процедура вывода на ListBox текущей базы данных;TForm1.btnFirst_sClick процедура для перехода к первому элементу списка;TForm1.btnLast_sClick процедура для перехода к последнему элементу списка;TForm1.btnPrevious_sClick - процедура для перехода к предыдущему элементу списка;TForm1.btnNext_sClick - процедура для перехода к следующему элементу списка;TForm1.btnNewClick - процедура создания нового файла для записи;TForm1.btn2Click - процедура сохранения файла;TForm1.btn3Click - процедура открытия файла;TForm1.btn_kr_docClick процедура для отбора и вывода на экран пациентов с одинаковым доктором;TForm1.btn_kr_groupClick - процедура для отбора и вывода на экран пациентов с одинаковой группой инвалидности;TForm1.btn_kr_illClick процедура для отбора и вывода на экран пациентов с одинаковым заболеванием;TForm1.btn_kr_compClick - процедура для отбора и вывода на экран пациентов с одинаковой страховой компанией;TForm1.btn_kr_dogClick - процедура для отбора и вывода на экран пациентов с истекшим сроком регистрации в страховой компании;TForm1.btn_kr_srokClick - процедура для отбора и вывода на экран пациентов с истекшим инвалидности;TForm1.btn_clearClick - процедура очистки ввода полей. сроком Глава 3. Демонстрация работы приложения 3.1 Демонстрация ввода записей в базу данных Рис.3.1 "Добавление записей в базу данных" Рис.3.2 "Добавление записей в базу данных " В поля вводятся необходимые данные (см. рис.3.2), далее через кнопку "OK" данные добавляются в базу данных (см. рис.3.2). 3.2 Демонстрация удаления записи из базы данных Рис.3.3 "Удаление записи из списка" Рис.3.4. "Удаление текущей записи" Выберите запись, которую хотите удалить, затем нажмите кнопку "ButtonDel" или нажав клавишу "Delete" . (Рис 3.4. "Удаление текущей записи"). 3.3 Демонстрация перехода к первому элементу списка Рис.3.5. "Переход к первому элементу списка" .4 Демонстрация перехода к последнему элементу списка Рис.3.6. "Переход к последнему элементу списка" 3.5 Демонстрация перехода по списку данных Рис.3.7. "Переход по списку данных" Рис.3.8. "Переход по списку данных" Находясь на любом элементе списка, можно перемещаться по данным с помощью стрелочек на клавиатуре, чтобы посмотреть нужные данные достаточно нажать на клавишу "пробел". 3.6 Демонстрация редактирования данных Рис.3.9. "Редактирование данных" Выбираем данные, которые нужно редактировать, нажимаем на кнопку "ButtonEdit", после этого можно будет исправить эти данные. Редактированные данные сохраняются после нажатия на клавишу "OK". .7 Демонстрация сохранения файла Рис.3.10. "Сохранение" Рис.3.11. "Сохранение" Сохранить базу данных можно двумя способами: 1)Нажать на кнопку "File" и выбрать функцию "SaveAs…" 2)Нажать на клавишу быстрого пользования "ButtonSaveAs" После чего пишем название нашей базы данных и нажимаем кнопку "Сохранить". .8 Демонстрация открытия файла Рис.3.12. "Открытие" Рис.3.13. "Открытие" Выберите файл, который необходимо открыть, и нажмите кнопку "Открыть". Рис.3.14. "Открытие" 3.9 Демонстрация отбора по критерию "Фамилия" Рис.3.15. "Отбор по критерию "Фамилия" Кликнув в "окошко" "Фамилия" можно осуществить поиск владельца собаки по его фамилии, даже набрав первую букву фамилии поиск станет значительно проще, потому что программа выдаст фамилии начинающиеся именно с этой буквы. 3.10 Демонстрация отбора по критерию "Кличка" Рис.3.16. "Отбор по критерию "Кличка" Кликнув в "окошко" "Кличка" можно осуществить поиск собаки по кличке, даже набрав первую букву клички поиск станет значительно проще, потому что программа выдаст все клички собак начинающихся именно с этой буквы. 3.11 Демонстрация отбора по критерию "Порода" Рис.3.17. "Отбор по критерию "Порода" Кликнув в "окошко" "Порода" можно осуществить поиск собаки по породе, даже набрав первую букву породы поиск станет значительно проще, потому что программа выдаст все породы собак начинающихся именно с этой буквы. Заключение Главной целью, преследуемой при выполнении данной работы, было научиться составлять программу, которая обеспечивает бесперебойную работу приложения по базе данных кинологов. Одним из главных критериев было хранение информации в структуре, представляющей собой двунаправленный список. Ввод информации осуществляется машинным способом, после того как база данных полностью введена, её можно загрузить в типизированный файл либо новый, либо ранее имеющийся - и далее, если требуются какие-то либо изменения или считывания с данной базы, этот файл можно снова загружать в приложение и работать с уже сохраненной базой данной. Для облегчения работы с базой данных также были созданы отдельные поиски по критериям: определенные запросы, которые трудно искать вручную. Для того чтобы посмотреть всех собак определённой породы, имеется поиск по породе. То же самое осуществляется при помощи поисков по фамилии и по кличке. В целом, данное приложение способно значительно облегчить работу с данными. Все поставленные цели достигнуты, задачи выполнены: приложение работает четко и без сбоев, полностью готово к использованию. Список используемой литературы • Архангельский А.Я. Программирование в Delphi: учебник по классическим версиям Delphi. - M. БИНОМ, 2008. • Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. - 2-е изд. - М.: Бином, 1998. • Епанешнипков А.М., Епанешников В.А. DELPHI. Базы данных. - СПб.: Диалог - МИФИ, 2000. • Карпов Б. Delphi: специальный справочник. - СПБ.: Питер, 2002. • Фаронов В.В. Delphi. Программирование на языке высокого уровня: учебник для вузов. - СПб.: Питер, 2003. • Федотова С.В. Создание Windows-приложений в среде Delphi. - М.: СОЛОН - Пресс, 2004. • Хомоненко А., Гофман В., Мещеряков Е. DELPHI 7 . - СПб.: БХВ-Петербург, 2010. • Фленов М. Библия Delphi. - СПб.: БХВ-Петербург, 2002. • Вирт Н. Алгоритмы и структуры данных / Пер. с англ. - М.: Мир, 1989. • Практическое руководство по программированию / Пер. с англ. Б. Мик, П. Хит, Н. Рашби и др.; под ред. Б. Мика, П. Хит, Н. Рашби. - М.: Радио и связь, 1986. Приложение Исходный код программы unit Unit1;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ComCtrls, ExtCtrls, CheckLst, Menus, ToolWin;= class(TForm): TButton;: TButton;: TSaveDialog;: TButton;: TOpenDialog;: TButton;: TStatusBar;: TButton;: TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TListView;: TToolBar;: TPanel;: TLabeledEdit;: TLabeledEdit;: TObject);FormCreate(Sender: TObject);ButtonLoadClick(Sender: TObject);ButtonDelClick(Sender: TLabeledEdit;ButtonAddClick(Sender: TObject);ButtonSaveAsClick(Sender: TObject);ButtonEditClick(Sender: TObject);Exit1Click(Sender: TObject);ListView1DblClick(Sender: TObject);ListView1KeyUp(Sender: TObject; var Key: Word;: TShiftState);ESurnChange(Sender: TObject); { Private declarations } { Public declarations };= ^TKino;= record: PKino;: PKino;: string[100]; //фамилия владельца: string[100]; //имя владельца: string[100]; //кличка собаки: string[100]; //порода собаки birth: TDateTime; //дата рождения собаки;: TForm1;: TKino;UKino; {$R *.dfm}FindLast: PKino;:= @head;Result.next <> nil do Result := Result.next;;ClearList;kino: PKino;:= FindLast;kino <> nil do begin(kino.next);:= kino.prev;;;CheckStr(SubStr,S: String): boolean;SubStr = '' then Result := trueResult := Pos(AnsiUpperCase(SubStr), AnsiUpperCase(S)) > 0;;CheckFilter(kino: PKino): boolean;:= CheckStr(Form1.ESurn.Text, kino.surname)CheckStr(Form1.ENick.Text, kino.nick)CheckStr(Form1.EBreed.Text, kino.breed);;PrintList;: PKino;: TListItem;.ListView1.Clear;:= head.next;kino <> nil do beginCheckFilter(kino) then begin:= Form1.ListView1.Items.Add;.Data := kino;.Caption := kino.surname;.SubItems.Add(kino.name);.SubItems.Add(kino.nick);.SubItems.Add(k ino.breed);.SubItems.Add(DateToStr(kino.birth));;:= kino.next;;;TForm1.ButtonAddClick(Sender: TObject);kino,last: PKino;.DefaultVal;FKino.ShowModal <> mrOk then Exit;(kino);:= FindLast;.next := kino;.prev := last;.next := nil;.FormToRec(kino);;;TForm1.FormCreate(Sender: TObject);;;TForm1.ButtonSaveAsClick(Sender: TObject);: PKino;: file of TKino;not SaveDialog1.Execute then Exit;(f,SaveDialog1.FileName);(f);:= head.next;kino <> nil do begin(f,kino^);:= kino.next;;(f);;TForm1.ButtonLoadClick(Sender: TObject);: PKino;: file of TKino;not Exit;(f,OpenDialog1.FileName);(f);;:= OpenDialog1.Execute @head;not begin(kino.next);(f,kino.next^);.next.prev := Eof(f) kino;.next.next kino.next;;(f);;;TForm1.ButtonEditClick(Sender: PKino;ListView1.ItemIndex < := then do nil;:= TObject);kino: 0 then ListView1.Selected.Data;.RecToForm(kino);FKino.ShowModal <> Exit;.FormToRec(kino);;;TForm1.ButtonDelClick(Sender: Exit;:= mrOk then TObject);kino: PKino;ListView1.ItemIndex < 0 then Exit;:= ListView1.Selected.Data;.prev.next := kino.next;kino.next <> nil then kino.next.prev := kino.prev;(kino);;;TForm1.Exit1Click(Sender: TObject);;;TForm1.ListView1DblClick(Sender: TObject);.Click;;TForm1.ListView1KeyUp(Sender: TObject; var Key: Word;: TShiftState);Key = VK_INSERT then ButtonAdd.Click;Key = VK_SPACE then ButtonEdit.Click;Key = VK_F2 then ButtonEdit.Click;Key = VK_DELETE then ButtonDel.Click;;TForm1.ESurnChange(Sender: TObject); begin;; end.