Основні тонкощі роботи інтерфейсом користувача.
Основні тонкощі роботи інтерфейсом користувача.
Доволі суттєвим є інтерфейс користувача в кінцевому продукті. Так як зазвичай користувач не володіє навиками професійної роботи на персональному комп’ютері, та не може самостійно встановити яку і де він помилку допустив, тому є два методи протистояння цьому, перший – це визначення помилки після того як вона скоїлась, та приймання негайних мір по її усуненню, другий ж метод полягає в тому, щоб не дати користувачу завідома ввести не коректні данні, тобто не виконувати додавання/видалення не правильних даних.
Один з методів запобігання вводу некоректних даних – компонента TMaskEdit. Суть її роботи така розробник задає певну маску вводу, яку користувач не може порушити (наприклад при введенні дати, коли користувач забуває поставити крапку, серійного номера те є роздільники і поля одне з яких може бути лише числом, а друге включати в себе лише літери).
Деякі властивості компоненти TMaskEdit
TMaskEdit.Mask – маска вводу тексту. Якщо відкрити це поле в візуальному редакторі то вийде форма редагування маски, де можна вказати що користувач має вводити.
Маска вводу задається в такому вигляді:
· Символ «0» інтерпретує, що може бути введено тільки число;
· Символ «А» інтерпретує, що може бути введено як і літери так і цифри;
· Символ «L» інтерпретує, що може бути введено тільки літера;
· Інші символи ідуть як константи маски і безпосередньо відображаються в полі вводу;
· Строка маски має закінчуватись ;1;? – де ? це символ який відображається замість не введеного символу (наприклад маска «00.00.0000;1;_» пустою буде виглядати «__.__.____», а після вводу наприклад так – «12.01.2009»).
TMaskEdit.Text – текст який користувач ввів, якщо текст введений не повністю не введене передається символом який стоїть в кінці маски, тобто якщо ви бажаєте перевірити чи повністю користувач ввів поле то вам потрібно просто знайти чи є в веденому символ «_» якщо ж так, то можна нагадати користувачу по важливість вводу іменно коректних даних. Так як користувач може ввести при такій масці наприклад «99.99.2003», а місяця і дня немає 99, то можна скористуватися вбудованою системою перевірки дати, це матиме вигляд:
try
StrToDate(MaskEdit1.Text);
except
ShowMessage(‘Дата введена не корректно!!’);
end;
Якщо ж далі розглядати тонкощі введення дати то можна побачити, що SQL потребує дату в форматі РРРР-ММ-ДД, тобто не в такому порядку і не з таким розділювачем як прийнято в наших стандартах (у нас «ДД.ММ.РРРР») для того щоб усунути незручності при введенні дати можна скористуватися вбудованою функцією форматування дат в Delphi це матиме вигляд:
try
Label1.Caption:='';
Edit1.Text:=FormatDateTime('YYYY-MM-DD',StrToDate(MaskEdit1.Text));
except
label1.Caption:='Не коректна дата!';
End;
Після цього, якщо користувач введе не коректну дату Label1 виведе помилку.
Функція FormatDateTime має синтаксис:
FormatDateTime(Time:TDateTime;Format:String):String;
де Format може мати такий зміст
d – відображає число місяця без нуля
dd – відображає число місяця з нулем
ddd – відображає скорочену назву дня тижня
dddd – відображає повну назву дня тижня
m – відображає місяць без нуля
mm – відображає місяць з нулем
mmm – відображає скорочену назву місяця
mmmm – відображає повну назву місяця
yy – відображає рік двома цифрами
yyyy – відображає рік чотирма цифрами
h – відображає години без нуля
hh – відображає години з нулем
n – відображає хвилини без нуля
nn – відображає хвилини з нулем
Якщо ж все-таки помилка потрапила до SQL запиту та призвела до його помилкового виконання тоді щоб «перехватити» помилку потрібно скористатися синтаксисом розгалуження виконання коду try … except його вигляд такий:
Try
…
<виконання «помилконебезпечних» операцій>
…
Except
…
<обробник помилки>
…
End;
Зверніть увагу, якщо ми вставляємо данні у декілька таблиць декількома різними SQL запитами то попередні, які були вдалими потрібно відмінити, тобто якщо збій стався при вставці в другу таблицю, то в першу данні все-одно потрапили. Тому їх потрібно видалити.
Якщо потрібно окрім даних введених користувачем внести ще і деяку службову інформацію в поля таблиці які мають бути унікальними, то доцільно перед внесенням перевірити чи не існує в таблиці вже такого значення, а потім вносити, тому, що тоді ви будете впевнені, що помилка виключно користувача, а не ваша, і зможете перепитувати користувача доти поки він не внесе вірних значень.
Функції які можуть знадобитися для перевірки вірності рядкових даних
В середовищі програмування досить багато рядкових функцій які можуть знадобитися при перевірці конкретності введених користувачем даних.
Також вони можуть знадобитися якщо потрібно наприклад значення одного поля в подальшому потрібно розділити (наприклад з
«Шевченко Т. Г.» – отримати тільки фамілію, або зі значення поля «Тарас Григорович Шевченко» отримати «Шевченко Т. Г.», досить суттєво при формуванні документів).
Pos(subStr, Str:String):String
Повертає перше входження підстроки SubStr в Str, якщо такої підстроки не міститься то повертає 0.
Copy(S; Index, Count:Integer):String
Повертає підрядок із S який починається із символа Index і складається Count символів.
Format(S:String;[n1,….nm]):String;
Форматує рядок S вставлянням в нього n1…nm змінних. Рядок S має складатися з символів які він не змінює і масок вставки в рядок заданих змінних.
Наприклад Format(‘I say :%s!’,[‘Hello’]) = ‘I say Hello!’
Формати включення можуть бути такими:
%s – виведе рядковий аргумент
%d – виведе числовий аргумент
%f – виведе аргумент з плаваючою крапкою
%u – вивід без знакового цілого (таке ж як і %d, але біля числа не відображається «-»)
%e – вивід числа з плаваючою крапкою в експоненціальному вигляді.
%n – вивід числа «номером» тобто відділяє пробілом групи по три символи.
%m – вивід числа в грошових одиницях спираючись на локальні налаштування операційної системи.
%x – вивід числа в шіснадцятиричній формі запису.
В Делфі є ще додатковий модуль для обробки рядків StrUtils в якому і описані додаткові функції які можуть нам допомогти, наприклад:
AnsiLowerCase(const Str:String):String
Повертає рядок еквівалентний Str записаний маленькими літерами.
AnsiReplaceText(const AText, AFromText, AToText: string): string;
Замінює в рядку AText підрядок AFromText на рядок AToText.
AnsiUpperCase(const Str:String):String
Повертає рядок еквівалентний Str записаний великими літерами.