![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Графік викладачів водіння
Даний розділ необхідний для організації графіка навчання водінню майстрами виробничого навчання. Що б зробити графік зручним додамо на форму стандартний компонент – MonthCalendar. Він дозволить в зручному вигляді працювати з календарем на місяць (рис. 3.13).
Рис. 3.13 Графік роботи майстрів.
Крім MonthCalendar, на форму встановимо компонент DateTimePicker – зовні схожий на полі для редагування Edit, але зі встановленим фільтром значень у вигляді дат. Саме він буде джерелом для запиту, який вибиратиме, хто з учнів і на який час записаний на водіння. Таблиця zapis містить стовпець з id_mastera – кодом майстра, дату і 8 стовпців цілочисельних значень, кожне з яких – id_uchenika. Така модель небагато порушує загальні поняття нормалізації таблиць, але в нашому випадку зручність в роботі і програмуванні буде більшою, ніж спроби строго слідувати стандартам. У нашому випадку фізичне значення кортежу записів буде не одиничний випадок запису учня на водіння, а новий робочий день з учнями для навчання. Що б додати нового учня на водіння, необхідно: вказати дату на календарі; потім вибрати майстра, до якого бажає записатися учень; визначитися з часом, на яке може підійти учень і вибрати ФІО студента із списку. Розглянемо детальніше запит на отримання даних про запис студентів SELECT * FROM zapis where id_mastera=: id_mastera and data=: datas Як видно з тексту запиту, щоб вибрати один запис, нам потрібні дві змінні: код майстра і дата, на яку вироблявся запис. Для отримання даних ці змінні необхідно підставити в запит з різних джерел. Ці джерела – таблиця майстрів, в якій перераховані всі майстри і покажчик дати DateTimePicker1: Zapis.Close; // Закрити запит zapis.Parameters[0].Value: =masterid_mastera.AsInteger; // привласнити // першому параметру код майстра zapis.Parameters[1].Value: = // другому параметру привласнити zapis.Open; // виконати запит На рис. 3.16 показана діаграма даних і зв’язку між параметричними запитами. [8, 18]
Рис. 3.16 Відображення форми у вигляді діаграми.
Варто відзначити, що в Delphi є дві вкладки при роботі з формою: Code і Diagram. Code – відображення початкового коду, Diagram – схематичне зображення моделі даних, розташованих на формі у вигляді запитів і таблиць. При перенесенні таблиць з дерева об’єктів на діаграму будівник сам указує, які зв’язки між ними існують. Підготовка звітних форм Перед нами стоїть завдання експорту даних у форматі MS Word або MS Excel, то з чого треба почати? Текстовий процесор MS Word і табличний процесор MS Excel, що входять до складу MS Office, є СОМ-об’єктами. Це означає, що будь-яка програма, написана для сучасних версій Windows, може управляти цими об’єктами, якщо вона підтримує інтерфейс СОМ. Тонкощі механізму роботи цього чудового інтерфейсу описані в спеціальній літературі, а ми займемося об’єктами Word, Excel і документами, з якими вони працюють, оскільки вони також є об’єктами. Що б створити підключення необхідне підключити бібліотеку ComObj, Wodr97 і Excel97, оголосити змінну варіантного типу, і пов’язати її з Excel або Word командою CreateOleObject: VAR XL: Variant; BEGIN try XL: = CreateOleObject(‘Excel. Application’); Except Raise Exception. Create (‘Не можу запустити Excel’); End; Дані в Excel вивантажуються за допомогою звернення до конкретного осередку: XL.Cells[x, y].Value: =s; Змінна для вивантаження повинна мати текстовий формат, оскільки завантажуємо ми її в осередок Excel. Практично всі команди можна передавати в Excel у тому числі і команди настройки сторінки (висота, ширина, поля, колонтитули, формули) завдяки такій могутній взаємодії Object Pascal і Visual Basic необхідність в інших компонентних засобах висновку відсутня. На рис. 3.17 показана реалізація друку графіка роботи майстра. Весь графік на місяць не виводиться, а тільки ті дні, на які є запис, що дуже зручне для викладача.
Рис. 3.17 Графік роботи майстра водіння.
Запит необхідний для вибору всього графіка виглядає таким чином: вибрати всі записи з таблиці записів по конкретному майстру, де дата менше кінця місяця і більше початку, сортування по полю data. На рис. 3.18 представлений підсумок вибірки даних по такому запиту. Залишилося в циклі від 1 до 8 вибрати учнів за їх кодами.
Рис. 3.18 Результат запиту.
Але як набути значення із стовпців запиту в циклі? Я не дарма назви стовпців зробив відмінними тільки номером. Є в Delphi чудова функція FindComponent. Оскільки всі стовпці, по яких нам потрібно пройти в базі даних мають назви otchetstudent1… otchetstudent8, а компоненти які ми шукаємо, одного і того ж класу – TintegerField, значення кожного стовпця можна набути таким чином: TintegerField(FindComponent(‘otchetstudent’+IntToStr(i))).Value; Варто відзначити той факт, що формат дати при виконанні текстових запитів в різних базах даних формат дати може відрізнятися наприклад: Postgres: 2011-12-31 (YYYY-MM-DD) Access: 12/31/2011 (MM/DD/YYYY) Тому при підготовці текстових запитів необхідно користуватися функціями перетворення (DateToStr(), StrToDate()) і копіювання сopy()).[12]
4. РОЗРОБКА ПРОГРАМИ ТЕСТУВАННЯ
Для організації тестування необхідно розібратися з наступними механізмами: - облік часу (для тестування відводиться 20 хв. часу); - випадковий вибір білетів; - облік питань/відповідей учня; - підрахунок результатів тестування.
Облік часу Для організації обліку часу, скористаємося стандартним компонентом Timer(лічильник). Він спрацьовує через певні інтервали часу. Властивість «інтервал» встановлює через, скільки мілі секунд він спрацює. Значення Interval = 1000 означає, що він спрацює через 1 секунду. Тепер необхідно додати дві змінні, в яких зберігатимуться хвилини і секунди, що залишилися до кінця тестування: public { Public declarations } min, sec: integer; Для правильного відображення секунд і годинника у вигляді 01, 02…20 пишемо не складну функцію перетворення: function OdinToDva(x: integer): string; begin if Length(IntToStr(x))=1 then OdinToDva: =’0’+IntToStr(x) else OdinToDva: =IntToStr(x) end; Тепер необхідно написати обробник події OnTimer, яка виконується при спрацьовуванні таймера часу. Розглянемо його детально: procedure TForm1.Timer1Timer(Sender: Tobject); var i, prav_otvetov: integer; // Опис локальних змінних begin // Виводимо час у вигляді: 00: 00 за допомогою Label vremya.Caption: =OdinToDva(min)+’: ’+OdinToDva(sec);
if sec=0 then // Якщо закінчилася 1 хвилина Begin If (min=0) then // Якщо час вийшов – стоп іспит! Begin Timer1.Enabled: =false; // Відключаємо таймер prav_otvetov: =0; // Зануляєм кількість правильних відповідей for i: =1 to 20 do // Проходимося по масиву правильних відповідей // якщо відповідь не правильна кнопку з номером // позначаємо жирним шрифтом. Це потрібно // для того, щоб після здачі іспиту можна // було подивитися неправильні відповіді і // зробити для себе висновки. Begin Tbutton(FindComponent(‘Button’+IntToStr(i))).Enabled: =True; if pravilniy_otvet[i]=true then begin prav_otvetov: =prav_otvetov+1; Tbutton(FindComponent(‘Button’+IntToStr(i))).Font.Style: =[]; end else Tbutton(FindComponent(‘Button’+IntToStr(i))).Font.Style: = [fsBold]; end; Tbutton(FindComponent(‘Button’+IntToStr(i))).Enabled: =True; Application.MessageBox(‘Тестування завершене! ’, ’Вышло час.’, 0); Application.MessageBox(Pchar(‘Правильних відповідей: ’+IntToStr(prav_otvetov)), ’’, 0); Button21.Enabled: =false; // Відключаємо кнопки «Відповісти» Button22.Enabled: =false; // і «Пропустити» Abort; // Коли закінчується час я завершую тестування // і перериваю роботу процедури end; sec: =60; // Міняємо 1 хвилину на 60 секунд. Min: =min-1; // Зменшуємо час на 1 хвилину end; sec: =sec-1; // Зменшуємо на 1 секунду кожного разу при спрацьовуванні // таймера end; Якщо зобразити у вигляді алгоритму сам процес зворотного відліку вийде наступний алгоритм, представлений на рис. 4.1. На ньому добре видно, що кожного разу при спрацьовуванні таймера йде зменшення на 1 кількості секунд в глобальній змінній sec. Якщо секунди рівні 0, а це може бути тільки в двох випадках: закінчилася хвилина або закінчилося загальний час. Щоб визначити закінчення загального часу потрібно перевірити змінну min, якщо вона рівна 0 значить, пора підраховувати результат. Для підрахунку результатів мені потрібен масив pravilniy_otvet[i] в якому зберігаються варіанти відповідей на кожне з 20 питань. [7, 16]
Рис 4.1 Алгоритм зворотного відліку.
Випадковий вибір білетів За випадковий вибір значень в Delphi відповідає функція random. Вона генерує значення від 0 до 1. Необхідно пам’ятати, що запуск генерації випадкового значення відбувається після виконання команди Randomize. Max_bilet.close; // Підраховуємо кількість білетів max_bilet.Open; // Віконаті запитий
Randomize; // Активізуємо генерацію випадкового значення bilet_nomer: =StrToInt(floatToStr(random(max_biletmaxx.Value+1))); // № білета отримуємо з базі даних
bilety.Open; // Відкриваємо запит білетів for i: =1 to bilet_nomer do // Переводиться до потрібного квитку зсувом bilety.Next; // щоб не обирати номері видалених білетів Label1.Caption: =’Бiлет №’+IntToStr(biletyname.AsInteger); // Номер білету отримуємо з поля name базі даних Timer1.Enabled: =true; // Увімкнути зворотній відлік [8, 25]
|
Последнее изменение этой страницы: 2019-04-09; Просмотров: 232; Нарушение авторского права страницы