Перевірка коректності даних в полі введення C + + Builder

Одна з важливих граней багатьох програм (особливо призначених для недосвідчених користувачів) – перевірка того, що введені дані коректні Як тільки дані пройшли через додаток, вони знаходяться в постійному сховище, наприклад у базі даних, незалежно від того, чи коректні вони і чи відповідають потрібному формату Я не можу сказати, скільки разів у мене відбувався збій програми через те, що нібито правильні дані, які вона зчитувала з бази даних, зберігалися в неправильному форматі Поля, в яких не повинно було бути нічого, крім цифр, містили букви, а поля, гарантовано містять цілі значення, містили десяткову точку Цей список можна продовжувати довго

Кращий метод уникнути появи в програмі даних в неправильному форматі – це переконатися, що програма, що записує ці дані в базу, буде записувати тільки коректні дані У цьому прикладі ми досліджуємо шляху, слідуючи яким ви можете перевіряти коректність введення від користувача

Є два основних моменти у перевірці вводу Перший – це переконатися, що тільки дозволені символи потрапляють під введені дані Для введення числа, наприклад, немає сенсу дозволяти користувачеві вводити літери Якщо введення являє собою ціле число, то потрібно також заборонити вводити десяткову точку

Другий момент у перевірці даних – перевіряти, що введене число лежить в потрібному діапазоні Наприклад, якщо мається на увазі введення цілого від одиниці до десяти, то ви можете перевіряти, що користувач вводить цифри і не вводить десяткову точку Але це не допоможе при введенні 12345678 Це число, швидше за все, породить проблеми при запису даних, коли буде очікуватися не більше ніж двозначне число

CBuilder може вам допомогти перевіряти дані Він допоможе вам відсіяти неправильне введення і перевіряти дані на коректність після того, як вони повністю введені У цьому прикладі ми розглянемо обидва випадки і покажемо, як використовувати модель перевірки даних CBuilder

Вихідний код для програми «Перевірка вводу» знаходиться в каталозі Chapter4 \ EditValidation на супровідному компакт-диску

На рис 47 наведено форму, яку ми будемо використовувати в цьому прикладі Щоб її отримати, потрібні два поля введення (TEdit), три перемикача (TRadioButton) і два поля статичного тексту в тих позиціях, як на малюнку За допомогою цього ми будемо перевіряти введення декількома способами

Рис 47 Форма для прикладу перевірки даних

Коли ви побудуєте візуальну форму, додайте обробник вибору перемикача Тільки цифри Якщо цей перемикач встановлений, то компонент TEdit (поле введення) над перемикачем будемо приймати тільки цифри (від 0 до 9, без десяткового дробу) для введення в поле Додайте наступний код в обробник:

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

Label1-> Caption = Введіть лише цифри:; Edit1-> OnKeyPress = Edit1Keypress

}

У наведеному прикладі ми встановлюємо текст в статичному полі в «Вводите тільки цифри:» Це допомагає користувачеві розібратися, що до чого Після цього ми встановлюємо, що подія KeyPress (натискання клавіші) поля введення буде обробляти що перевіряє процедура Edit1KeyPress Далі слід код для процедури Edit1KeyPress, яка буде викликатися при натисканні користувачем клавіші в полі введення Edit1, якщо встановлено перший перемикач:

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &ampKey)

{

if ( isdigit(Key) ) Key = 0

}

Ця процедура просто перевіряє кожен символ, що вводиться користувачем Функція isdigit, що знаходиться в заголовному файлі ctypeh, який вам потрібно підключити на початку вихідного файлу для форми, перевіряє, чи лежить символ в діапазоні від 0 до 9 Якщо це так, то функція повертає TRUE (істина) Інакше функція повертає FALSE (неправда) Синтаксис Isdigit в C + + означає, що наступний код буде виконуватися тоді і тільки тоді, коли функція поверне FALSE Установка параметра Key в 0 говорить компоненту TEdit, що цей символ потрібно ігнорувати

Скомпілюйте і запустіть програму Клацніть на першому перемикачі, для якого ми тільки що додавали обробник і потім клацніть у полі введення Спробуйте ввести букву, наприклад «а» Вгадайте, що буде Якщо ви вирішили, що символ не потрапить в поле введення, то ви помилилися Поле введення радісно відобразить символ «а», тим самим руйнуючи стратегію перевірки вводу

