Кулінарна книга
Розробка програми, яка зможе групувати кулінарні рецепти в категорії, забезпечить запис нових рецептів, видалення будь-якого рецепту (одночасно з бази даних і з диску). Редагування рецепту, його перейменування, переміщення, копіювання до іншої категорії.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 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.2012MS-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