Кулінарна книга

Розробка програми, яка зможе групувати кулінарні рецепти в категорії, забезпечить запис нових рецептів, видалення будь-якого рецепту (одночасно з бази даних і з диску). Редагування рецепту, його перейменування, переміщення, копіювання до іншої категорії.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 14.03.2013
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Міністерство освіти і науки України

Вінницький національний технічний університет

Факультет КІ

Кафедра ПЗ

Курсова робота

Кулінарна книга

З дисципліни «Основи програмування та алгоритмічні мови»

Керівник доцент, к. ф-м. н.В.Х. Власюк

Студент гр. 1КН-09 О.О. Алєксєєв

Вінниця 2010р.

Вступ

В сучасному світі людство оперує безмежною кількістю інформації, яку зберігати та сортувати без допоміжних засобів просто неможливо. Тому актуальність програм-каталогізаторів сьогодні дуже висока. Вони допомагають упорядковувати, знаходити та порівнювати певну структуру даних.

Задача розробки кулінарної книги також вимагає створення каталогізатора кулінарних рецептів, щоб можна було легко, а головне, швидко знайти потрібний рецепт, створити новий, перемістити будь-який рецепт до будь-якої категорії тощо.

Програма «Кулінарна книга» повинна бути універсальною, такою, щоб підходила як для домашнього користування, так і для установ громадського харчування. Універсальність програми є в тому, що кожний користувач має повний доступ до бази даних категорій рецептів і до рецептів, має можливість групувати рецепти таким чином, щоб йому було зручно ними користуватися.

Для розробки подібного продукту потрібно орієнтуватися на те, що користувач цієї програми може мати початкові навики роботи з персональним комп'ютером, тому інтерфейс програми повинен бути якомога простішим, з підказками, з контекстним меню, з приємним дизайном, щоб зробити користування цією програмою простим і приємним.

кулінарний рецепт база диск

1. Розробка і обґрунтування технічного завдання

1.1 Вимоги користувача

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

Програма повинна бути насичена діалогами як інформаційними так і підтверджувальними, щоб повідомляти користувача про неможливість виконання якоїсь операції (наприклад збереження рецепту, не ввівши його ім'я), запитувати підтвердження перед дією яка веде до втрати даних (видалення рецепту, категорії), щоб користувач випадково натиснувши «не ту клавішу», не знищив потрібну йому інформацію.

Програма має мати приємний дизайн, щоб користувач відразу побачив істотні переваги комп'ютерної програми над звичайним паперовим записником чи звичайною книгою.

У програмі має передбачатися виконання недопустимих дій користувачем, такі як видалення рецепту, коли рецепти відсутні, видалення категорії, якщо ця категорія є єдиною. Подібні спроби виконати такі дії повинні блокуватись, а користувач інформуватися про його помилки в користуванні програмою. Програма перевірятиме на диску наявність необхідних файлів з рецептами, файлів баз даних. Якщо було втрачено файл рецептів, програма автоматично видалить цей рецепт з бази даних. Якщо було втрачено файл з базою даних, програма автоматично створить нову чисту базу.

При запуску програми на екрані повинна з'являтися заставка, в якій міститься назва програми та короткі відомості про автора програми. Через деякий проміжок часу заставка буде зникати і запускатиметься головна форма програми.

Головна форма програми містить такі елементи:

- випадаючий список категорій рецептів;

- список рецептів поточної категорії;

- область перегляду поточного рецепту;

- панель управління рецептами, яка складається з 10 кнопок («створення нового рецепту», «редагування нового рецепту», «переміщення рецепту в іншу категорію», «копіювання рецепту в іншу категорію», «видалення рецепту», «пошук рецепту», «перейменування рецепту», «перейменування категорії», «завантаження рецепту з файлу», «збереження рецепту у файл»);

- головне меню форми;

- контекстне меню списку рецептів;

1.2 Вимоги до програмної реалізації

Програма повинна відповідати вимогам користувача.

Для розробки програми було використано середовище Turbo Delphi 2006. Це середовище має багато можливостей для розробки повноцінних програм на платформі Win32. Мова Delphi бере свої початки від мови Pascal і зараз є дуже потужним засобом об'єктно-орієнтованого програмування. Вона містить багато стандартних модулів для роботи з вікнами, контролами, базами данних, і тому повністю підходить для реалізації поставленої задачі.

Всі дії в програмі мають бути забезпеченні для виконання як мишою, так і клавіатурою. При запуску команд клавіатурою потрібно враховувати застосування загальновідомих комбінацій («гарячих клавіш»). Наприклад, для пошуку рецепту потрібно застосувати комбінацію клавіш Ctrl + F, для створення нового рецепту - Ctrl + N, для видалення рецепту Del, видалення категорії - Shift + Del і т.д.

Програма повинна мати не один спосіб виконання певної дії. Наприклад, для редагування поточного рецепту користувачу необов'язково шукати відповідний пункт меню, або відповідну кнопку на панелі. Йому достатньо лише зробити подвійний клік, або натиснути Enter на цьому рецепті в списку рецептів.

Передбачимо, що програма буде мати ряд синхронізацій. При виборі категорії відразу завантажуватиметься список рецептів цієї категорії, при виборі рецепту відразу завантажуватиметься поточний рецепт в область перегляду рецепту.

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

Оскільки в програмі потрібно працювати з упорядкованим набором інформації, необхідно користуватись двома різними базами даних: базою категорій та базою рецептів. Кожен рецепт буде завантажуватись із окремого файлу.

Планується, що всі кнопки на панелі управління будуть з підказками, будуть змінювати свій колір при наведенні-відведенні миші, при натисненні клавіші миші.

1.3 Функціональні можливості програми

Програма містить два меню (головне та контекстне), а також панель управління. Можна звертатися до пунктів меню або кнопок панелі управлінння у будь-якому порядку. Вибір відповідних пунктів меню здійснюється мишкою. Також є можливість користуватися гарячими клавішами. Про відповідність гарячих клавіш можна дізнатися із головного меню, кожний пункт якого містить інформацію про відповідну йому комбінацію клавіш. Програма дозволяє створювати необмежену кількість категорій і рецептів. Є лише одна умова: для користування програмою необхідно мати хоча б одну категорію, тому програма не дозволить користувачеві видалити єдину категорію. Є можливість виконувати багато дій над рецептами і категоріями. До них відносяться: створення, редагування, видалення, копіювання, переміщення, перейменування, пошук, завантаження з текстового файлу, збереження в текстовий файл.

При редагуванні рецепту редактор рецепту показує кількість рядків і символів у поточному рецепті.

1.4 Аналіз і вибір методу вирішення основної задачі

Оскільки програма розробляється на мові об'єктно-орієнтованого програмування Delphi, для реалізації її роботи потрібно написати ряд функцій і процедур, які будуть виконувати ті дії, що виконуються у програмі більше одного разу.

Основна задача програми забезпечити збереження та завантаження інформації з баз даних. В програмі використовується стандартна бібліотека для роботи з текстовими базами даних tdb_lib (text database library). Набір методів цієї бібліотеки повністю достатній для реалізації необхідних дій, що виконуються з базами даних у даній програмі. Програма працює з двома базами даних.

Перша база даних знаходиться у файлі CatDB.dbe. Це база даних категорій. У ній є 2 поля: ID і Name. ID - поле типу longint, це унікальний номер кожної категорії (ID). Друге поле Name типу string, це назва категорії.

Друга база даних знаходиться у файлі RecDB.dbe. Це база даних рецептів. Вона містить 3 поля: ID, CatID, Name. ID (поле типу longint) - це унікальний номер кожного рецепту. CatID (поле типу longint) вказує до якої категорії відноситься рецепт. Name (поле типу string) - це назва рецепту.

Текст кожного рецепту знаходиться у окремому файлі з розширенням «rec». Бази даних і рецепти знаходяться в каталозі «data».

Програма має дві основні форми: MainForm - головна форма програми, RecEditorForm - форма редактора рецептів, та ZastForm - форма заставки.

В головній формі є такі елементи: випадаючий список категорій типу TCombobox, список рецептів типу TListbox, область перегляду вмісту рецепту типу TMemo, 10 кнопок панелі управління типу TImage. Тип TImage для кнопок було вибрано, тому що він має істотні переваги при графічному оздоблені. Кнопки панелі управління при наведені на них мишою, відведенні від них миші, при кліку змінюють свою піктограму на іншу. Піктограми завантажуються з списку зображень типу TImageList у відповідних обробниках подій реакції на мишу.

Також всі дії над рецептами можна виконувати у контекстному меню списку рецептів, або у головному меню головної форми.

Форма редактора рецептів містить випадаючий список типу TCombobox для вибору або відображення категорії рецепту, текстове поле типу TEdit для назви рецепту, область тексту рецепту типу TMemo, дві кнопки для збереження та виходу типу TImage.

В програмі використані діалогові вікна таких типів:

1. Введення текстового рядка.

2. Вибір категорії для переміщення чи копіювання.

3. Показ повідомлення про помилку чи довідкової інформації.

4. Підтвердження деякої умови чи її відхилення

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

2.1 Покроковий алгоритм

1.) Створення форм.

