дата та час
Вивчення типу TDateTime, компонентів, функцій та процедур для роботи з ним.
Тип TDateTime
Для роботи з датою та часом у Lazarus передбачений тип TDateTime. Це універсальний тип, що дозволяє одночасно визначити і дату, і час. TDateTime займає 8 байт оперативної пам'яті і фактично є дійсним числом (TDateTime = Double) : ціла частина цього числа містить дату, а десяткова - час. Можна також для роботи з датою і часом використовувати типи відповідно, TDate і TTime, але це просто синоніми того ж типу TDateTime.
У довіднику Lazarus говориться, що мінімальне можливе значення дати-часу -693593.0, а максимальне +2958465.99999. Ціла частина такого числа позначає кількість діб, а дробова частина доби, що минули з 0 годин. Додавання або віднімання одиниці з цілої частини числа рівносильне доданню або віднімання одного дня. Число -693593 відповідає даті 01.01.0001, а число +2958465 відповідає даті 31.12.9999, у цьому діапазоні ви і зможете працювати з датами Lazarus.
Компоненти для роботи з датою-часом
На "Екранна заставка" нам уже довелося працювати з часом, для виведення поточного часу на екран ми використовували просту мітку TLabel. Але в Lazarus для введення та виведення дати-часу є спеціальні компоненти. Знайомитись із цими компонентами будемо відразу на прикладах. Завантажте Lazarus з новим проектом, одразу збережіть його в папку12-01.
Компоненти для роботи з датою та часом розміщуються на вкладціMisc Палітри компонентів. Взагалі дуже цікаві компоненти знаходяться на цій вкладці, і з деякими з них ми обов'язково ще познайомимося. Зараз нас цікавлять всього два компоненти - календар TCalendar і рядок редагування датиTDateEdit :

Щоправда, треба помітити, ці компоненти ще сирі: деякі властивості є, але не працюють, деякі працюють лише частково, деяких і зовсім немає. Так, у платному аналогу Lazarus – Delphi у компоненті TDateEdit є можливість вводити як дату, так і час. У Lazarus можна вводити лише дату. Для введення часу, ймовірно, доведеться використовувати звичайний TMaskEdit.
Оскільки Lazarus – проект новий, сподіватимемося, що ці недоробки в майбутньому будуть виправлені.
Спочатку познайомимося з компонентом TCalendar. Встановіть його на форму, і він відразу набуде вигляду календаря, причому поточна дата буде виділена. Виділення буде як червоною окантовкою, так у календарі виділяється поточна дата, так і синьою заливкою – так у календарі виділяється вибрана дата. А оскільки можна вибрати будь-яку дату, то вони не завжди збігаються. Однак із форми керувати календарем не дуже зручно. Збережіть проект та запустіть його. У робочому додатку календарем можна керувати: клацнувши за синіми стрілками в лівій правій частині заголовка календаря можна перегортати місяці, клацнувши за назвою місяця, можна відкрити список , в якому вибрати інший місяць, клацнувши по році, можна вибрати або ввести вручну інший рік.

