Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Программа тестирования - файл 1.doc


Программа тестирования
скачать (568.5 kb.)

Доступные файлы (1):

1.doc569kb.14.12.2011 10:29скачать

содержание
Загрузка...

1.doc

Реклама MarketGid:
Загрузка...
Министерство образования, науки и молодёжной политики

Забайкальского края

ГОУ СПО «Могойтуйский агротехнологический колледж»

КУРСОВАЯ РАБОТА


по дисциплине

«Технология разработки программных продуктов»

на тему: «Программа тестирования»

Пояснительная записка


Студентка группы «ПО ВТ и АС» - IV: Батогалсанова С.
Преподаватель: Цыренова М. Ц.

Могойтуй, 2009

Задание

Содержание

Введение………………………………………………………………………………..

1 Техническое задание………………………………………………………………...

    1. Название и назначение разрабатываемой программы……………………….

    2. Основание для разработки……………………………………………………..

    3. Технические требования к программе………………………………………...

    4. Функциональные требования к программе....………………………………...

    5. Требования по надежности…………………………………………………….

    6. Разрабатываемая документация……………………………………………….

    7. Этапы и сроки выполнения программы………………………………………

  1. Анализ технического задания…...…………………………………………………

  2. Разработка и описание программы………………………………………………..

  3. Руководство пользователя…………………………………………………………

  4. Текст программы……………………………………………………………………

    1. Модуль Unit1……………………………………………………………………

    2. Модуль Unit2……………………………………………………………………

    3. Модуль Unit3……………………………………………………………………

    4. Модуль Unit4……………………………………………………………………

    5. Модуль MyUnit…………………………………………………………………

Заключение……………………………………………………………………………..

Список использованных источников………………………………………………..

4

5

5

5

5

5

6

6

6

7

8

12

18

18

28

33

35

35

46

47



Введение

В данной курсовой работе разрабатывается прикладная программа «Программа тестирования», реализующая функции электронного тестирования. Программа позволяет пользователю выполнять тесты в электронной форме с немедленной выдачей результатов и оценки.

1 Техническое задание
Разработала студентка гр. ПО ВТ и АС Батогалсанова С.

Утвердила Цыренова М. Ц.


    1. Название и назначение разрабатываемой программы

Представленная программа называется «Ежедневник». Эта программа относится к числу программ, расширяющих возможности компьютера. Программа предназначена для планирования распорядка дня пользователя и выполняет функции планировщика задач с будильником.


    1. Основание для разработки

Основанием для разработки является задание на курсовую работу по дисциплине «Технология разработки программных продуктов» на тему «Программа тестирования».


    1. Технические требования к программе

Для работы программы необходимы:

- процессор Pentium100 или выше;

- операционная система Windows 9x или выше;

- манипулятор мышь;

- 2 Мб внешней памяти;


    1. Функциональные требования к программе

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

- ежедневник открывается на текущей дате;

- просмотр записей без ограничений по дате;

- установление будильника на определенное время

- добавление и изменение заметок о распорядке дня;

- информация о свободном времени на следующую неделю;

- телефонный справочник;

- сохранение информации о всех внесенных записях во внешнем файле;

- программа должна обладать понятным интерфейсом и относительной простотой работы с ней;

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


    1. Требования по надежности

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


    1. Разрабатываемая документация

К программе должна быть приложена пояснительная записка. Пояснительная записка должна быть выполнена в соответствии со стандартами предприятия СТП 1.01-1.03-2002


    1. Этапы и сроки выполнения программы

- разработка технического задания – 1 нед.

- разработка и описание программы – 3 нед.

- разработка руководства пользователя – 1 нед.

- оформление пояснительной записки и сдача преподавателю на проверку – 1 нед.

- защита курсовой работы

  1. Анализ технического задания

Необходимо написать программу в среде, реализующую функцию Ежедневник. Данная программа должна полностью соответствовать требованиям технического задания. Необходимо, чтобы при запуске программы Ежедневник открывал страницу с текущей датой и информацией о свободном времени на следующую неделю. Кроме того, необходимо реализовать функцию выбора произвольной даты с формированием списка дел на выбранную дату. Кроме планировщика заданий в программе реализован справочник телефонных номеров. При разработке программы следует учесть, что информация о внесенных событиях и контактах должны храниться в файле.

Для написания программы целесообразно использовать среду DELPHI. Использование среды DELPHI позволяет написать программу с удобным интерфейсом. Кроме того программы, написанные на DELPHI, хорошо сочетаются с широко распространенными на сегодняшний день операционными системами WINDOWS. Использование WINDOWS накладывает ограничение на переход по дате (год должен находиться в интервале 1980 - 2099). Поскольку используется среда DELPHI, для удобной работы с программой необходим манипулятор "мышь". Для слаженной работы программы (реализации вставки рисунков), необходимо наличие свободных 2 Мб внешней памяти.

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

3 Разработка и описание программу

В программе используется пять модулей:

- модуль описания классов;

- модуль основной части программы;

- модуль редактор дат;

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

- модуль для календаря.

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

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

Модуль основной части программы использует в своей работе все остальное модули программы и процедуры, реализующие все этапы работы программы и взаимодействия с пользователем.

Рассмотрим программную реализацию этого модуля. Данный модуль включает в себя следующие процедуры:

FormCreate

FormClose

PlanDay

DateTimePicker1Change

AddPhoneClick

SaveDBClick

DelRecClick

PhoneDbButtonClick

AlarmButtonClick

GetAlarm

ControlWindow

IconMouse

Ic

PlanNextWeek
Процедура FormCreate производит открытие файла или при его отсутствии создание файла, а также инициализацию ежедневника на текущую дату, загрузка из файла список задач и инициализация заголовков таблицы телефонного справочника.

Процедура FormClose производит закрытие ежедневника и освобождение памяти.

Процедура DateTimePicker1Change производит поиск даты в файле. Если дата найдена формируется список задач на найденную дату.

Процедура AddPhoneClick производит добавление строки ввода в телефонном справочнике.

Процедура SaveDBClick производит сохранение всего телефонного справочника, при его редактировании или добавлении контакта, в файл.

Процедура DelRecClick вызывает диалоговое окно для удаления необходимого контакта.

Процедура PhoneDbButtonClick позволяет загрузить в телефонный справочник все контакты, которые хранятся в файле.

Процедура AlarmButtonClick производит включение или отключение будильника.

Процедура GetAlarm считывает время включения будильника и сообщение о том что время истекло.

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

Процедура IconMouse производит реакцию нажатия клавиш мышки на значке.

Процедура Ic производит операции со значком в системном трее. В зависимости от того какой параметр передается в процедуру изменяется операции со значком: 1 – добавить, 2 – удалить, 3 – заменить.

Процедура PlanNextWeek производит вычисление начала следующей недели, а также вычисляет количество свободного времени на следующую неделю

Рассмотрим основные этапы работы программы. После запуска программы происходит инициализация ежедневника сегодняшним числом, открытие или при отсутствии файла, его создание, создания заголовков таблицы телефонного справочники и таблицы на форме редактор дней, а также количество свободного времени за текущий день и за следующую неделю. Программа имеет 4 основных блока: работа с телефонным справочником, работа с редактором дней, работа с будильником. Блок-схема разрабатываемой программы представлена на рисунке 3.1



Рисунок 3.1 – Блок-схема работы программы (начало)



Рисунок 3.1 – Блок-схема работы программы (продолжение)

  1. Руководство пользователя