2.) Запуск заставки.

3.) Запуск головної форми.

4.) Очікування команд від користувача.

5.) Виконання команд користувача.

6.) Завершення роботи з програмою.

3. Програмна реалізація

3.1 Програмування інтерфейсу

Під користувацьким інтерфейсом (КІ) програми розумітиметься сукупність елементів, що дозволяють користувачеві програми управляти її роботою і отримувати необхідні результати. Фактично, КІ - це канал, по якому здійснюється взаємодія користувача і програми. Чому є необхідність взагалі говорити про КІ? Річ у тому, що виходячи з самої ідеї, програма пишеться для користувача, для задоволення його потреб. У результаті ж часто виходить, що програміст пише програму "Для себе", тобто нікому більше вона не потрібна, тому що окрім автора цієї програми зрозуміти її мало хто може. І можна, звичайно, доводити, що алгоритм програми геніальний, і що код працює дуже швидко і займає менше місця в порівнянні з аналогічними програмами, але ці моменти цікавитимуть лише програмістів, тому що будуть зрозумілі лише їм і лише ними будуть оцінені належним чином. Користувач же має щодо програми дещо інші вимоги, ніж програміст, оскільки дивиться на код зовні, а не зсередини. І, відповідно, більшою популярністю користуватиметься та програма, з якою користувач порозуміється краще, вище перераховані параметри ж цікавлять користувача в другу чергу.

Необхідно ретельно продумати і усвідомити схему програми, привівши її до системи (структури, збудованій по певних правилах), і, відповідно, реалізувавши КІ відповідно до цієї системи. Користувачеві досить буде "схопити" суть, щоб аналогічно розібратися в останньому. Слід уникати зайвих елементів. Чим менше їх буде, тим простіше користувачеві буде розібратися.

Програма запускатиметься файлом Recepts.exe.

Після запуску програми з'являється заставка, яка залишається на екрані впродовж 4 секунд.

Потім запускається головна форма програми. В головній формі програми для кращого оздоблення буде розроблено нестандартну промальовку головного меню, контекстного меню. Також, з метою дизайну, використовуючи обробники подій об'єкту TImage, буде реалізовано зміну піктограм на кнопках панелі управління. При наведенні курсору піктограми стають з жовтим відтінком, при натисненні - з синім відтінком.

Для програмування інтерфейсу буде використана значна кількість функцій з різних модулів середовища Turbo Delphi. Також будуть реалізовано власні підпрограми для різних потреб. В функціонал програми включено 12 основних команд. Цього набору повністю достатньо для користувача.

3.2 Програмування основного алгоритму

Як відомо, великі програми не пишуться без процедур та функцій. В цій курсовій роботі будуть розроблені такі процедури і функції для реалізації заданої програми, кожна з яких виконує свою функцію.

CreateCatDataBase(filename : string) - процедура створення бази даних категорій при її відсутності;

CreateRecDataBase(filename : string) - процедура створення бази даних рецептів при її відсутності;

FillCatCB - процедура, що заповняє випадаючий список категорій з бази даних категорій;

OnSelectCat - процедура, що заповняє список рецептів при виборі категорії;

OnSelectRecept - процедура, що завантажує текст рецепту при виборі рецепту в головній формі;

OnDelete - процедура, що запускається при видаленні рецепту ;

DeleteRecept(recID : longint) - процедура видалення рецепту з бази даних і з диску по його ID;

OnDeleteCategory - процедура видалення категоії;

OnAddCategory - процедура створення категорії;

OnMoveToCat - процедура переміщення рецепту до іншої категорії;

OnEdit - процедура редагування рецепту;

OnNewRec - процедура створення нового рецепту;

OnFind - процедура пошуку рецептів;

OnSaveToFile - процедура збереження рецепту в текстовий файл;

OnCopyToCat - процедура копіювання рецепту;

OnOpenFromFile - процедура завантаження рецепту з текстового файлу;

OnRenameRecept - процедура перейменування рецепту;

OnRenameCat - процедура перейменування категорії;

ApplyNormColorsOverRGB - присвоєння кольорів до об'єктів форми через RGB;

OnSelectReceptWithID(recID, CatID : longint) - процедура вибору категорії і рецепту по ID при пошуку;

Для того щоб користуватись програмою необхідно мати ОС Windows будь-якої версії після Windows 3.1. Також необхідна наявність клавіатури і миші, хоча використовувати мишу необов'язково, тому що всі дії можна виконувати з допомогою клавіатури.

4. Тестування і перевірка програми

4.1 Підготовка тестування

Тестування - це перевірка роботи програм з даними, подібними реальним, котрі будуть оброблятися в процесі експлуатації системи. Недоробки в роботі Програмного Забезпечення виявляються при аналізі вихідних даних, серед яких виділяються і дослідджуються аномальні. Тестування використовується, також, як процес технічного дослідження, який виконується на вимогу замовників призначений для вияву інформації про якість продукту відносно контексту, в якому він має використовуватись.

4.2 Аналіз результатів роботи програми

Рисунок 4.1 - Головна форма програми

Рисунок 4.2 - Заставка

Рисунок 4.3 - Форма редактора рецептів

Рисунок 4.4 - Переміщення рецепту до іншої категорії