Закрийте запущену програму та поверніться до проекту. Ознайомимося з деякими корисними властивостями компонента TCalendar.
| Align | - Вирівнювання компонента щодо форми (або іншого контейнера). З цією властивістю ви вже знайомі, але у випадку з календарем застосовувати його немає сенсу - якщо ще можна притиснути календар до однієї зі сторін, то змінити його розміри все одно не вдасться. |
| BorderSpacing | - Розкривається складна властивість. За ідеєю, воно має налаштовувати параметри обрамлення:ширину обрамлення навколо календаря або з однієї з його сторін, але, на жаль, ця властивість теж не працює - як я не намагався щось змінити, вигляд календар залишився тим самим. |
| Date та DateTime | - встановлена в календарі дата. При зміні однієї з цих властивостей зміниться й інше, але є й відмінності: Date має тип String , а DateTime - TDateTime . Таким чином, якщо вам потрібно отримати дату у вигляді рядка, звертайтеся до Date . Якщо треба працювати з датою у формі TDateTime, а це часто буває потрібно, наприклад, для розрахунку дат, то звертайтеся до TDateTime. Присвоїти календарю нову дату можна як через першу, так і через другу властивість, але якщо ви змінюватимете дату за допомогою Date, ви повинні бути впевнені, що дата в рядку написана правильно. |
| DisplaySettings | - властивість повинна керувати видом календаря, але теж чомусь не змінює його. Має наступні підсвойства, що дозволяють (при True) або забороняють (при False) різні дії:
Перейдемо до подій компонента (перейдіть на вкладкуПодіївІнспекторі об'єктів). Тут нам можуть знадобитися такі події:
Тепер вивчимо компонент TDateEdit. Встановіть його на форму, десь під календарем. Як бачите, фактично компонент складається з двох компонентів: поля для редагування дати та кнопки, при натисканні на яку з'являється календар: Тепер перейдіть на вкладкуВластивостіуІнспекторі об'єктів. У компонента є такі корисні властивості: |
| buttonOnlyWhenFocused | - Показувати кнопку вибору дати, тільки якщо фокус введення знаходиться на компоненті. За замовчуванням False , тобто, кнопку видно завжди. Щиро кажучи, не бачу сенсу ховати цю кнопку. |
| ButtonWidth | - Ширина кнопки. За замовчуванням дорівнює 23, але можна змінити. Щоправда, знову незрозуміло навіщо. |
| CalendarDisplaySettings | - аналогічно властивості DisplaySettings календаря, і призначене для того ж: зміни зовнішнього вигляду календаря, який з'являється при натисканні на кнопку. |
| CancelCaption | - заголовок для кнопки Скасувати діалогове вікноКалендар. Мабуть, йдеться про прив'язаний до компоненту діалог TCalendarDialog (діалоги ми вивчатимемо в іншій лекції). Мені особисто не вдалося знайти, як діалог прив'язати до компонента, пошуки інформації в Інтернеті також були безуспішними. Сподіватимемося, у наступних версіях Lazarus цей компонент запрацює, як треба. |
| DateOrder | - Формат виведення дати. При виборі формату, відмінного від doNone (за промовчанням), з'являється маска дати. Може мати такі значення:
|
| DefaultToday | - якщо True , то у працюючій програмі компонент за замовчуванням відображає поточну дату, якщо False , то нічого не відображає. |
| OKCaption | - заголовок для кнопкиОКу діалоговому вікніКалендар. Проблеми ті ж, що й у CancelCaption. |
УІнспекторі об'єктівчомусь не відображаються такі необхідні властивості:
| Date | - має тип TDateTime , що містить вибрану або введену користувачем дату. |
| Text | - має тип TCaption, який сумісний із звичайним рядком. Тут обрана чи введена дата зберігається у вигляді рядка. |
Цими властивостями часто доведеться користуватися, щоб дізнатися, яку дату вибрав або ввів користувач , так що запам'ятайте їх.
Основні події, які можуть знадобитися, це OnChange (при зміні), OnClick (клацнули мишею), OnKeyPress (натиснули будь-яку клавішу). Ці події працюють так само, як в інших, вже відомих вам компонентах, так що затримуватися тут ми не будемо.
Стандартні функції для роботи з датою та часом
Ознайомимося з основними функціями, які допоможуть нам працювати з датою та часом. Для виконання прикладів раджу встановити на форму просту кнопку, і згенерувати для неї подію OnClick , в якій пробуватимете пропонованіприклади. Тож почнемо.
Date - Функція повертає поточну дату у форматі TDateTime. Частина числа після коми (тимчасова частина) дорівнюватиме нулю. Приклад застосування:
Time - Функція повертає поточний час у форматі TDateTime. Частина числа перед комою (частина дати) дорівнюватиме нулю. Приклад застосування аналогічний функції Date.
Now - Функція повертає поточну дату та час у форматі TDateTime. Обидві частини числа будуть заповнені значеннями. Приклад застосування аналогічний спільним функціям Date та Time.
DateTimeToStr() - Функція приймає як параметр дату і час у форматі TDateTime і повертає ці дані у вигляді рядка. Синтаксис функції:
Приклад виведення поточної дати часу на екран:
В результаті на екран вийде повідомлення з поточною датою та часом, наприклад:
DateToStr() - Функція приймає як параметр дату у форматі TDateTime і виводить її у вигляді рядка. Час у своїй не виводиться. Застосування функції аналогічне DateTimeToStr.
TimeToStr() - Функція приймає як параметр час у форматі TDateTime і виводить його у вигляді рядка. Дата не виводиться. Застосування функції аналогічне DateTimeToStr.
Зверніть увагу, що формати виведення дати-часу залежать від того, яка Windows у вас встановлена і які правила діють у вашій країні. Так, зазначене повідомлення сформувалося за правилами України, для української Windows. А ось у США, наприклад, інші правила. Там цей рядок виглядав би так:
Всі ці правила залежать від системних змінних ShortDateFormat (короткий формат дати), LongDateFormat (довгий формат дати), ShortTimeFormat (короткий формат часу) та LongTimeFormat (довгий формат часу). Оголошувати ці змінні не потрібно, вони вже присутні у системі тамістять рядки з відповідними форматами (про формати ми поговоримо нижче). Так, для української Windows короткий формат дат встановлений, як dd.MM.yyyy (тобто день з провідним нулем, місяць та рік у чотирьох цифрах). Короткий формат часу буде h:nn (година без провідного нуля та хвилини з провідним нулем), а довгий - h:nn:ss (година без провідного нуля, хвилини та секунди з провідним нулем). При бажанні ці системні змінні можна змінити прямо в програмі, наприклад:
Через війну, рік виводитиметься у двох цифрах, а чи не чотирьох, тобто. замість "2013" буде "13". Однак, я не рекомендую це робити. Коли вам знадобиться (а це обов'язково станеться) вивести дату і час у бажаному вам, або вашому замовнику, вигляді, то краще скористатися функціями, що реалізують форматний висновок, про які піде нижче. Тим більше, що це гарантує правильний висновок дати-часу на будь-якій Windows, у будь-якій країні.
FormatDateTime() - функція виводить задану дату і час у потрібному форматі, який не залежить від того, яка Windows (українська або англійська) у вас встановлена. Синтаксис функції наступний:
У функцію слід передати два параметри: рядок із необхідним форматом, і дату-час (або лише дату, або лише час) у форматі TDateTime . Функція поверне ці дані у вказаному форматі. Наприклад:
В результаті в рядковій змінній s виявиться рядок типу "21 Жовтень 2013 - 11:41:56". Але це теоретично. На практиці замість українських букв виходять знаки "?" - позначаються проблеми сумісності Lazarus з різними кодуваннями Windows. Що ж, рішення є і з цієї ситуації: потрібно конвертувати отриманий рядок функцією SysToUTF8(), яка отримує ANSI-рядок, і гарантовано повертає формат UTF8, в якому, як ми знаємо, і працює Lazarus:
Зазначений програмістом формат може містити символи, які представлені у таблиці нижче:
DateTimeToString() - процедура, яка перетворює зазначені дату-час у рядок з використанням зазначеного формату, і результат поміщає у рядкову змінну, яка вказується як параметр за посиланням. Зазначений формат використовує символи таблиці 12.1, як і FormatDateTime() .