Программа «Ежедневник» позволяет составлять план дня с интервалом в 30 минут, при этом в программу встроен будильник который поможет вам не забыть о каком-нибудь важном событии, при истечении времени на экран выводиться сообщение, а на акустическую систему компьютера выводиться звуковой сигнал. В программу также встроен телефонный справочник и календарь.

Рассмотрим возможности программы. После запуска программы в разделе «Сегодня» мы видим сегодняшнюю дату (рисунок 4.1). C помощью этого раздела можно просматривать запланированные задачи на другие даты, если нажать на него, то появиться мини-календарь (рисунок 4.2), где собственно и производиться выбор необходимой даты. Выбираемый год должен входить в интервал 1980 – 2099 гг.



Рисунок 4.1 – Главное окно программы.

После выбора даты, в разделе «Запланировано» появятся все ваши запланированные задачи. Для примера выберем 10 апреля и посмотрим, что у нас там запланировано (рисунок 4.2). Мы видим, что на 10 апреля у нас назначено 3 важных задачи. Если теперь щелкнуть по одной из них мышью, то мы увидим что время и сообщение автоматически переносятся в раздел «Будильник». Будильник нам поможет не забыть о наших задачах, что бы его включить необходимо нажать на клавишу «Вкл.», после чего она примет утопленное состояние и надпись на ней измениться на «Выкл.» (рисунок 4.3).



Рисунок 4.2 – Реализация перехода по дате

Для того что бы выключить будильник вам необходимо повторно нажать на ту же самую клавишу, при этом она вернется в обратное состояние.



Рисунок 4.3 – Реализация автоматического переноса данных в раздел «Будильник»

Допустим, что у нас истекло время, при этом зазвучит звуковой сигнал, в виде сирены и на экране появиться сообщение с указанием на время и сообщение. Это окно приведено на рисунке 4.4.

Кроме запланированных задач на 10 апреля программа нам сообщает сколько у вас осталось свободного времени в разделе «Количество свободного времени» (рисунок 4.3). В этом разделе две записи первая указывает количество свободного времени на выбранный день, а вторая – на следующую неделю. Для того что бы не возникло путаницы в количестве свободного времени записи выделены разным цветом. Количество свободного времени на следующую неделю вычисляется только при запуске программы, и не меняется при смене даты в разделе «Сегодня»



Рисунок 4.4 – Диалоговое окно сообщающее, что время истекло

Для редактирования дат в программе предусмотрена дополнительная форма, в этой форме вы можете добавлять, удалять и редактировать ваши даты. Рассмотрим

ее (рисунок 4.5).


Рисунок 4.5 – Окно «Редактор дня»
Слева в окне «Редактор дня» находится таблица с помощью, которой вы можете ввести данные на определенное время. Справа находятся: кнопки управления датами, список дат, на которые у вас запланированы задачи и раздел «Дата», где указывается интересующая вас дата. Для того что бы быстро перейти к интересуемой вами дате достаточно выбрать дату в списке дат, при этом дата автоматически переноситься в раздел «Дата»

Для того чтобы добавить дату в список дат необходимо:

  1. Выбрать необходимую вам дату в верхней части окна, в разделе «Дата»

  2. Перейти к таблице находящейся слева от раздела «Дата», и внести в соответствии с указанным временем необходимые задачи

  3. Нажать кнопку «Добавить запись»



Если у вас по какой-то причине изменился план дня его можно легко изменить, для этого вам потребуется выполнить следующие действия:

  1. Выбрать необходимую вам дату в разделе «Дата» или в «Списке дат»

  2. Нажать на кнопку «Редактировать запись», при этом таблица заполниться запланированными задачами

  3. Отредактировать в таблице ваши изменения

  4. Нажать на кнопку «Сохранить запись»


Для удаления записи вам необходимо также выполнит несколько действий:

  1. Выбрать необходимую вам дату в разделе «Дата» или в «Списке дат»

  2. Нажать на кнопку «Удалить запись», после этого появиться диалоговое окно с подтверждением об удалении, рисунок 4.6

  3. В появившемся диалоговом окне подтвердить ваше действие


Для удаления всех записей из списка дат необходимо нажать на кнопку <Удалить все записи>


Рисунок 4.6 – Диалоговое окно подтверждающие удаление даты
Для хранения телефонных номеров в программе предусмотрен телефонный справочник (рисунок 4.7), куда вы можете занести наиболее важные вам контакты.


Рисунок 4.7 – Телефонный справочник

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

Для добавлении записи необходимо выбрать раздел меню «Добавить контакт», при этом в таблице появляется свободная строка ввода данных. После того как все данные будут введены их необходимо сохранить, для этого в контекстовом меню выбираем пункт «Сохранить изменения».

Для того чтобы удалить ненужный контакт выбираем пункт контекстового меню «Удалить контакт». После чего на экране появиться диалоговое окно «Список контактов» (рис. 4.7). В нем вам необходимо выбрать фамилию удаляемого контакта и нажать на кнопку «Ok». После этого таблица телефонного справочника сократиться на одну запись. Данные в этом случае не нужно сохранять, через пункт контекстового меню «Сохранить изменения»

Рисунок 4.7 – Диалоговое окно «Список контактов».
Дополнительной возможностью программы является окно «Календарь», здесь вы можете уточнить, без особых усилий, интересующую вас дату. Это окно показано на рисунке 4.8.



Рисунок 4.8 – Диалоговое окно «Календарь»
Для удобства в использовании программой, в ней предусмотрен механизм сворачивания программы в системный трейе (рисунок 4.9), при этом программа не мешает работе пользователя и может быть вызвана в любой момент времени. При нажатии правой кнопки мыши на значке появляется контекстовое меню из 4 пунктов: «Восстановить», «Добавить/Редактировать дату», «Включить/Выключить будильник», «Выход».


Рисунок 4.9 – Значок программы в системном трейе
При нажатии «Восстановить» восстанавливается главное окно программы. При нажатии «Добавить/Редактировать дату» на экране появляется окно «Редактор дат», которое было описано выше. При нажатии «Включить/Выключить будильник» происходит включение либо выключение будильника. При выборе пункта «Выход» программы закрывается.


  1. Текст прогрммы

5.1 Модуль класса Unit1
unit Unit1;
interface
uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, ToolWin, Menus, MyUnit, Mask, ImgList, Grids, Buttons, ShellApi;
type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

MenuEg: TMenuItem;

MenuListDay: TMenuItem;

MenuEditDay: TMenuItem;

ToolBar1: TToolBar;

DayButton: TToolButton;

EditDayButton: TToolButton;

ToolButton3: TToolButton;

ToolButton5: TToolButton;

ToolButton6: TToolButton;

Panel1: TPanel;

Label1: TLabel;

DateTimePicker1: TDateTimePicker;

GroupBox1: TGroupBox;

Label2: TLabel;

GroupBox2: TGroupBox;

ListBox1: TListBox;

ImageList1: TImageList;

PhoneDbButton: TToolButton;

GroupBox3: TGroupBox;

Label3: TLabel;

MaskEdit1: TMaskEdit;

Label4: TLabel;

Edit1: TEdit;

Panel2: TPanel;

StringGrid1: TStringGrid;

PopupMenu1: TPopupMenu;

AddPhone: TMenuItem;

SaveDB: TMenuItem;

DelRec: TMenuItem;

MenuCalend: TMenuItem;

Tire: TMenuItem;

MenuExit: TMenuItem;

MenuBook: TMenuItem;

PhoneBook: TMenuItem;

Timer1: TTimer;

AlarmButton: TSpeedButton;