Рисунок 4.5 - Копіювання рецепту до іншої категорії

Рисунок 4.6 - Пошук рецепту

Рисунок 4.7 - Перейменування рецепту

Рисунок 4.8 - Перейменування категорії

Рисунок 4.9 - Контекстне меню списку рецептів

Висновки

Всі вимоги виконані: розроблена і протестована програма «Кулінарна книга» - програма управління кулінарними рецептами.

Програма є універсальною, такою, що підходить як для домашнього користування, так і для установ громадського харчування. Кожен користувач програми має повний доступ до бази даних категорій рецептів і до самих рецептів. Він може групувати їх таким чином, щоб йому було зручно ними користуватися.

Можливий розвиток програми - включення нового функціоналу, наприклад: друк рецепту, друк всієї категорії, друк всіх рецептів, створення деревовидної структури категорій, так щоб категорії також могли містити інші категорії, фото кулінарного виробу, багатокористувацький режим, захист рецепту або категорії паролем.

При тестуванні було виявлено такі переваги і недоліки використовуваного методу:

Переваги - простота, надійність, дружній інтерфейс, працює у віконному режимі, розвита графіка.

Недоліки - великий обсяг необхідної оперативної пам'яті (близько 8 МБ).

Список використаної літератури
1. Баженова И.Ю., Delphi 7. Самоучитель программиста. - Москва, “Кудиц-образ ОЦ НОУ”, 2003.
2. Джулиан Банкелл. Фундаментальные алгоритмы и структуры данных в Delphi. - Санкт-Петербург, “ДиаСофтЮП“, 2001.
3. Кандзюба С.П., Громов В.Н., Delphi 6/7. Базы данных и приложения. Лекции и упражнения. - Москва, “ДиаСофтЮП“, 2002.
4. Круподьорова Л.М. Методичні вказівки для курсового проектування, ВНТУ, 2004.
5. Власюк В.Х. Програмування алгоритмічними мовами,ВДТУ, 2004

Додаток

Текст програми "Кулінарна книга"

MAINFORMUNIT.PAS

unit MainFormUnit;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Buttons, StdCtrls, ExtCtrls, Menus, ComCtrls, MyLib, RecInterfaceUnit, AskDialogUnit, tdb_lib, RecEditorFormUnit,ExtDlgs, skins, ImgList;

type

TMainForm = class(TForm)

MainMenu1: TMainMenu;

PopupMenu1: TPopupMenu;

N1: TMenuItem;

N2: TMenuItem;

Panel1: TPanel;

Label1: TLabel;

CatCB: TComboBox;

Panel2: TPanel;

l: TListBox;

Memo: TMemo;

Label2: TLabel;

Label4: TLabel;

StatusBar1: TStatusBar;

Image1: TImage;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

N9: TMenuItem;

N10: TMenuItem;

N11: TMenuItem;

N12: TMenuItem;

N13: TMenuItem;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveTextFileDialog;

ImageList1: TImageList;

N14: TMenuItem;

N15: TMenuItem;

N16: TMenuItem;

imgnorm: TImageList;

imgon: TImageList;

imgclick: TImageList;

Panel3: TPanel;

Im1: TImage;

Im2: TImage;

Im3: TImage;

Im4: TImage;

Im5: TImage;

Im10: TImage;

Im9: TImage;

Im8: TImage;

Im7: TImage;

Im6: TImage;

imcat: TImageList;

Image2: TImage;

N17: TMenuItem;

N18: TMenuItem;

N19: TMenuItem;

N20: TMenuItem;

N21: TMenuItem;

N22: TMenuItem;

N23: TMenuItem;

N24: TMenuItem;

N25: TMenuItem;

N26: TMenuItem;

N27: TMenuItem;

procedure lClick(Sender: TObject);

