Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Графік викладачів водіння



Даний розділ необхідний для організації графіка навчання водінню майстрами виробничого навчання. Що б зробити графік зручним додамо на форму стандартний компонент – 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: = // другому параметру привласнити
(DateTimePicker1.DateTime);               // день для навчання   

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 і документами, з якими

вони працюють, оскільки вони також є об’єктами.
Відповідь на питання «з чого почати? » напрошується сам собою – почати потрібно з розгляду структури моделей об’єктів MS Office, взаємозв’язків їх складових частин, особливостей вбудованої мови програмування, підійти до розгляду загальних принципів автоматизації MS Office і розібратися, як цим можна управляти з програм, написаних у середовищі Delphi.
MS Word має деревоподібну структуру, на вершині якої знаходиться об’єкт Application. Колекції (Collection), що входять до складу об’єктної моделі, є списками однотипних об’єктів, доступ до яких здійснюється за індексом. Окремі об’єкти можуть містити колекції, у свою чергу елементи колекції є звичайними об’єктами. Доступ до будь-якого об’єкта або елементу колекції можливий тільки через кореневий об’єкт Application.

Що б створити підключення необхідне підключити бібліотеку 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; Просмотров: 199; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.05 с.)
Главная | Случайная страница | Обратная связь