PopupMenu2: TPopupMenu;

PopEG: TMenuItem;

PopAddDate: TMenuItem;

PopOnAlarm: TMenuItem;

N1: TMenuItem;

PopExit: TMenuItem;

Label5: TLabel;

Help: TMenuItem;

procedure MenuEditDayClick(Sender: TObject);

procedure EditDayButtonClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure DateTimePicker1Change(Sender: TObject);

procedure PhoneDbButtonClick(Sender: TObject);

procedure DayButtonClick(Sender: TObject);

procedure AddPhoneClick(Sender: TObject);

procedure SaveDBClick(Sender: TObject);

procedure DelRecClick(Sender: TObject);

procedure MenuListDayClick(Sender: TObject);

procedure MenuCalendClick(Sender: TObject);

procedure ToolButton3Click(Sender: TObject);

procedure MenuExitClick(Sender: TObject);

procedure ToolButton6Click(Sender: TObject);

procedure PhoneBookClick(Sender: TObject);

procedure AlarmButtonClick(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure ListBox1Click(Sender: TObject);

procedure PopEGClick(Sender: TObject);

procedure PopAddDateClick(Sender: TObject);

procedure PopOnAlarmClick(Sender: TObject);

procedure PopExitClick(Sender: TObject);

procedure HelpClick(Sender: TObject);

private

procedure ControlWindow(var MSG: TMessage); // ОТЛАВЛИМАЕМ МИНИМИЗАЦИЮ ПРИЛОЖЕНИЯ

message WM_SYSCOMMAND;

procedure IconMouse(var Msg: Tmessage); // РЕАКЦИЯ НАЖАТИЙ КНОПОК НА ЗНАЧКЕ В ТРЕЕ

message WM_USER + 1;

public

procedure PlanDay(n: integer);

procedure PlanNextWeek(DT: TDate);

procedure GetAlarm; // СЧИТЫВАЕМ ВРЕМЯ И СООБЩЕНИЕ
procedure Ic(n: integer; Icon: TIcon);

procedure OnMinimizeProc(sender: TObject);

end;
var

Form1: TForm1;
implementation
uses Unit2, Unit3, Unit4;
{$R *.dfm}

//********************************************************

// ГЛАВНАЯ ФОРМА *

//********************************************************
// ПРИ СОЗДАНИИ ФОРМЫ ИДТЕ ИНИЦИАЛИЗАЦИЯ ДАННЫХ

procedure TForm1.FormCreate(Sender: TObject);

var

i: integer;

begin

TypFile:= TTypFile.Create;

PhoneFile:= TPhoneFile.create;
DateTimePicker1.Date:= Now; // сегодняшняя дата

GroupBox2.Caption:= 'На ' + DateToStr(DateTimePicker1.Date) + ' запланировано: ';
i:= TypFile.FindRec(DateToStr(DateTimePicker1.Date)); // номер положения даты в файле

if TypFile.DableDate then // если дата существует тогда формируем список дел

PlanDay(i)

else

begin

ListBox1.Items.Add('На этот день у вас ни чего не запланировано');

Label2.Caption:= 'На ' + DateToStr(DateTimePicker1.Date) + ': ' + 'Вы свободны';

end;
// таблица телефонного справочника

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

StringGrid1.Cells[1,0]:= 'Телефон';

StringGrid1.Cells[2,0]:= 'Адресс';

StringGrid1.Cells[3,0]:= 'Организация';

StringGrid1.Cells[4,0]:= 'Примечание';
PlanNextWeek(Form1.DateTimePicker1.Date);

end;
// ПРИ ЗАКРЫТИИ ФОРМЫ ИДЕТ ОСВОБОЖДЕНИИ ПАМЯТИ

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

PhoneFile.CloseDB;

PhoneFile.Destroy;

TypFile.CloseDB;

TypFile.Destroy;

end;
//*******************************************************

// СПРАВОЧНИК ДАТ *

//*******************************************************

// ФОРМИРУЕМ СПИСОК ЗАДАЧ НА ТЕКУЩИЙ ДЕНЬ

procedure TForm1.PlanDay(n: integer);

var

i: integer;

s: string;

hor,TimeFree: integer;

begin

seek(TypFile.FFile, n);

read(TypFile.FFile, EG);

TimeFree:= 1440;

hor:= 0;

for i:= 0 to 49 do

begin

if eg.work[i] <> '' then

begin

s:= eg.clock[i] + ' ' + eg.work[i];

Form1.ListBox1.Items.Add(s);

TimeFree:= TimeFree - 30;

end;

end;
hor:= TimeFree div 60;

TimeFree:= TimeFree mod 60;
if hor <> 24 then

Form1.Label2.Caption:= 'На ' + EG.Date + ': ' + IntToStr(hor) + ' час. ' + IntToStr(TimeFree) + ' мин.'

else

Form1.Label2.Caption:= 'На ' + EG.Date + ': вы свободны';

end;
// ПРИ СМЕНЕ ДАТЫ ФОРМИРУЕМ СПИСОК ДЕЛ

procedure TForm1.DateTimePicker1Change(Sender: TObject);

var

i: integer;

begin

ListBox1.Items.Clear;

GroupBox2.Caption:= 'На ' + DateToStr(DateTimePicker1.Date) + ' запланирвано: ';

i:= TypFile.FindRec(DateToStr(DateTimePicker1.Date)); // номер положения даты в файле

if TypFile.DableDate then // если дата существует тогда формируем список дел

PlanDay(i)

else

begin

ListBox1.Items.Add('На этот день у вас ни чего не запланировано');

Form1.Label2.Caption:= 'На ' + DateToStr(DateTimePicker1.Date) + ': ' + 'Вы свободны';

end;

end;
// ВЫСЧИТЫВАЕМ СВОБОДНОЕ ВРЕМЯ НА СЛЕДУЮЩУЮ НЕДЕЛЮ

procedure TForm1.PlanNextWeek(DT: TDate);

var

i,j,n: integer; // СЧЕТЧИК

Y,M,D: word; // ГОД, МЕСЯЦ, ДЕНЬ

Time_F, Hor, Min: integer; // СВОБОДНОЕ ВРЕМЯ, ЧАС, МИНУТА

begin

DT:= TypFile.NextWeek(DT); // ИЩЕМ НАЧАЛО СЛЕДУЮЩЕЙ НЕДЕЛИ

Time_F:= 10080; // 10080 МИН. ЗА 7 ДНЕЙ

for i:= 0 to 6 do // ЦИКЛ ИЗ 7 ДНЕЙ

begin

n:= TypFile.FindRec(DateToStr(Dt));// ИЩЕМ В СПИСКЕ ДАТУ

if TypFile.DableDate then // ЕСЛИ НАШЛИ ВЫСЧИТЫВАЕМ ВРЕМЯ

begin

Seek(TypFile.FFile, n);

Read(TypFile.FFile, EG);

for j:= 0 to 49 do

begin

if eg.work[j] <> '' then

Time_F:= Time_F - 30;

end;

end;

DecodeDate(DT, Y, M, D); // РАЗБИВАЕМ ДАТУ НА ГОД, МЕСЯЦ И ДЕНЬ

^ D:= D + 1; // ПЕРЕХОДИМ НА СЛЕДУЮЩИЙ ДЕНЬ

TypFile.CheckDay(Y,M,D); // ПРОВЕРЯЕМ НЕ ПЕРЕШЕЛ ЛИ ДЕНЬ ЗА 31 ЧИСЛО

// ЕСЛИ ПЕРЕШЛИ ТО ПРОЦЕД. ВЕРНЕТ ОТКОРЕКТИВАННУ ДАТУ

DT:= EncodeDate(Y,M,D); // ПРЕОБРАЗУЕМ

end;
Hor:= Time_F div 60;

Min:= Time_F mod 60;
if hor <> 168 then

Form1.Label5.Caption:= 'На следующую неделю: ' + IntToStr(hor) + ' час : ' +

IntToStr(min) + ' мин'

else

Form1.Label5.Caption:= 'На следующую неделю: ' + 'ни чего нет'
end;
//********************************************************

// ПАНЕЛЬ БЫСТРОГО ДОСТУПА И МЕНЮ *

//********************************************************
// КНОПКА <1 В ПАНЕЛИ БЫСТ. ДОСТУПА>

procedure TForm1.DayButtonClick(Sender: TObject);

var

i: integer;

begin

ListBox1.Items.Clear;

GroupBox2.Caption:= 'На ' + DateToStr(DateTimePicker1.Date) + ' запланировано: ';
i:= TypFile.FindRec(DateToStr(DateTimePicker1.Date)); // номер положения даты в файле

if TypFile.DableDate then // если дата существует тогда формируем список дел

PlanDay(i)

else

ListBox1.Items.Add('На этот день у вас ни чего не запланировано');

Panel1.Visible:= true;

Panel2.Visible:= False;

end;
// КНОПКА <РЕДАКТОР ДНЯ В ПАНЕЛИ БЫСТРОГО ДОСТУПА>

procedure TForm1.MenuEditDayClick(Sender: TObject);

begin

Form2.ShowModal;

end;
// КНОПКА <КАЛЕНДАРЬ В ПАНЕЛИ БЫСТРОГО ДОСТУПА>

procedure TForm1.ToolButton3Click(Sender: TObject);

begin

Form4.ShowModal;

end;
// КНОПКА <ВЫХОД>

procedure TForm1.ToolButton6Click(Sender: TObject);

begin

Form1.Close;

end;
// МЕНЮ <СПИСОК>

procedure TForm1.MenuListDayClick(Sender: TObject);

begin

DayButtonClick(nil);

end;
// МЕНЮ <РЕДАКТИР ДАТЫ>

procedure TForm1.EditDayButtonClick(Sender: TObject);

begin

Form2.ShowModal;

end;
// МЕНЮ <КАЛЕНДАРЬ>

procedure TForm1.MenuCalendClick(Sender: TObject);

begin

Form4.ShowModal;

end;


// МЕНЮ <ВЫХОД>

procedure TForm1.MenuExitClick(Sender: TObject);

begin

Form1.Close;

end;
// МЕНЮ <СПРАВКА>

procedure TForm1.HelpClick(Sender: TObject);

begin

WinHelp(Form1.Handle, 'Help.hlp', HELP_CONTEXT, 1);

end;
//*****************************************************

// ТЕЛЕФОННЫЙ СПРАВОЧНИК *

//*****************************************************
// КОНСТЕКСТОВОЕ МЕНЮ: ДОБАВИТЬ КОНТАКТ

procedure TForm1.AddPhoneClick(Sender: TObject);

begin

PhoneFile.NumberRec:= PhoneFile.NumberRec + 1;

StringGrid1.RowCount:= PhoneFile.NumberRec + 2;

end;
// КОНТЕКСТОВОЕ МЕНЮ: <СОХРАНИТЬ ИЗМЕНЕНИЯ>

procedure TForm1.SaveDBClick(Sender: TObject);

var

i: integer;

begin

Seek(PhoneFile.FPhoneFile, 0);

Truncate(PhoneFile.FPhoneFile); // СТИРАЕМ ВСЕ ЗАПИСИ ДЛЯ ПЕРЕЗАПИСИ
for i:= 0 to PhoneFile.NumberRec do

begin

Phone.Name:= StringGrid1.Cells[0, i+1];

Phone.Tel:= StringGrid1.Cells[1, i+1];

Phone.Address:= StringGrid1.Cells[2, i+1];

Phone.Org:= StringGrid1.Cells[3, i+1];

Phone.comment:= StringGrid1.Cells[4, i+1];
write(PHoneFile.FPhoneFile, Phone);

end;

end;
// КОНТЕКСТОВОЕ МЕНЮ: <УДАЛИТЬ КОНТАКТ>

procedure TForm1.DelRecClick(Sender: TObject);

begin

Form3.Show;

end;


// ПАНЕЛЬ БЫСРОГО ДОСТУПА; КНОПКА <4>

procedure TForm1.PhoneDbButtonClick(Sender: TObject);

var

i: integer;

begin

if StringGrid1.RowCount < PhoneFile.NumberRec + 1 then

StringGrid1.RowCount:= PhoneFile.NumberRec + 1; // КОЛ-ВО СТРОК

// ДОЛЖНО БЫТЬ НА ОДНУ БОЛЬШЕ
seek(PhoneFile.FPhoneFile, 0); // УСТАНАВАЛИВАЕМ КУРСОР В НАЧАЛО ФАЙЛА

for i:= 0 to PhoneFile.NumberRec - 1 do // ИДЕМ ОТ НАЧАЛА ДО КОНЦА

begin

Phone:= PhoneFile.ReadRec; // ЧИТАЕМ ДАННЫЕ И ЗАНОСИМ В ТАБЛИЦУ

StringGrid1.Cells[0,i + 1]:= phone.Name;

StringGrid1.Cells[1,i + 1]:= Phone.Tel;

StringGrid1.Cells[2,i + 1]:= Phone.Address;

StringGrid1.Cells[3,i + 1]:= Phone.Org;

StringGrid1.Cells[4,i + 1]:= Phone.comment;

end;
Panel2.Visible:= true;

Panel1.Visible:= False

end;


// МЕНЮ <ТЕЛЕФОНЫЙ СПРАВОЧНИК>

procedure TForm1.PhoneBookClick(Sender: TObject);

begin

PhoneDbButtonClick(nil);

end;


//************************************************

// БУДИЛЬНИК *

//************************************************
// КНОПКА <ВКЛ./ВЫКЛ.>

procedure TForm1.AlarmButtonClick(Sender: TObject);

begin

if AlarmButton.Down then

begin

Alarm:= TAlarm.Create;

if (Form1.Edit1.Text <> '') and (Form1.MaskEdit1.Text <> ' : ') then

begin

Form1.GetAlarm;

Form1.Timer1.Enabled:= true;

end

else

begin

Form1.AlarmButton.Down:= False;

MessageDlg('Введите данные!!!', mtInformation, [mbOk], 0);

exit;

end;

//Form1.AlarmButton.Glyph.LoadFromFile('0.bmp');

Form1.AlarmButton.Caption:= 'Выкл';

end

else

begin

// Form1.AlarmButton.Glyph.LoadFromFile('1.bmp');

Form1.AlarmButton.Caption:= 'Вкл';

Form1.Timer1.Enabled:= False;

Alarm.Destroy;

end;

end;
// ПРОЦЕДУРА СЧИТЫВАЕТ ДАННЫЕ (ВРЕМЯ И СООБЩЕНИЕ)

procedure TForm1.GetAlarm;

begin

Alarm.MsgText:= Form1.Edit1.Text;

Alarm.AlarmTime:= StrToTime(Form1.MaskEdit1.Text);

end;
// ЗДЕСЬ ТАЙМЕР ВЫПОЛНЯЕТ ПРОЦЕДУРЫ ПРОВЕРКИ НАСТОЯЩЕГО ВРЕМЕНИ И ТОГО ЧТО УСТАНОВЛЕНО У НАС

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Alarm.CheckTime;

if Alarm.Handl then

begin

Form1.AlarmButton.Down:= False;

Form1.AlarmButton.Caption:= 'Включить';

Form1.Timer1.Enabled:= False;

end;

end;
// ЗАПИСЫВАЕМ ВРЕМЯ И СООБЩЕНИЕ ВЗАВИСИМОСТИ ОТ ВЫБРАННОГО ВРЕМЕНИ В СПИСКЕ ДЕЛ

procedure TForm1.ListBox1Click(Sender: TObject);

var

n: integer;

s: string;

begin

n:= Form1.ListBox1.ItemIndex;

s:= copy(Form1.ListBox1.Items[n], 0, 2)+ ':' + copy(Form1.ListBox1.Items[n], 6, 2);

Form1.MaskEdit1.Text:= s;

s:= copy(form1.ListBox1.Items[n], 10, length(form1.ListBox1.Items[n]) - 8);

Form1.Edit1.Text:= s;

end;
//**********************************************

// ТРЕЙ *

//**********************************************
// ОТЛАВЛИМАЕМ МИНИМИЗАЦИЮ ПРИЛОЖЕНИЯ

procedure TForm1.ControlWindow(var MSG: TMessage);

begin

if MSG.WParam = SC_MINIMIZE then

begin

ic(1, application.Icon); // добавляем значок в трей

ShowWindow(handle, SW_HIDE); // скрываем программу

ShowWindow(Application.Handle, SW_HIDE); // скрываем кнопку в TAskBar

end

else inherited;

end;
// РЕАКЦИЯ НАЖАТИЙ КНОПОК НА ЗНАЧКЕ В ТРЕЕ

procedure TForm1.IconMouse(var Msg: Tmessage);

var

p: TPoint;

begin

GetCursorPos(p); // ЗАПОМИНАЕМ КООРДИНАТЫ МЫШИ

Case Msg.LParam of // ПРОВЕРЯЕМ КАКАЯ КНОПКА БЫЛА НАЖАТА

WM_LBUTTONUP,WM_LBUTTONDBLCLK:

begin

// тут опишем другие процедур при необходимости

end;

WM_RBUTTONUP:

begin

SetForegroundWindow(Handle); // ВОССТАНВЛИВАЕМ ПРОГРАММУ В КАЧСТВЕ ПЕРВВОГО ОКНА

PopupMenu2.Popup(p.X, p.Y); // ПОКАЗЫВАЕМ POPUPMENU

PostMessage(Handle, WM_NULL, 0, 0);

END;

END;

end;
// Для работы со значками в трее используется функция Shell_NotifyIcon, объявленная в модуле ShellApi. процедура работы со знаком в трее: n - номер операции

// ( 1 - добавить, 2 - удалить, 3 - заменить) и Icon - сама иконка
procedure TForm1.Ic(n: integer; Icon: TIcon);

var

nim: TNotifyIconData;

begin

with nim do

begin

cbSize:= SizeOf(nim);

Wnd:= Form1.Handle;

uID:= 1;

uFlags:= NIF_ICON or NIF_MESSAGE or NIF_TIP;

hIcon:= Icon.Handle;

uCallbackMessage:= wm_user + 1;

szTip:= 'Программа "Ежедневник"';

end;
case n of

1: Shell_NotifyIcon(Nim_add, @nim);

2: Shell_NotifyIcon(Nim_Delete, @Nim);

3: Shell_NotifyIcon(Nim_Modify, @Nim);

end;

end;
procedure TForm1.OnMinimizeProc(sender: TObject);

begin

PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);