procedure CatCBChange(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Image1Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure Im3Click(Sender: TObject);

procedure Im5Click(Sender: TObject);

procedure Im2Click(Sender: TObject);

procedure Im1Click(Sender: TObject);

procedure Im6Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N6Click(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure N8Click(Sender: TObject);

procedure N10Click(Sender: TObject);

procedure N12Click(Sender: TObject);

procedure N13Click(Sender: TObject);

procedure SpeedButton5Click(Sender: TObject);

procedure N11Click(Sender: TObject);

procedure Im4Click(Sender: TObject);

procedure Im10Click(Sender: TObject);

procedure Im7Click(Sender: TObject);

procedure Im8Click(Sender: TObject);

procedure Im9Click(Sender: TObject);

procedure lDblClick(Sender: TObject);

procedure N15Click(Sender: TObject);

procedure N14Click(Sender: TObject);

procedure N9Click(Sender: TObject);

procedure N16Click(Sender: TObject);

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

procedure Im8MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im8MouseLeave(Sender: TObject);

procedure Im8MouseEnter(Sender: TObject);

procedure Im8MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im1MouseEnter(Sender: TObject);

procedure Im1MouseLeave(Sender: TObject);

procedure Im2MouseLeave(Sender: TObject);

procedure Im3MouseLeave(Sender: TObject);

procedure Im4MouseLeave(Sender: TObject);

procedure Im5MouseLeave(Sender: TObject);

procedure Im6MouseLeave(Sender: TObject);

procedure Im7MouseLeave(Sender: TObject);

procedure Im9MouseLeave(Sender: TObject);

procedure Im10MouseLeave(Sender: TObject);

procedure Im10MouseEnter(Sender: TObject);

procedure Im9MouseEnter(Sender: TObject);

procedure Im7MouseEnter(Sender: TObject);

procedure Im6MouseEnter(Sender: TObject);

procedure Im5MouseEnter(Sender: TObject);

procedure Im4MouseEnter(Sender: TObject);

procedure Im3MouseEnter(Sender: TObject);

procedure Im2MouseEnter(Sender: TObject);

procedure Im1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im3MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im4MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im5MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im6MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im7MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im9MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im10MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im10MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im9MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im7MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im6MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im5MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im4MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im3MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure lKeyPress(Sender: TObject; var Key: Char);

procedure FormShow(Sender: TObject);

procedure MemoEnter(Sender: TObject);

procedure MemoExit(Sender: TObject);

procedure Image1MouseEnter(Sender: TObject);

procedure Image1MouseLeave(Sender: TObject);

procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Image2MouseEnter(Sender: TObject);

procedure Image2MouseLeave(Sender: TObject);

procedure Image2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Image2Click(Sender: TObject);

procedure N18Click(Sender: TObject);

procedure N20Click(Sender: TObject);

procedure N19Click(Sender: TObject);

procedure N21Click(Sender: TObject);

procedure N22Click(Sender: TObject);

procedure N23Click(Sender: TObject);

procedure N24Click(Sender: TObject);

procedure N27Click(Sender: TObject);

procedure N25Click(Sender: TObject);

procedure N26Click(Sender: TObject);

procedure PopupMenu1Popup(Sender: TObject);

procedure N3Click(Sender: TObject);

public

m_CatDBFilename, m_RecDBFilename, m_rootFolder, m_DataFolder : string;

m_CurRecFilename : string;

m_curRecID, m_CurCatID : longint;

m_cl3dLight : TColor;

m_clCream : TColor;

procedure FillCatCB;

procedure OnSelectCat;

procedure OnSelectRecept;

procedure OnDelete;

procedure DeleteRecept(recID : longint);

procedure OnDeleteCategory;

procedure OnAddCategory;

procedure OnMoveToCat;

procedure OnEdit;

procedure OnNewRec;

procedure OnFind;

procedure OnSaveToFile;

procedure OnCopyToCat;

procedure OnOpenFromFile;

procedure OnRenameRecept;

procedure OnRenameCat;

procedure ApplyNormColorsOverRGB;

end;

procedure OnSelectReceptWithID(recID, CatID : longint);

var

MainForm: TMainForm;

implementation

uses SimpleSelectInListboxUnit, EditTextUnit, SearchInStringsUnit, ZastUnit;

{$R *.dfm}

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

if not self.Visible then

begin

CanClose := false;

exit;

end;

CanClose := false;

AskDialog.Run('Ви дійсно хочете вийти з програми?', true, true, false, true);

if askDialog.m_SelectedItem = 1 then

CanClose := true;

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

ApplyNormColorsOverRGB;

Application.HintColor := m_cl3DLight;

Application.HintPause := 52;

m_rootFolder := mylib.GetFolderForFilename(Application.ExeName);

m_DataFolder := m_rootFolder + 'data\';

m_CatDBFilename := m_DataFolder + 'CatDB.DBE';

m_RecDBFilename := m_DataFolder + 'RecDB.DBE';

if not FindLocalFolder (m_DataFolder + '\') then

CreateFolder(m_DataFolder + '\');

if not FileExists(m_CatDBFilename) then

CreateCatDataBase(m_CatDBFilename);

if not FileExists(m_RecDBFileName) then

CreateRecDataBase(m_RecDBFileName);

FillCatCB;

MenuItemsObject.PreparePopupmenuForSkin(popupmenu1, self);

MenuItemsObject.PrepareMainMenuForSkin(MainMenu1, self);

end;

procedure TMainForm.FormShow(Sender: TObject);

begin

if CatCB.Items.Count < 1 then

begin

AskDialog.Run('Для роботи з програмою необхідно мати хоча б одну категорію.' + #13 +

'Створити категорію? Натисніть "Так" для створення, "Ні" для виходу.', true, true, false, false);

if AskDialog.m_SelectedItem <> 1 then

halt

else

OnAddCategory;

if CatCB.Items.Count < 1 then

halt;

end;

if l.Items.Count > 0 then

l.SetFocus;

end;

procedure TMainForm.Im9Click(Sender: TObject);

begin

OnOpenFromFile;

end;

procedure TMainForm.Im9MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(9, im9.Picture.Bitmap);

im9.Repaint;

end;

procedure TMainForm.Im9MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(9, im9.Picture.Bitmap);

im9.Repaint;

end;

procedure TMainForm.Im9MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(9, im9.Picture.Bitmap);

im9.Repaint;

end;

procedure TMainForm.Im9MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(9, im9.Picture.Bitmap);

im9.Repaint;

end;

procedure TMainForm.Im10Click(Sender: TObject);

begin

OnSaveToFile;

end;

procedure TMainForm.Im10MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(10, im10.Picture.Bitmap);

im10.Repaint;

end;

procedure TMainForm.Im10MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(10, im10.Picture.Bitmap);

im10.Repaint;

end;

procedure TMainForm.Im10MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(10, im10.Picture.Bitmap);

im10.Repaint;

end;

procedure TMainForm.Im10MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(10, im10.Picture.Bitmap);

im10.Repaint;

end;

procedure TMainForm.Image1Click(Sender: TObject);

begin

OnDeleteCategory;

end;

procedure TMainForm.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imcat.GetBitmap(2, image1.Picture.Bitmap);

image1.Repaint;

end;

procedure TMainForm.Image1MouseEnter(Sender: TObject);

begin

imcat.GetBitmap(1, image1.Picture.Bitmap);

image1.Repaint;

end;

procedure TMainForm.Image1MouseLeave(Sender: TObject);

begin

imcat.GetBitmap(0, image1.Picture.Bitmap);

image1.Repaint;

end;

procedure TMainForm.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imcat.GetBitmap(0, image1.Picture.Bitmap);

image1.Repaint;

end;

procedure TMainForm.Image2Click(Sender: TObject);

begin

OnAddCategory;

end;

procedure TMainForm.Image2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imcat.GetBitmap(5, image2.Picture.Bitmap);

image2.Repaint;

end;

procedure TMainForm.Image2MouseEnter(Sender: TObject);

begin

imcat.GetBitmap(4, image2.Picture.Bitmap);

image2.Repaint;

end;

procedure TMainForm.Image2MouseLeave(Sender: TObject);

begin

imcat.GetBitmap(3, image2.Picture.Bitmap);

image2.Repaint;

end;

procedure TMainForm.Image2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imcat.GetBitmap(3, image2.Picture.Bitmap);

image2.Repaint;

end;

procedure TMainForm.Im4Click(Sender: TObject);

begin

OnCopyToCat;

end;

procedure TMainForm.Im4MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(4, im4.Picture.Bitmap);

im4.Repaint;

end;

procedure TMainForm.Im4MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(4, im4.Picture.Bitmap);

im4.Repaint;

end;

procedure TMainForm.Im4MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(4, im4.Picture.Bitmap);

im4.Repaint;

end;

procedure TMainForm.Im4MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(4, im4.Picture.Bitmap);

im4.Repaint;

end;

procedure TMainForm.Im3Click(Sender: TObject);

begin

OnMoveToCat;

end;

procedure TMainForm.Im3MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(3, im3.Picture.Bitmap);

im3.Repaint;

end;

procedure TMainForm.Im3MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(3, im3.Picture.Bitmap);

im3.Repaint;

end;

procedure TMainForm.Im3MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(3, im3.Picture.Bitmap);

im3.Repaint;

end;

procedure TMainForm.Im3MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(3, im3.Picture.Bitmap);

im3.Repaint;

end;

procedure TMainForm.Im5Click(Sender: TObject);

begin

OnDelete;

end;

procedure TMainForm.Im5MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(5, im5.Picture.Bitmap);

im5.Repaint;

end;

procedure TMainForm.Im5MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(5, im5.Picture.Bitmap);

im5.Repaint;

end;

procedure TMainForm.Im5MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(5, im5.Picture.Bitmap);

im5.Repaint;

end;

procedure TMainForm.Im5MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(5, im5.Picture.Bitmap);

im5.Repaint;

end;

procedure TMainForm.Im2Click(Sender: TObject);

begin

OnEdit;

end;

procedure TMainForm.Im2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(2, im2.Picture.Bitmap);

im2.Repaint;

end;

procedure TMainForm.Im2MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(2, im2.Picture.Bitmap);

im2.Repaint;

end;

procedure TMainForm.Im2MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(2, im2.Picture.Bitmap);

im2.Repaint;

end;

procedure TMainForm.Im2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(2, im2.Picture.Bitmap);

im2.Repaint;

end;

procedure TMainForm.Im1Click(Sender: TObject);

begin

OnNewRec;

end;

procedure TMainForm.Im1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(1, im1.Picture.Bitmap);

im1.Repaint;

end;

procedure TMainForm.Im1MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(1, im1.Picture.Bitmap);

im1.Repaint;

end;

procedure TMainForm.Im1MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(1, im1.Picture.Bitmap);

im1.Repaint;

end;

procedure TMainForm.Im1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(1, im1.Picture.Bitmap);

im1.Repaint;

end;

procedure TMainForm.Im6Click(Sender: TObject);

begin

OnFind;

end;

procedure TMainForm.Im6MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(6, im6.Picture.Bitmap);

im6.Repaint;

end;

procedure TMainForm.Im6MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(6, im6.Picture.Bitmap);

im6.Repaint;

end;

procedure TMainForm.Im6MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(6, im6.Picture.Bitmap);

im6.Repaint;

end;

procedure TMainForm.Im6MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(6, im6.Picture.Bitmap);

im6.Repaint;

end;

procedure TMainForm.Im7Click(Sender: TObject);

begin

OnRenameRecept;

end;

procedure TMainForm.Im7MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(7, im7.Picture.Bitmap);

im7.Repaint;

end;

procedure TMainForm.Im7MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(7, im7.Picture.Bitmap);

im7.Repaint;

end;

procedure TMainForm.Im7MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(7, im7.Picture.Bitmap);

im7.Repaint;

end;

procedure TMainForm.Im7MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(7, im7.Picture.Bitmap);

im7.Repaint;

end;

procedure TMainForm.Im8Click(Sender: TObject);

begin

OnRenameCat;

end;

procedure TMainForm.Im8MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgclick.GetBitmap(8, im8.Picture.Bitmap);

im8.Repaint;

end;

procedure TMainForm.Im8MouseEnter(Sender: TObject);

begin

imgon.GetBitmap(8, im8.Picture.Bitmap);

im8.Repaint;

end;

procedure TMainForm.Im8MouseLeave(Sender: TObject);

begin

imgnorm.GetBitmap(8, im8.Picture.Bitmap);

im8.Repaint;

end;

procedure TMainForm.Im8MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

imgnorm.GetBitmap(8, im8.Picture.Bitmap);

im8.Repaint;

end;

procedure TMainForm.lClick(Sender: TObject);

begin

OnSelectRecept;

end;

procedure TMainForm.lDblClick(Sender: TObject);

begin

OnEdit;

end;

procedure TMainForm.lKeyPress(Sender: TObject; var Key: Char);

begin

if key = #13 then

OnEdit;

end;

procedure TMainForm.MemoEnter(Sender: TObject);

begin

Memo.Color := m_clCream;

end;

procedure TMainForm.MemoExit(Sender: TObject);

begin

memo.Color := m_cl3DLight;

end;

procedure TMainForm.N10Click(Sender: TObject);

begin

OnFind;

end;

procedure TMainForm.N11Click(Sender: TObject);

begin

OnSaveToFile;

end;

procedure TMainForm.N12Click(Sender: TObject);

begin

OnAddCategory;

end;

procedure TMainForm.N13Click(Sender: TObject);

begin

OnDeleteCategory;

end;

procedure TMainForm.N14Click(Sender: TObject);

begin

OnRenameRecept;

end;

procedure TMainForm.N15Click(Sender: TObject);

begin

OnOpenFromFile;

end;

procedure TMainForm.N16Click(Sender: TObject);

begin

OnRenameCat;

end;

procedure TMainForm.N18Click(Sender: TObject);

begin

ZastFormN.run;

end;

procedure TMainForm.N19Click(Sender: TObject);

begin

OnNewRec;

end;

procedure TMainForm.N20Click(Sender: TObject);

begin

OnEdit;

end;

procedure TMainForm.N21Click(Sender: TObject);

begin

OnDelete;

end;

procedure TMainForm.N22Click(Sender: TObject);

begin

OnRenameRecept;

end;

procedure TMainForm.N23Click(Sender: TObject);

begin

OnMoveToCat;

end;

procedure TMainForm.N24Click(Sender: TObject);

begin

OnCopyToCat;

end;

procedure TMainForm.N25Click(Sender: TObject);

begin

OnSaveToFile;

end;

procedure TMainForm.N26Click(Sender: TObject);

begin

OnOpenFromFile;

end;

procedure TMainForm.N27Click(Sender: TObject);

begin

OnFind;

end;

procedure TMainForm.N2Click(Sender: TObject);

begin

close;

end;

procedure TMainForm.N3Click(Sender: TObject);

begin

n6.Enabled := l.Items.Count > 0;

n7.Enabled := l.Items.Count > 0;

n8.Enabled := l.Items.Count > 0;

n9.Enabled := l.Items.Count > 0;

n14.Enabled := l.Items.Count > 0;

n11.Enabled := l.Items.Count > 0;

end;

procedure TMainForm.N5Click(Sender: TObject);

begin

OnNewRec;

end;

procedure TMainForm.N6Click(Sender: TObject);

begin

OnEdit;

end;

procedure TMainForm.N7Click(Sender: TObject);

begin

OnDelete;

end;

procedure TMainForm.N8Click(Sender: TObject);

begin

OnMoveToCat;

end;

procedure TMainForm.N9Click(Sender: TObject);

begin

OnCopyToCat;

end;

procedure TMainForm.SpeedButton5Click(Sender: TObject);

begin

OnSaveToFile;

end;

procedure TMainForm.CatCBChange(Sender: TObject);

begin

OnSelectCat;

OnSelectRecept;

end;

procedure TMainForm.FillCatCB;

var

db : tdb;

i, rn, m_ID : longint;

m_Name : string;

begin

CatCB.Clear;

db.InitializeLocal;

db.OpenDatabase(m_CatDBFilename, true);

for i := 1 to db.RecordCount do

begin

m_ID := db.DirectReadLong(i, 1);

m_Name := alltrim(db.DirectReadString(i, 2));

CatCB.Items.AddObject(m_Name, TObject(m_ID));

end;

if CatCB.Items.Count > 0 then

catCB.ItemIndex := 0;

db.DBClose;

if CatCB.Items.Count > 0 then

OnSelectCat;

end;

procedure TMainForm.OnSelectCat;

var

db : tdb;

i, rn, m_CatID, m_RecID : longint;

m_Name : string;

m_BadList : TList;

begin

m_BadList := TList.Create;

l.Clear;

m_CurCatID := longint(CatCB.Items.Objects[CatCB.ItemIndex]);

db.InitializeLocal;

db.OpenDatabase(m_RecDBFilename);

for i := 1 to db.RecordCount do

begin

m_CatID := db.DirectReadLong(i, 2);

if m_CatID <> m_CurCatID then

continue;

m_RecID := db.DirectReadLong(i, 1);

m_name := alltrim(db.DirectReadString(i, 3));

if fileExists(m_DataFolder + along2str(m_RecID) + '.rec') then

l.AddItem(m_name, TObject(m_RecID))

else

m_BadList.Add(TObject(i));

end;

if l.Items.Count > 0 then

l.Itemindex := 0;

OnSelectRecept;

if m_BadList.Count > 0 then

for I := m_BadList.Count - 1 to 0 do

tdb_lib.PhisicalDeleteRecordLocalInDB(db, longint(m_BadList[i]));

db.DBClose;

m_BadList.Clear;

m_BadList.Free;

end;

procedure TMainForm.OnSelectRecept;

var

filename : string;

begin

if l.ItemIndex < 0 then

begin

memo.Clear;

m_curRecID := -1;

exit;

end;

m_curRecID := longint(l.Items.Objects[l.ItemIndex]);

Memo.Clear;

filename := m_DataFolder + along2str(m_curRecID) + '.rec';

memo.Lines.LoadFromFile(filename);

end;

procedure TMainForm.PopupMenu1Popup(Sender: TObject);

begin

n20.Enabled := l.Items.Count > 0;

n21.Enabled := l.Items.Count > 0;

n22.Enabled := l.Items.Count > 0;

n23.Enabled := l.Items.Count > 0;

n24.Enabled := l.Items.Count > 0;

n25.Enabled := l.Items.Count > 0;

end;

procedure TMainForm.OnDelete;

var

m_curIndex : longint;

begin

if (l.Items.Count < 1) then

begin

askdialog.Run('В категорії "' + CatCB.Items[CatCB.itemindex] + '" рецепти відсутні', false, false, true, false);

exit;

end;

if l.ItemIndex < 0 then

begin

askdialog.Run('Не вибрано жодного рецепту', false, false, true, false);

exit;

end;

AskDialog.Run('Ви дійсно хочете видалити рецепт "'+ l.Items[l.Itemindex]+'"?', true, true, false, false);

if AskDialog.m_SelectedItem <> 1 then

exit;

m_Curindex := l.ItemIndex;

DeleteRecept(m_curRecID);

OnSelectCat;

TrySelectItemInLB(l, m_curindex);

OnSelectRecept;

end;

procedure TMainForm.DeleteRecept(recID : longint);

var

i, rn : longint;

db : tdb;

begin

db.InitializeLocal;

db.OpenDatabase(m_RecDBFilename);

rn := tdb_lib.SeekForLong(db, 1, recID, true);

PhisicalDeleteRecordLocalInDB(db, rn);

EraseFileLocal(m_DataFolder + along2str(recID)+'.rec');

db.DBClose;

end;

procedure TMainForm.OnDeleteCategory;

var

db : tdb;

rn, catid, recid, i, index : longint;

begin

if CatCB.Items.Count < 2 then

begin

AskDialog.Run('Неможливо видалити категорію "' + CatCB.Items[CatCB.itemindex] +'".' + #13 +

'Після видалення повинна залишитись хоча б одна категорія.', false, false, true, false);

exit;

end;

if l.Count > 0 then

Askdialog.Run('Категорія "' + CatCB.Items[CatCB.itemindex] + '" не пуста!!!' + #13 +

'Видаляючи її, ви видалите всі рецепти,' +#13 +

'що знаходяться в даній категорії. Продовжити?',true, true, false, true)

else

Askdialog.Run('Ви дійсно хочете видалити категорію "' + CatCB.Items[CatCB.itemindex] + '"?' ,true, true, false, true);

if AskDialog.m_SelectedItem <> 1 then

exit;

db.InitializeLocal;

db.OpenDatabase(self.m_RecDBFilename);

for i := db.RecordCount downto 1 do

begin

catid := db.DirectReadLong(i, 2);

if catid <> self.m_CurCatID then

continue;

recid := db.DirectReadLong(i, 1);

PhisicalDeleteRecordLocalInDB(db, i);

EraseFileLocal(m_DataFolder + along2str(recID)+'.rec');

end;

db.DBClose;

db.OpenDatabase(self.m_CatDBFilename);

rn := tdb_lib.SeekForLong(db, 1, self.m_CurCatID , false);

PhisicalDeleteRecordLocalInDB(db, rn);

db.DBClose;

index := CatCB.ItemIndex;

FillCatCB;

TryToSelectInCombo(CatCB, index);

OnSelectCat;

end;

procedure TMainForm.OnAddCategory;

var

db : tdb;

sName, sNewName : string;

rn, id, i : longint;

begin

sNewName := GetTextByTemplate(CatCB.Items, 'Категорія', false);

EditTextForm.run('Введіть назву нової категорії', sNewName, false, 50, nil, false,

'',false,'',#0,'Назва нової категорії');

if not EditTextForm.m_IsEntered then

exit;

db.InitializeLocal;

db.OpenDatabase(self.m_CatDBFilename);

sName := alltrim(EditTextForm.Edit1.Text);

rn := SeekForString(db, 2, sName, false, true, true);

if rn > 0 then

begin

AskDialog.Run('Категорія з такою назвою вже існує.' + #13 + 'Створення неможливе', false, false, true, false);

DB.DBClose;

exit;

end;

rn := db.RecordCount + 1;

id := CalcMaxLongValue(db, 1) + 1;

db.DirectWriteLong(rn, 1, id);

db.DirectWriteString(rn, 2, sName);

db.DBClose;

FillCatCB;

CatCB.ItemIndex := CatCB.Items.Count - 1;

OnSelectCat;

end;

procedure TMainForm.OnMoveToCat;

var

index, id, rn : longint;

db : tdb;

begin

if l.ItemIndex < 0 then

begin

AskDialog.Run('Не вибрано жодного рецепту для переміщення!', false, false, true, false);

exit;

end;

if CatCB.Items.Count = 1 then

begin

AskDialog.Run('У вас є всього одна категорія!' + #13 +

'Переміщення в іншу категорію неможливе.', false, false, true, false);

exit;

end;

SimpleSelectInListboxFOrm.L.Clear;

CopyStrings(CatCB.Items,SimpleSelectInListBoxForm.L.Items);

SimpleSelectInListboxFOrm.Run('Категорія, в яку перемістити рецепт', false, false,

'', false, true, CatCB.ItemIndex);

if not SimpleSelectInListboxFOrm.m_IsSelected then

exit;

index := SimpleSelectInListboxFOrm.L.ItemIndex;

if index = CatCB.ItemIndex then

begin

AskDialog.Run('Рецепт вже знаходиться в категорії ' + '"' + CatCB.Items[CatCB.itemindex] + '".', false, false, true, false);

exit;

end;

id := longint(CatCB.Items.Objects[index]);

db.InitializeLocal;

db.OpenDatabase(self.m_RecDBFilename);

rn := SeekForLong(db, 1, self.m_curRecID, false);

db.DirectWriteLong(rn, 2, id);

db.DBClose;

CatCB.ItemIndex := index;

OnSelectCat;

end;

procedure TMainForm.OnEdit;

var

m_CurRec : longint;

begin

if l.Items.count < 1 then

begin

askdialog.Run('Рецепти відсутні в категорії "' + CatCB.Items[CatCB.itemindex] + '"!', false, false, true, false);

exit;

end;

m_CurRec := l.ItemIndex;

RecEditorForm.run(m_curRecID, CatCB.ItemIndex, l.Items[l.itemindex]);

if not RecEditorForm.m_isEntered then

exit;

OnSelectCat;

l.ItemIndex := m_CurRec;

OnSelectRecept;

end;

procedure TMainForm.OnNewRec;

begin

RecEditorForm.run(-1, CatCB.ItemIndex);

if not RecEditorForm.m_isEntered then

exit;

CATcb.ItemIndex := RecEditorForm.cb.ItemIndex;

OnSelectCat;

l.ItemIndex := l.Items.Count - 1;

OnSelectRecept;

end;

procedure OnSelectReceptWithID(recID: Integer; CatID: longint);

var

index : longint;

begin

index := FindObjectInComboBox(MainForm.CatCB, CatID);

MainForm.CatCB.ItemIndex := index;

MainForm.OnSelectCat;

index := FindObjectInLB(MainForm.l, RecID);

MainForm.l.ItemIndex := index;

MainForm.OnSelectRecept;

end;

procedure TMainForm.OnFind;

begin

SearchInStringsForm.RunForDB('Пошук рецепта', self.m_RecDBFilename, 3, 1, 2, OnSelectReceptWithID);

end;

procedure TMainForm.OnSaveToFile;

var

sFilename : string;

sExt : string;

begin

if l.ItemIndex < 0 then

begin

AskDialog.Run('Спочатку виберіть рецепт для збереження',false, false, true, false);

exit;

end;

SaveDialog1.filename := GetStandartFolder($0005) + '\' + l.Items[l.itemindex];

if not SaveDialog1.Execute then

exit;

sFilename := SaveDialog1.FileName;

sExt := mylib.GetExtentionFromName(sFilename);

if sExt = '' then

sFilename := sFilename + '.txt';

Memo.Lines.SaveToFile(sFilename);

AskDialog.Run('Файл успішно збережено',false, false, true, false);

end;

procedure TMainForm.OnCopyToCat;

var

index, id, rn, rn2, id2 : longint;

db : tdb;

x : TStrings;

sNewName : string;

filnm1, filnm2 : string;

begin

if l.ItemIndex < 0 then

begin

AskDialog.Run('Не вибрано жодного рецепту для копіювання!', false, false, true, false);

exit;

end;

SimpleSelectInListboxFOrm.L.Clear;

CopyStrings(CatCB.Items,SimpleSelectInListBoxForm.L.Items);

SimpleSelectInListboxFOrm.Run('Категорія, в яку скопіювати рецепт', false, false,

'', false, true, CatCB.ItemIndex);

if not SimpleSelectInListboxFOrm.m_IsSelected then

exit;

index := SimpleSelectInListboxFOrm.L.ItemIndex;

if index = CatCB.ItemIndex then

begin

AskDialog.Run('Рецепт вже знаходиться в категорії "' + CatCB.Items[CatCB.itemindex] + ' ".' +#13 +

'Зробити ще одну копію в цій категорії?', true, true, false, false);

if AskDialog.m_SelectedItem <> 1 then

exit;

end;

x := TStringList.Create;

db.InitializeLocal;

db.OpenDatabase(self.m_RecDBFilename);

FillStringsInDBToStirngs(x, MainForm.m_RecDBFilename, 3);

sNewName := mylib.GetTextByTemplate(x, 'Копія-'+ l.Items[l.itemindex], true);

x.Free;

EditTextForm.run('Введіть назву копії рецепту', sNewName, false, 50, nil, false,

'',false,'',#0,'Назва рецепту');

if not EditTextForm.m_IsEntered then

begin

db.DBClose;

exit;

end;

sNewName := alltrim(EditTextForm.Edit1.Text);

rn := tdb_lib.SeekForString(db, 3, sNewName, false, true, true);

if (rn > 0) and (length(sNewName) > 0) then

begin

askdialog.run('Неможливо зберегти рецепт.'+#13+'Рецепт з такою назвою вже існує!', false, false, true, false);

db.DBClose;

exit;

end;

id := longint(CatCB.Items.Objects[index]);

id2 := CalcMaxLongValue(db, 1) + 1;

rn2 := db.RecordCount + 1;

db.DirectWriteLong(rn2, 1, id2);

db.DirectWriteLong(rn2, 2, id);

db.DirectWriteString(rn2, 3, sNewName);

filnm1 := m_DataFolder + along2str(m_currecID) + '.rec';

filnm2 := m_DataFolder + along2str(id2) + '.rec';

db.DBClose;

xcopyfile(filnm1, filnm2);

CatCB.ItemIndex := index;

OnSelectCat;

end;

procedure TMainForm.OnOpenFromFile;

var

sFilename : string;

begin

OpenDialog1.DefaultExt := GetStandartFolder($0005);

if not OpenDialog1.Execute then

exit;

sFilename := OpenDialog1.FileName;

RecEditorForm.run(-1, CatCB.ItemIndex, '', sFilename);

if not RecEditorForm.m_isEntered then

exit;

CATcb.ItemIndex := RecEditorForm.cb.ItemIndex;

OnSelectCat;

l.ItemIndex := l.Items.Count - 1;

OnSelectRecept;

end;

procedure TMainForm.OnRenameCat;

var

db : tdb;

sName, sNewName : string;

rn, id, index, index2 : longint;

begin

sName := CatCB.Items[CatCB.Itemindex];

EditTextForm.run('Введіть нову назву категорії', sName, false, 50, nil, false,

'',false,'',#0,'Назва категорії');

if not EditTextForm.m_IsEntered then

exit;

sNewName := alltrim(EditTextForm.Edit1.Text);

if sNewName = sName then

exit;

db.InitializeLocal;

db.OpenDatabase(self.m_CatDBFilename);

rn := SeekForString(db, 2, sNewName, false, true, true);

if rn > 0 then

begin

AskDialog.Run('Категорія з такою назвою вже існує.' + #13 + 'Перейменування неможливе', false, false, true, false);

DB.DBClose;

exit;

end;

rn := SeekForLong(db, 1, m_CurCatID, false);

db.DirectWriteString(rn, 2, sNewName);

db.DBClose;

index := CatCB.ItemIndex;

index2 := l.ItemIndex;

FillCatCB;

CatCB.ItemIndex := index;

l.ItemIndex := index2;

OnSelectRecept;

end;

procedure TMainForm.OnRenameRecept;

var

db : tdb;

sName, sNewName : string;

rn, id, i : longint;

begin

if l.ItemIndex < 0 then

begin

askdialog.Run('Не вибрано жодного рецепту', false, false, true, false);

exit;

end;

sName := l.Items[l.Itemindex];

EditTextForm.run('Введіть нову назву рецепту', sName, false, 50, nil, false,

'',false,'',#0,'Назва рецепту');

if not EditTextForm.m_IsEntered then

exit;

sNewName := alltrim(EditTextForm.Edit1.Text);

if sNewName = sName then

exit;

db.InitializeLocal;

db.OpenDatabase(self.m_RecDBFilename);

rn := SeekForString(db, 3, sNewName, false, true, true);

if rn > 0 then

begin

AskDialog.Run('Рецепт з такою назвою вже існує.' + #13 + 'Перейменування неможливе', false, false, true, false);

DB.DBClose;

exit;

end;

rn := SeekForLong(db, 1, m_CurRecID, false);

db.DirectWriteString(rn, 3, sNewName);

db.DBClose;

l.Items[l.ItemIndex] := sNewName;

end;

procedure TMainForm.ApplyNormColorsOverRGB;

begin

panel3.Color := RGB(196, 203, 222);

panel2.Color := RGB(196, 203, 222);

panel1.Color := RGB(192, 192, 192);

m_cl3Dlight := RGB(227, 227, 227);

m_ClCream := RGB(255, 251, 240);

l.Color := m_cl3Dlight;

Memo.Color := m_cl3Dlight;

CatCB.Color := m_cl3Dlight;

end;

end.

RECINTERFACEUNIT.PAS

unit RecInterfaceUnit;

interface

procedure CreateCatDataBase(filename : string);

procedure CreateRecDataBase(filename : string);

implementation

uses tdb_lib;

procedure CreateCatDataBase(filename : string);

var

db : tdb;

begin

db.InitializeLocal;

db.DBSetName(filename);

db.AddField('ID ','l', 4, 0);

db.AddField('name ','c', 40, 0);

db.DBCreate;

db.DBClose;

end;

procedure CreateRecDataBase(filename : string);

var

db : tdb;

begin

db.InitializeLocal;

db.DBSetName(filename);

db.AddField('ID ','l', 4, 0);

db.AddField('CatID ','l', 4, 0);

db.AddField('name ','c', 50, 0);

db.DBCreate;

db.DBClose;

end;

end.

RECEDITORFORMUNIT.PAS

unit RecEditorFormUnit;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Buttons, StdCtrls, ExtCtrls, ComCtrls, tdb_lib, askdialogunit;

type

TRecEditorForm = class(TForm)

StatusBar1: TStatusBar;

Panel1: TPanel;

e1: TEdit;

cb: TComboBox;

Panel2: TPanel;

Panel3: TPanel;

Label1: TLabel;

Label3: TLabel;

Memo: TMemo;

im1: TImage;

Im2: TImage;

procedure cancelbutClick(Sender: TObject);

procedure FormKeyPress(Sender: TObject; var Key: Char);

procedure MemoChange(Sender: TObject);

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

procedure FormShow(Sender: TObject);

procedure MemoEnter(Sender: TObject);

procedure MemoExit(Sender: TObject);

procedure e1Enter(Sender: TObject);

procedure e1Exit(Sender: TObject);

procedure im1Click(Sender: TObject);

procedure im1MouseEnter(Sender: TObject);

procedure im1MouseLeave(Sender: TObject);

procedure im1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure im1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im2Click(Sender: TObject);

procedure Im2MouseEnter(Sender: TObject);

procedure Im2MouseLeave(Sender: TObject);

procedure Im2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Im2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private

{ Private declarations }

public

m_ID : longint;

m_cbindex : longint;

m_catID : longint;

m_editMode : boolean;

m_filename : string;

m_recName : string;

m_isEntered : boolean;

m_recfilename : string;

m_NeedToSave : boolean;

m_isBlocked : boolean;

m_cl3dLight : TColor;

m_clCream : TColor;

procedure run (recID : longint = -1; m_index : longint = -1; m_name : string = ''; filename : string = '');

procedure FillCombobox;

procedure FillMemo;

procedure OnSave;

function StatusText : string;

procedure OnChange;

function OnExit : boolean;

procedure ApplyNormColorsOverRGB;

end;

var

RecEditorForm: TRecEditorForm;

implementation

uses MainFormUnit, MyLib;

{$R *.dfm}

procedure TRecEditorForm.run(recID: longint = -1; m_index : longint = -1; m_name : string = ''; filename : string = '');

var

x : TStrings;

sdefName : string;

n : longint;

begin

m_isBlocked := false;

e1.Clear;

Memo.Clear;

m_recfilename := filename;

m_id := recID;

m_cbindex := m_index;

if (m_ID = -1) then

m_editMode := false

else

m_editMode := true;

if length(filename) > 0 then

begin

sDefName := mylib.GetFileNameFromFilePath(filename);

n := RevFindChar('.', sDefName);

if n > 0 then

sDefName := copy(sDefName, 1, n-1);

e1.text := sDefName;

end

else

if not m_editMode then

begin

x := TStringList.Create;

FillStringsInDBToStirngs(x, MainForm.m_RecDBFilename, 3);

sDefName := mylib.GetTextByTemplate(x, 'Рецепт');


Подобные документы

  • Проектування бази даних та інтерфейсу програми. Розробка бази даних за допомогою Firebird 2.5. Контроль коректності вхідних та вихідних даних. Додавання та редагування інформації. Вплив електронно-обчислювальних машин на стан здоров'я користувачів.

    дипломная работа [4,7 M], добавлен 12.10.2015

  • Аналіз предметної області. Розробка бази даних в середовищі Microsoft SQL Server 2008. Можливості інформаційної системи. Установка зв'язків між таблицями. Створення запитів для роботи з даними (введення, видалення, редагування) та пошуку інформації.

    курсовая работа [2,6 M], добавлен 09.05.2016

  • Написання програм для перейменування файлів та копіювання файлів і підкаталогів (аналоги REN, XCOPY). Вибір методу розв'язки задачі та його обґрунтування. Алгоритм та реалізація програми, її системні вимоги. Інструкція для користувача та лістинг.

    курсовая работа [14,7 K], добавлен 08.08.2009

  • Аналіз проектування баз даних та створення програми на тему IC "Туристичні агентства". Розробка простого для розуміння інтерфейсу, огляд реалізації додавання, редагування, видалення, пошуку інформації. Характеристика задач автоматизації і фізичної моделі.

    курсовая работа [4,1 M], добавлен 12.01.2012

  • MS-DOS - перша операційна система. Створення в операційній системі MS-DOS резидентної програми захисту файлів від видалення, її використання в випадках захисту файлів від випадкового видалення. Структура вхідних та вихідних даних, алгоритм рішення задачі.

    курсовая работа [35,5 K], добавлен 16.11.2012

  • Розробка структури бази даних. ER-моделі предметної області. Проектування нормалізованих відношень. Розробка форм, запитів, звітів бази даних "Автосалон". Тестування роботи бази даних. Демонстрація коректної роботи форми "Додавання даних про покупців".

    курсовая работа [4,0 M], добавлен 02.12.2014

  • Проектування інтерфейсу програми. Вимоги до продукту. Вхідні дані на розробку автоматизованої системи. Вибір середовища програмування. Розробка структури бази даних. Функціональна та логічна структура програми. Розробка структури таблиць бази даних.

    курсовая работа [43,1 K], добавлен 30.06.2015

  • Основні дії з файлами, які використовують програми. Диски і файли. Особливості використання даних, збережених на диску. Дискова фізична модель бази даних. Управління дисковим простором. Управління буферами даних. Стратегія заміни сторінок у фреймах.

    реферат [19,8 K], добавлен 10.08.2011

  • Методи управління папками в ОС Windows. Особливості створення, копіювання або переміщення через буфер обміну, за допомогою правої кнопки миші, методом перетаскування. Алгоритм перейменування та видалення папки (за допомогою кнопок панелі інструментів).

    презентация [390,9 K], добавлен 29.01.2010

  • Постановка задачі та визначення її функціоналу: записи в файл бази, їх перегляд та редагування, видалення та використання. Формування коду програми з основного коду і процедур, що ведуть облік у базі даних абонентів та оплат за комунальні послуги.

    курсовая работа [237,7 K], добавлен 12.01.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.