Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Ініціалізація програми
Раніше ми багато разів розглядали послідовність ініціалізації, що має місце у функції ініціалізації СWinApp:: InitInstance() програми. Для програми, що створюється в межах концепції “Документ – вигляд”, ця функція має дещо іншу структуру. Це показує приклад 9.5.
Приклад 9.5 – Визначення функції ініціалізації для проектів, відповідних концепції “Документ – вигляд”
BOOL CApp:: InitInstance() { SetDialogBkColor(); // встановлення кольору фону вікна (стандартно – сірий колір) LoadStdProfileSettings(); // завантаження стандартного файла ініціалізаціїCSingleDocTemplate* pDocTemplate; // оголошення шаблону документа pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CSampleDoc), RUNTIME_CLASS(CMainFrame), // основне рамкове вікно SDI RUNTIME_CLASS(CSampleView)); AddDocTemplate(pDocTemplate); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (! ProcessShellCommand(cmdInfo)) return FALSE; m_pMainWnd-> ShowWindow(SW_SHOW); m_pMainWnd-> UpdateWindow(); return TRUE; }
9.3 Збереження та завантаження документів Клас CObject містить функцію Serialize(), що автоматично викликається під час збереження або завантаження документа. Клас CArchive забезпечує автоматизацію функцій обробки файлів та містить перевантажені операції введення-виведення у вигляді операцій уставлення у потік та вибирання з потоку: “> > ” та “< < ”. При цьому сама функція серіалізації має такий прототип:virtual void CObject:: Serialize(CArchive& ar);
Параметр ar є об’єктом типу CArchive, що є потоком серіалізації. Функція Serialize() має перевизначатися для кожного класу, що має на меті операції введення-виведення. Перевизначена функція серіалізації має насамперед викликати свого аналога, визначеного у базовому класі. Для реалізації серіалізації у визначенні класу використовують макрос DECLARE_SERIAL() і макрос IMPLEMENT_SERIAL() у файлі реалізації функцій. Для перевірки знаходження файлів у стані завантаження або збереження використовують функції: CArchive:: IsLoading() та CArchive:: IsStoring(). Їх прототипи мають вигляд:
BOOL CArchive:: IsLoading(); BOOL CArchive:: IsStoring();
Дані функції повертають ненульове значення у випадку, коли відбувається завантаження (збереження) і нульове значення, коли такі операції не здійснюються. Всередині функцій серіалізації функції IsLoading() та IsStoring() використовуються з метою перевірок стану процесів, наприклад:
void CAge:: Serialize(CArchive& ar) { CObject:: Serialize(ar); if(ar.IsStoring()) ar < < m_years; else ar > > m_years; }
9.4 Особливості функцій класів CDocument та CView
Об’єкти класу CDocument є частиною набору команд маршрутизації і, отже, отримують команди від стандартних компонентів інтерфейсу користувача, наприклад пункту меню “File Save”. За допомогою цього способу відкритий документ одержує команди, відправлені активним об’єктом вигляду. Якщо документ не обробляє поточну команду, він переправляє команду до шаблону документа, який і забезпечує керування. Коли дані документа змінюються, кожен з його станів вигляду має відображати зазначені модифікації. Клас CDocument містить спеціальну функцію UpdateAllViews(), яка повідомляє стани вигляду про зміни, що наступили, і, таким чином, ці стани мають змогу змінюватися. В аналогічний спосіб користувач за допомогою цієї ж функції запитується чи слід модифікувати файл перед закриттям. Функція UpdateAllViews() повідомляє усі об’єкти вигляду про зміни у документі і має такий прототип:
void CDocument:: UpdateAllViews(CView* pSender, LPARAM lHint= 0L, CObject* pHint = NULL);
Параметрами функції є: pSender – покажчик на об’єкт вигляду, що забезпечує зміну документа або NULL, якщо усі об’єкти вигляду мають змінитися; lHint – містить інформацію про зміни, що настали; pHint – покажчик на об’єкт, що зберігає інформацію про зміни. Функція SetModifiedFlag() встановлює прапорець, який показує, що документ змінювався з моменту останнього збереження.
void CDocument:: SetModifiedFlag (BOOL bModified = TRUE);
Єдиний параметр: bModified – прапорець, який вказує чи змінювався документ. Наступний клас CView забезпечує основні функціональні можливості визначених програмістом класів вигляду. Об’єкт вигляду приєднується до документа і діє як посередник між документом і користувачем: вигляд виконує відображення документа на екрані і інтерпретує операції введення користувача у якості операцій з документом. Об’єкт вигляду також здійснює відображення і документа для його подальшого перегляду перед друком і для самого друку. Однією з найбільш корисних класу є функція GetDocument(). Вона повертає покажчик на об’єкт типу CDocument, зв'язаний з об’єктом вигляду і NULL якщо вигляд не є приєднаним до документа. Її прототип:
CDocument *CView:: GetDocument (); Якщо у спосіб, описаний у підрозділі 9.3 реалізувати програму, що підтримуватиме концепцію “Документ – вигляд” (із використанням MFC Application Wizard), можна отримати програму, показану у прикладі 9.6. Від програми, що автоматично створюватиметься MFC Application Wizard вона відрізнятиметься відсутністю коментарів та де-яких оголошених “про всяк випадкок” параметрів. Звичайно, за бажанням кожен може відтворити проект MFC Application Wizard, але наводити його у посібнику немає потреби – кожен має змогу побудувати такий проект власноруч. Його вміст повністю залежатиме від опцій, що встановлюються під час виконання майстра побудови проектів. Зазначимо, що вміст програми не є зразком прозорості, особливо з точки зору запуску програми, що відбувається у функції InitInstance().
Приклад 9.6 – Приклад програми, створеної за допомогою Application Wizard
// MainFrm.h: interface of the CMainFrame class
class CMainFrame: public CFrameWnd {protected: CMainFrame(); DECLARE_DYNCREATE(CMainFrame) public: virtual ~CMainFrame(); protected: DECLARE_MESSAGE_MAP() };
class CSampleApp: public CWinApp {public: CSampleApp(); virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() };
class CSampleDoc: public CDocument {protected: CSampleDoc(); DECLARE_DYNCREATE(CSampleDoc) public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); virtual ~CSampleDoc(); protected: DECLARE_MESSAGE_MAP() };
class CSampleView: public CView {protected: CSampleView(); DECLARE_DYNCREATE(CSampleView) public: CSampleDoc* GetDocument(); virtual void OnDraw(CDC* pDC); virtual ~CSampleView(); protected: DECLARE_MESSAGE_MAP() };
// MainFrm.cpp: implementation of the CMainFrame class #include < afxwin.h> #include " MainFrm.h" #include " resource.h"
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) END_MESSAGE_MAP()
CMainFrame:: CMainFrame(){ } CMainFrame:: ~CMainFrame(){ }
BEGIN_MESSAGE_MAP(CSampleApp, CWinApp) ON_COMMAND(ID_FILE_NEW, CWinApp:: OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp:: OnFileOpen) END_MESSAGE_MAP()
CSampleApp:: CSampleApp(){ }
CSampleApp theApp;
CSampleDoc:: CSampleDoc(){ } CSampleDoc:: ~CSampleDoc(){ }
BOOL CSampleApp:: InitInstance() { CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CSampleDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CSampleView)); AddDocTemplate(pDocTemplate); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (! ProcessShellCommand(cmdInfo)) return FALSE; m_pMainWnd-> ShowWindow(SW_SHOW); m_pMainWnd-> UpdateWindow(); return TRUE; }
IMPLEMENT_DYNCREATE(CSampleDoc, CDocument)
BEGIN_MESSAGE_MAP(CSampleDoc, CDocument) END_MESSAGE_MAP()
BOOL CSampleDoc:: OnNewDocument() { if (! CDocument:: OnNewDocument()) return FALSE; return TRUE; }
void CSampleDoc:: Serialize(CArchive& ar) { if (ar.IsStoring()) { } else { } }
IMPLEMENT_DYNCREATE(CSampleView, CView)
BEGIN_MESSAGE_MAP(CSampleView, CView) END_MESSAGE_MAP() CSampleView:: CSampleView(){ } CSampleView:: ~CSampleView(){ }
void CSampleView:: OnDraw(CDC* pDC) { CSampleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); }
CSampleDoc* CSampleView:: GetDocument() { ASSERT(m_pDocument-> IsKindOf(RUNTIME_CLASS(CSampleDoc))); return (CSampleDoc*)m_pDocument; } 9.5 Стандартні ідентифікатори команд, що використовуються у кон-цепції “Документ – вигляд” Для кожного командного ідентифікатора програми існує стандартний рядок повідомлення, що знаходиться у файлі PROMPTS.RC. Ідентифікатор рядка меню має мати те саме значення, що й ідентифікатор команди. Таблиця 9.1 містить стандартні значення ідентифікаторів і відповідні ним виклики функцій.
Таблиця 9.1 – Стандартні ідентифікатори та відповідні ним функції
9.6 Контрольні завдання
1. Пояснити особливості організації класів програми, побудованій відповідно концепції “Документ-Вигляд”. 2. Пояснити принципи реалізації динамічного створення об’єктів. 3. Пояснити термін “серіалізація”. 4. Побудувати проект типу “MFC AppWizard (exe)” та пояснити його складові.
|