end;

// КОНТЕКСТОВОЕ МЕНЮ ФОРМЫ: "ЕЖЕДНЕВНИК", ДЕЛАЕТ ФОРМУ ВИДИМОЙ

procedure TForm1.PopEGClick(Sender: TObject);

begin

ic(2,Application.Icon); // УДАЛЯЕМ ЗНАЧОК ИЗ ТРЕЯ

ShowWindow(Application.Handle, SW_SHOW); // ВОССТАНАВЛИВАЕМ КНОПКУПРОГРАММЫ

ShowWindow(Handle, SW_SHOW); // ВОССТАНАВЛИВАЕМ ОКНО ПРГРАММЫ

end;
// КОНТЕКСТОВОЕ МЕНЮ ФОРМЫ: "ДОБАВИТЬ/РЕДАКТИРОВАТЬ ДАТУ"

procedure TForm1.PopAddDateClick(Sender: TObject);

begin

Form2.ShowModal;

end;
// КОНТЕКСТОВОЕ МЕНЮ ФОРМЫ "ВКЛ/ВЫКЛ БУДИЛЬНИК"

procedure TForm1.PopOnAlarmClick(Sender: TObject);

begin

if not Timer1.Enabled then

begin

AlarmButton.Down:= true;

AlarmButtonClick(nil);