Може, весь підхід неправильний Може, ми не можемо перевіряти введення посимвольно в CBuilder Якщо це так, то це трагедія На щастя, це не так Проблема в тому, що ми пропустили один важливий крок

Закрийте програму і перейдіть в дизайнер форм в CBuilder Виберіть форму, клацнувши де-або в клієнтської області форми, яка не містить компонентів Або ви можете перейти в Object Inspector і вибрати обєкт Form1 зі списку у верхній частині вікна інспектора У будь-якому випадку перейдіть до властивості форми KeyPreview і встановіть його в TRUE (істина) Скомпілюйте і запустіть додаток, і ви помітите, що стало неможливим вводити нецифрові символи в поле введення

Властивість KeyPreview форми показує, чи передаються натискання клавіш спочатку в форму, а потім вже до вибраного компоненту Якщо властивість KeyPreview одно FALSE (хибність), то натискання клавіш підуть прямо до компоненту, що має фокус вводу Якщо ж властивість KeyPreview одно TRUE (як ми тільки що зробили), то натискання клавіш будуть приходити спочатку до обробника натискань рівня форми, такому як наш метод, а тільки потім будуть направлені до компоненту з фокусом вводу Це дозволяє нам переглядати натискання клавіш і модифікувати під свої потреби Це можливо через те, що обробники натискань отримують параметр – Символ за посиланням (char & Key), що дозволяє методом модифікувати значення символу

Маючи це на увазі, створіть обробник для другого перемикача (Дозволена десяткова крапка) і додайте в обробник наступний код:

void __fastcall TForm1::RadioButton2Click(TObject *Sender)

{

Label1-&gtCaption =

“Вводите цифри або десяткову крапку:; Edit1-> OnKeyPress = Edit1Keypress2

}

Знову ж, ми інформуємо користувача, який введення очікується в поле введення і потім встановлюємо перевіряючий обробник Не дивно, що код функції Edit1KeyPress2 дуже схожий на код першого обробника:

void __fastcall TForm1::EditKeyPress2(TObject *Sender,

char &ampKey)

{

if ( isdigit(Key) &amp&amp Key = .’) Key = 0

}

Оскільки ми тепер дозволяємо десяткову точку, то ми добавлчем перевірку для неї Якби ви хотіли перевіряти на єдиність десяткового дробу, то ви могли б додати перевірку на те, що десяткова точка вже була введена:

BOOL bFlag = strchr( Edit1Textc_str(), .’)

Тоді якщо логічне значення bFlag одно TRUE (істина), то ви могли б також заборонити введення Останній обробник для поля введення дозволяє будь-які символи Ви думаєте, ми напишемо

обробник, який будь-яким чином дозволяє будь-які символи Для цього є більш простий шлях Створіть обробник для третього перемикача і додайте наступний код в обробник події:

void __fastcall TForm1::RadioButton3Click(TObject *Sender)

{

Label1-> Caption = Вводите що завгодно:; Edit1-> OnKeyPress = NULL

}

Знову ж, ми ставимо підказку про те, що за введення дозволений Однак, замість того, щоб призначити оброблювачу конкретний метод, ми ставимо його в NULL Це прибирає обробку події для цього компонента і передає старшинство стандартному оброблювачу компонента TEdit (який сприймає всі символи) По ходу справи вам потрібно було додавати прототипи обробників подій, які ми створювали, в заголовний файл Якщо у вас є питання, то ось перероблений заголовний файл:

class TForm1 : public TForm

{

__published: // IDE-managed components TLabel *Label1

TEdit *Edit1 TLabel *Label2

TEdit *Edit2

TRadioButton RadioButton1 TRadioButton RadioButton2 TRadioButton RadioButton3

void      fastcall Edit1KeyPress(TObject *Sender, char &ampKey)

void     fastcall Edit2Exit(TObject *Sender)

void fastcall RadioButton1Click(TObject *Sender) void   fastcall RadioButton2Click(TObject *Sender) void fastcall RadioButton3Click(TObject *Sender) private:  // User declarations

void

fastcall Edit1KeyPress2(TObject *Sender, char &ampKey)

public: // User declarations

    fastcall TForm1(TComponent *Owner)

}

Оскільки я додав функцію Edit1KeyPress через CBuilder як обробник події KeyPress, то вона вже знаходиться в частині, керованої CBuilder

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*