end

else

begin

AlarmButton.Down:= False;

AlarmButtonClick(nil);

end;

end;
// КОНТЕКСТОВОЕ МЕНЮ ФОРМЫ "ВЫХОД"

procedure TForm1.PopExitClick(Sender: TObject);

begin

Form1.Close;

end;
end.


    1. Модуль Unit2


unit Unit2;
interface
uses

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

TForm2 = class(TForm)

StringGrid1: TStringGrid;

Panel1: TPanel;

Label1: TLabel;

DateTimePicker1: TDateTimePicker;

AddButton: TButton;

EditDBButton: TButton;

SaveDbButton: TButton;

Button1: TButton;

ListBox1: TListBox;

Label2: TLabel;

DeletRecButton: TButton;

procedure FormCreate(Sender: TObject);

procedure AddButtonClick(Sender: TObject);

procedure EditDBButtonClick(Sender: TObject);

procedure DateTimePicker1Change(Sender: TObject);

procedure SaveDbButtonClick(Sender: TObject);

procedure ListBox1Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure DeletRecButtonClick(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

private

{ Private declarations }

public

procedure DaysDate;

end;
var

Form2: TForm2;

n: integer;

implementation
uses MyUnit, Unit1;
{$R *.dfm}


//*************************************************

// ПРОЦЕДУРЫ ГЛАВНОЙ ФОРМЫ *

//*************************************************
// СОЗДАНИЕ ФОРМЫ: ИНИЦИАЛИЗАЦИЯ ДАННЫХ

procedure TForm2.FormCreate(Sender: TObject);

var

i, // цикл

c: integer; // часы

s: string; // минуты

begin

Form2.StringGrid1.ColWidths[1]:= 200; // ЗАДАЕМ ДЛИНУ

Form2.StringGrid1.Width:= Form2.StringGrid1.ColWidths[0] +

form2.StringGrid1.ColWidths[1]; // ОПРЕДЕЛЯЕМ ОБЩУЮ ДЛИНУ ТАБЛИЦЫ
c:= 0; // ноль часов

s:= '00'; // ноль минут
// разбиваем день с интервалом 30 мин.

// записываем время в первую ячейку

Form2.StringGrid1.Cells[0,0]:= '0' + IntToStr(c) + ' : ' + s;
// записываем время в остальные ячейки

for i:= 1 to 48 do

begin

if i mod 2 = 0 then

s:= '30'

else

begin

s:= '00';

inc(c);

end;

if c < 10 then

Form2.StringGrid1.Cells[0,i]:= '0' + IntToStr(c) + ' : ' + s

else Form2.StringGrid1.Cells[0,i]:= IntToStr(c) + ' : ' + s

end;

end;

// ПИШЕМ ВСЕ ДАТЫ В LISTBOX

procedure TForm2.DaysDate;

var

i: integer;

begin

ListBox1.Items.Clear;

seek(TypFile.FFile, 0);

for i:= 0 to typFile.NumberRec - 1 do

begin

read(typFile.ffile, EG);

ListBox1.Items.Add(eg.Date);

end;

ListBox1.Sorted:= true;

end;


// ФОРМИРУЕМ СПИСОК ДАТ

procedure TForm2.FormShow(Sender: TObject);

begin

ListBox1.Items.Clear;

DaysDate;

end;

// ПРИ НАЖАТИИ НА LISTBOX ПЕРЕДАЕМ ДАТУ В КАЛЕНДАРЬ

procedure TForm2.ListBox1Click(Sender: TObject);

Var

n: integer;

begin

n:= ListBox1.ItemIndex;

DateTimePicker1.Date:= StrToDate(ListBox1.Items[n]);

end;


// ПРИ ВЫБОРЕ ДАТЫ ОЧИЩАЕМ СЕТКУ

procedure TForm2.DateTimePicker1Change(Sender: TObject);

var

i: integer;

begin

for i:= 0 to 49 do

StringGrid1.Cells[1,i]:= '';

end;


//*********************************************

// КНОПКИ УПРАВЛЕНИЯ *

//*********************************************
// КНОПКА <ДОБАВИТЬ ЗАПИСЬ>

procedure TForm2.AddButtonClick(Sender: TObject);

var

i: integer;

begin

TypFile.FindRec(datetostr(DateTimePicker1.Date));

if TypFile.DableDate then

begin

MessageDlg('Такая дату уже есть в списке!!!' + #13+

' Для редактирования нажмите кнопку <Редактировать>',

mtInformation, [mbOk], 0);

exit;

end;

EG.Date:= DateToStr(DateTimePicker1.Date); // ЗАПИСЫВАЕМ ДАТУ

for i:= 0 to 49 do

begin

eg.clock[i]:= StringGrid1.Cells[0,i]; // ЗАПИСЫВАЕМ ПОЛЯ СЕТКИ

eg.work[i]:= StringGrid1.Cells[1,i];

end;
TypFile.AddRec(eg);
DaysDate; // список дат

end;


// КНОПКА <РЕДАКТИРОВАТЬ ЗАПИСЬ>

procedure TForm2.EditDBButtonClick(Sender: TObject);

var

i: integer;

begin

TypFile.PNum:= TypFile.FindRec(DateToStr(DateTimePicker1.Date));

EG:= TypFile.ReadRec(TypFile.PNum);

for i:= 0 to 49 do

begin

StringGrid1.Cells[0,i]:= EG.clock[i];

StringGrid1.Cells[1,i]:= eg.work[i];

end;

end;

// КНОПКА <СОХРАНИТЬ ЗАПИСЬ>

procedure TForm2.SaveDbButtonClick(Sender: TObject);

var

i: integer;

begin

EG.Date:= DateToStr(DateTimePicker1.Date); // ЗАПИСЫВАЕМ ДАТУ

for i:= 0 to 49 do

begin

eg.clock[i]:= StringGrid1.Cells[0,i]; // ЗАПИСЫВАЕМ ПОЛЯ СЕТКИ

eg.work[i]:= StringGrid1.Cells[1,i];

end;
TypFile.ModifyNextRec(EG, TypFile.PNum);

end;

// КНОПКА <УДАЛИТЬ ВСЕ ЗАПИСИ>

procedure TForm2.Button1Click(Sender: TObject);

var

a: integer;

begin

a:= messageDlg('ВЫ ХОТИТЕ ОЧИСТИТЬ СПИСОК ДАТ?', mtInformation,

[mbYes, mbNo], 0);

if a = mrYes then

begin

ListBox1.Items.Clear;

TypFile.DeleteDb;

end;

end;

// КНОПКА <УДАЛИТЬ ЗАПИСЬ>

procedure TForm2.DeletRecButtonClick(Sender: TObject);

var

a: integer;

begin

a:= messageDlg('ВЫ ХОТИТЕ УДАЛИТЬ ДАТУ ' + DateToStr(DateTimePicker1.Date) + '?', mtInformation,

[mbYes, mbNo], 0);

if a = mrYes then

begin

a:= TypFile.FindRec(DateToStr(DateTimePicker1.Date));

if TypFile.DableDate then

if a <> TypFile.NumberRec - 1 then

TypFile.DeleteRec(a)

else

begin

seek(TypFile.FFile, a);

truncate(TypFile.FFile);

TypFile.NumberRec:= FileSize(TypFile.FFile);

end;
end;
DaysDate; // список дат

end;


// ЗАКРЫВАЕМ ФОРМУ - ОБНОВЛЯЕМ СПИСОК ЗАПЛАНИРОВАННЫХ ДЕЛ

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

var

i: integer;

begin

i:= TypFile.FindRec(DateToStr(Form1.DateTimePicker1.Date));

Form1.ListBox1.Items.Clear;

Form1.PlanDay(i);

end;
end.


    1. Модуль Unit3


unit Unit3;
interface
uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, MyUnit;
type

TForm3 = class(TForm)

ComboBox1: TComboBox;

BitBtn1: TBitBtn;

Label1: TLabel;

procedure FormShow(Sender: TObject);

procedure ComboBox1Change(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

private

{ Private declarations }

public
end;
var

Form3: TForm3;

x: string;
implementation
uses Unit1;
{$R *.dfm}

procedure TForm3.FormShow(Sender: TObject);

var

i: integer;

begin

seek(PhoneFile.FPhoneFile, 0);

for i:= 0 to PhoneFile.NumberRec - 1 do

begin

read(PhoneFile.FPhoneFile, Phone);

ComboBox1.Items.Add(Phone.Name);

end;

end;
procedure TForm3.ComboBox1Change(Sender: TObject);

begin

x:= ComboBox1.Text;

end;
procedure TForm3.BitBtn1Click(Sender: TObject);

var

a: integer;

begin

a:= PhoneFile.FindName(x);

if a <> PhoneFile.NumberRec - 1 then

PhoneFile.DeleteRec(a)

else

begin

seek(PhoneFile.FPhoneFile, a);

truncate(PhoneFile.FPhoneFile);

PhoneFile.NumberRec:= FileSize(PhoneFile.FPhoneFile);

end;
form3.Close;

Form1.StringGrid1.RowCount:= Form1.StringGrid1.RowCount - 1;

Form1.PhoneDbButtonClick(nil);

end;
end.

    1. Модуль Unit4


unit Unit4;
interface
uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls;
type

TForm4 = class(TForm)

MonthCalendar1: TMonthCalendar;

private

{ Private declarations }

public

{ Public declarations }

end;
var

Form4: TForm4;
implementation
{$R *.dfm}
end.


    1. Модуль MyUnit


unit MyUnit;
interface
uses Controls, Dialogs, grids, SysUtils, MMSystem;
type

TEgRec = record

Date: string[10]; // дата

clock: array [0..49] of string[8]; // время

work: array [0..49] of string[100] // событие

end;
TPhoneRec = record

Name: string[30]; // ФАМИЛИЯ

Tel: string[10]; // ТЕЛЕФОН

Address: string[30]; // АДРЕС

Org: string[15]; // ОРГАНИЗАЦИЯ

comment: string[20]; // КОМЕНТАРИИ

end;
// БАЗОВЫЙ КЛАСС

TTypFile = class

private

CurNum: integer; // текущее положение записи

public

NumberRec: integer; // номер записи в файле

DbOpen: boolean; // признак отрытия файла

FFile: File of TEgRec;

DableDate: boolean;
constructor Create;

Destructor Destroy; override;

procedure CloseDB; virtual;

function OpenDb(const DBName: string): boolean; virtual;

function CreateDb(const DBname: string): boolean; virtual;

procedure AddRec(const Rec: TEGRec); overload;

procedure ModifyNextRec(const Rec: TEGRec; N: integer); overload;

function ReadRec(const RecNo: integer): TEGRec; overload;

function FindRec(d: string): integer;

procedure DeleteDb;

procedure DeleteRec(n: integer); overload;

function NextWeek(CurDate: TDate): TDate;

procedure CheckDay(var Y,M,D: word);

procedure SetCurNum(n: integer);

function GetCurNum: integer;

property PNum: integer read GetCurNum write SetCurNum;

end;


// КЛАСС НАСЛЕДНИК

TPhoneFile = class(TTypFile)

private
public

FPhoneFile: file of TPhoneRec;

constructor create;

Destructor Destroy; override;

procedure CloseDB; override;

function OpenDb(const DBName: string): boolean; override;

function CreateDb(const DBname: string): boolean; override;

procedure AddRec(const Rec: TPhoneRec); overload;

procedure ModifyNextRec(const Rec: TPhoneRec; N: integer); overload;

function ReadRec: TPhoneRec; overload;

function FindName(s: string): integer;

procedure DeleteRec(n: integer); overload;

end;
// КЛАСС БУДИЛЬНИК

TAlarm = class

private

handled: Boolean;

public

MsgText: string; // ТЕКСТ СООБЩЕНИЯ

AlarmTime: TDateTime; // ВРЕМЯ СИГНАЛА

constructor Create;

Destructor Destroy; override;

Function GetAlarmStr: String;

procedure CheckTime;

function GetHandle: boolean;

property Handl: boolean read GetHandle;

end;
var

TypFile: TTypFile;

EG: TEgRec;

PhoneFile: TPhoneFile;

Phone: TPhoneRec;

Alarm: TAlarm;

implementation
{ TTypFile }


//***********************************************

// БАЗОВЫЙ КЛАСС *

//***********************************************
// СОЗДАЕМ ФАЙЛ БАЗЫ ДАННЫХ

function TTypFile.CreateDb(const DBname: string): boolean;

begin

AssignFile(FFile, Dbname); // ПРИВЯЗЫВАЕМ К ФАЙЛУ ИМЯ

try

Rewrite(FFile); // СОЗДАЕМ ФАЙЛ С ЭТИМ ИМЕНЕМ

DbOpen:= true; // ОТМЕЧАЕМ ЧТО ФАЙЛ ОТКРЫТ

except

DbOpen:= False; // ФАЙЛ НЕ ОТКРЫТ

end;
NumberRec:= 0; // КОЛ-ВО СТРОК РАВНО НУЛЮ

Result:= DbOpen; // РЕЗУЛЬТАТ СОЗДАНИЯ ФАЙЛА

end;

// ОТКРЫВАЕМ ФАЙЛ.

function TTypFile.OpenDb(const DBName: string): boolean;

begin

AssignFile(FFile, DbName);

{$I-}

Reset(FFile); // открываем базу

{$I+}

if IOResult <> 0 then

begin

NumberRec:= 0;

DbOpen:= False;

end

else

begin

NumberRec:= FileSize(FFile); // кол-во записей

DbOpen:= True;

end;

Result:= DbOpen;

end;


// ДОБАВИТЬ ЗАПИСЬ В ФАЙЛ

procedure TTypFile.AddRec(const Rec: TEGRec);

begin

ModifyNextRec(Rec, NumberRec); // переместиться на последнею запись и добавить запись

NumberRec := FileSize(FFile); // новое кол. записей

end;
// ИЗМЕНИТЬ ЗАПИЬ ПОД НОМЕРОМ N

procedure TTypFile.ModifyNextRec(const Rec: TEGRec; N: integer);

begin

Seek(FFile, n); // переместиться на n - запись

Write(FFile, rec);

end;
// ЧИТАТЬ ЗАПИСЬ ПОД НОМЕРОМ RecNo

function TTypFile.ReadRec(const RecNo: integer): TEGRec;

begin

Seek(FFile, RecNo);

read(FFile, result);

end;


// ЗАКРЫВАЕМ ФАЙЛ

procedure TTypFile.CloseDB;

begin

if DbOpen then

CloseFile(FFile);

end;


// КОНСТРУКТОР

constructor TTypFile.Create;

begin

if not OpenDb('BD.txt') then

CreateDB('BD.txt');

end;


// ОСБОЖДАЕМ ПАМЯТЬ

destructor TTypFile.Destroy;

begin

inherited Destroy;

end;


// ПРОЦЕДУРА ПОИСКА ДАТЫ

function TTypFile.FindRec(d: string): integer;

var

i: integer;

begin

Seek(FFile, 0);

DableDate:= false;

for i:= 0 to NumberRec - 1 do

begin

Read(FFile, EG);

if D = EG.Date then

begin

result:= i;

dableDate:= true;

exit;

end;

end;

end;

// ПРОЦЕДУРА УДАЛЕНИЯ ВСЕХ ЗАПИСЕЙ

procedure TTypFile.DeleteDb;

begin

Seek(FFile, 0);

Truncate(FFile);

NumberRec:= FileSize(FFile);

end;


// ПРОЦЕДУРА УДАЛЕНИЯ N ЗАПИСИ

procedure TTypFile.DeleteRec(n: integer);

begin

seek(FFile, NumberRec - 1);

read(FFile, EG);

Seek(FFile, n);

write(FFile, eg);
seek(FFile, NumberRec-1);

truncate(FFile);

NumberRec:= FileSize(FFile);

end;

// ПРОЦЕДУРА ЗАПИСЫВАЕТ НОМЕР ЗАПИСИ

procedure TTypFile.SetCurNum(n: integer);

begin

CurNum:= n;

end;

// ПРОЦЕДУРА ЧТЕНИЯ НОМЕРА ЗАПИСИ

function TTypFile.GetCurNum: integer;

begin

result:= CurNum;

end;

// ПРОЦЕДУРА ИЩЕТ НАЧАЛО СЛЕДУЮЩЕЙ НЕДЕЛИ

function TTypFile.NextWeek(CurDate: TDate): TDate;

var

Y,M,D: word; // ГОД МЕСЯЦ ДЕНЬ

i: integer;

begin

i:= DayOfWeek(CurDate); //

DecodeDate(CurDate, Y, M, D);

case i of

1: D:= D + 1; // ВОСКРЕСЕНИЕ

2: D:= D + 7; // ПОНЕДЕЛЬНИК

3: D:= D + 6; // ВТОРНИК

4: D:= D + 5; // СРЕДА

5: D:= D + 4; // ЧЕТВЕРГ

6: D:= D + 3; // ПЯТНИЦА

7: D:= D + 2; // СУББОТА

end;
CheckDay(Y,M,D);
result:= EncodeDate(Y,M,D);

end;
// ПРОВЕРЯЕМ ДАТУ НА ПЕРЕПОЛНЕНИЕ

procedure TTypFile.CheckDay(var Y, M, D: word);

begin

// 30 ДНЕВНЫЕ МЕСЕЦА

if (M = 4) or (M = 6) or (m = 9) or (m = 11) then

if d > 30 then

begin

d:= d mod 30;

m:= m + 1;

end;
// 31 ДНЕВНЫЕ МЕСЕЦА

if (M = 1) OR (M = 3) OR (M = 5) OR (M = 7) OR (M = 8) OR (M = 10) OR (M = 12) then

if d > 31 then

begin

d:= d mod 31;

m:= m + 1;

end;
// ФЕВРАЛЬ МЕСЯЦ

if m = 2 then

begin

if y mod 4 <> 0 then // не высокосный год

if d > 28 then

begin

d:= d mod 28;

m:= m + 1;

end;
if y mod 4 = 0 then // высокосный год

if d > 29 then

begin

d:= d mod 29;

m:= m + 1;

end;

end;
if m > 12 then

begin

y:= y + 1;

m:= 1;

end;
end;
{ TPhoneFile }
//***************************************************

// КЛАСС НАСЛЕДНИК *

//***************************************************
// СОЗДАЕМ ИЛИ ОТРЫВАЕМ ФАЙЛ

constructor TPhoneFile.create;

begin

if not OpenDb('PhoneDb.txt') then

CreateDB('PhoneDb.txt');

end;


// ОСВОБОЖДЕНИЕ ПАМЯТИ

destructor TPhoneFile.Destroy;

begin

inherited Destroy;

end;

// СОЗДАНИЕ ФАЙЛА БАЗЫ ДАННЫХ ТЕЛЕФОНОВ

function TPhoneFile.CreateDb(const DBname: string): boolean;

begin

AssignFile(FPhoneFile, Dbname); // ПРИВЯЗЫВАЕМ К ФАЙЛУ ИМЯ

try

Rewrite(FPhoneFile); // СОЗДАЕМ ФАЙЛ С ЭТИМ ИМЕНЕМ

DbOpen:= true; // ОТМЕЧАЕМ ЧТО ФАЙЛ ОТКРЫТ

except

DbOpen:= False; // ФАЙЛ НЕ ОТКРЫТ

end;
NumberRec:= 0; // КОЛ-ВО СТРОК РАВНО НУЛЮ

Result:= DbOpen; // РЕЗУЛЬТАТ СОЗДАНИЯ ФАЙЛА

end;

// ОТКРЫТИЕ ФАЙЛА БАЗЫ ДАННЫХ

function TPhoneFile.OpenDb(const DBName: string): boolean;

begin

AssignFile(FPhoneFile, DbName);

{$I-}

Reset(FPhoneFile); // открываем базу

{$I+}

if IOResult <> 0 then

begin

NumberRec:= 0;

DbOpen:= False;

end

else

begin

NumberRec:= FileSize(FPhoneFile); // кол-во записей

DbOpen:= True;

end;

Result:= DbOpen;

end;


// ЗАКРЫВАЕМ ФАЙЛ

procedure TPhoneFile.CloseDB;

begin

if DbOpen then

CloseFile(FPhoneFile);
end;


// ДОБАВИТЬ ЗАПИСЬ

procedure TPhoneFile.AddRec(const Rec: TPhoneRec);

begin

ModifyNextRec(Rec, NumberRec); // переместиться на последнею запись и добавить запись

NumberRec := FileSize(FPhoneFile); // новое кол. записей

end;

// ИЗМЕНИТЬ ЗАПИЬ ПОД НОМЕРОМ N

procedure TPhoneFile.ModifyNextRec(const Rec: TPhoneRec; N: integer);

begin

Seek(FPhoneFile, n); // переместиться на n - запись

Write(FPhoneFile, rec);

end;

// ПРОЦЕДУРА ЧТЕНИЯ ДАННЫХ

function TPhoneFile.ReadRec: TPhoneRec;

begin

read(FphoneFile, result);

end;


// ИЩЕМ ИМЯ

function TPhoneFile.FindName(s: string): integer;

var

i: integer;

begin

Seek(FPhoneFile, 0);

for i:= 0 to NumberRec - 1 do

begin

Read(FPhoneFile, phone);

if s = phone.Name then

begin

result:= i;

exit;

end;

end;

end;


// УДАЛЯЕМ ЗАПИСЬ

procedure TPhoneFile.DeleteRec(n: integer);

begin

seek(FPhoneFile, NumberRec - 1);

read(FPhoneFile, Phone);

Seek(FPhoneFile, n);

write(FPhoneFile, Phone);
seek(FPhoneFile, NumberRec-1);

truncate(FPhoneFile);

NumberRec:= FileSize(FPhoneFile);

end;


{ TAlarm }
//*******************************************

// КЛАСС: БУДИЛЬНИК *

//*******************************************
// ПРОЦЕДУРА ПРОВЕРКИ ВРЕМЕНИ ВКЛ. СИГНАЛА

procedure TAlarm.CheckTime;

var

H1,M1,S1,MS1: word;

H2,M2,S2,MS2: word;

Match: boolean;

begin

DecodeTime(Time, H1, M1, S1, MS1); // ДЕКОДИРУЕМ ТЕКУЩЕЕ ВРЕМЯ

DecodeTime(AlarmTime, H2, M2, S2, MS2); // РАСКОДИРОВАТЬ ТЕКУЩЕЕ ВРЕМЯ БУДИЛЬНИКА
// ПРОВЕРЯЕМ ТЕКУЩЕЕ ВРЕМЯ И ВРЕМЯ БУДИЛЬНИКА

if (H1 = H2) AND (M1 = M2) then

match:= true

else

match:= false;
// ЕСЛИ ВРЕМЯ СОВПОДАЕТ (MATH = TRUE), ТО ВЫПОЛНЯЕМ АЛГОРИТМ ОПИСАННЫЙ НИЖЕ

if match then

begin

if not handled then

begin

handled := true; // ДЛЯ ИЗБЕЖАНИЯ ПОВТОРНЫХ ВКЛ. ИСПОЛЬЗУЕМ ФЛАГ <HANDLED>

SndPlaySound(PChar('1.wav'), SND_SYNC);

MessageDlg(GetAlarmStr, mtWarning, [mbOk], 0);

end;

end

else

Handled:= False;

end;


// ФУНКЦИЯ ФОРМИРУЕТ ТЕКСТ СООБЩЕНИЯ

constructor TAlarm.Create;

begin

handled:= False;

end;
// ОСВОБОЖДАЕМ ПАМЯТЬ

destructor TAlarm.Destroy;

begin

inherited Destroy;

end;
// ФОРМИРУЕМ СТРОКУ СООБЩЕНИЯ

function TAlarm.GetAlarmStr: String;

begin

result:= FormatDateTime('hh:mm ', AlarmTime) + MsgText

end;
// ЧИТАЕМ СОСТОЯНИЕ <HANDLE>

function TAlarm.GetHandle: boolean;

begin

result:= handled;

end;
end.

Заключение
В результате выполнения курсовой работы была разработана прикладная программа «Ежедневник». Она помогает пользователю рационально планировать свой распорядок дня, а также хранить наиболее важные номера телефонов. Программа имеет удобный и простой интерфейс. Разработанная программа выполнена в соответствии с требованиями технического задания.

Список использованных источников
1 Тонкий Л. В. Системное программное обеспечение. Программа учебной дисциплины и методические указания к выполнению курсовой работы [текст] РГАТА. – Рыбинск, 2006. – 23 с.

2 Гофман В. Delphi 7. Полное руководство [текст] Питер. – Санкт-Петербург, 2002. – 340 с.


Скачать файл (568.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru