Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
Sergey_Karushev
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 4
1

Контроль ввода даты в MaskEdit и выдача сообщения в случае ошибки неверного ввода

09.05.2015, 11:39. Просмотров 3709. Ответов 9
Метки нет (Все метки)

Всем доброго дня!
Использую MaskEdit для ввода даты формат: dd/mm/yyyy
Помогите написать обработчик выдачи ошибки в ShowMessage "Не правильно введена дата",
при не полном заполнении MaskEdit

Нашел такой код, но он мне не подходит:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if Edit1.Text <> '' then
  begin
    try
      StrToDate(Edit1.Text);
    except
      Edit1.SetFocus;
      MessageBeep(0);
      raise Exception.Create('"' + Edit1.Text
        + '" - некорректная дата');
    end {try};
    Edit1.Text := DateToStr(StrToDate(Edit1.Text));
  end {if};
end;
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2015, 11:39
Ответы с готовыми решениями:

Контроль ввода даты и выдача сообщения в случае ошибки неверного ввода
Здравствуйте! У меня есть такая вот форма(скрин ниже). Смысл в том, что если...

Как поставить маску ввода в Edit без MaskEdit?
Подскажите пожалуйста, можно как-то поставить маску ввода без использования...

Контроль ввода в Edit
В edit1 нужно вводить только числа либо русские буквы. Как это...

Контроль ввода в Edit
всем привет. как организовать контроль ввода данных в edit - необходимо...

Реализовать контроль ввода
Ребята... я всего лишь первокурсник... по-этому не судите строго... мне нужно...

9
Streletz
287 / 225 / 61
Регистрация: 07.04.2014
Сообщений: 1,447
09.05.2015, 12:02 2
Цитата Сообщение от Sergey_Karushev Посмотреть сообщение
Нашел такой код, но он мне не подходит:
Потому что он предназначен для Edit, а у Вас MaskEdit.
К сожалению, для MaskEdit всё не так просто. Обработчик ошибки ввода (метод ValidateError) спрятан в protected у его класса-предка TCustomMaskEdit. Поэтому единственный способ сделать своё сообщение об ошибке - создать класс наследник TMaskEdit и переопределить в нём метод ValidateError.
Ниже приведён пример.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask;
 
type
  TMaskEdit = class(Vcl.Mask.TMaskEdit)
  protected
    procedure ValidateError; override;
  end;
 
type
  TForm1 = class(TForm)
    MaskEdit1: TMaskEdit;
    Edit1: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TMaskEdit.ValidateError;
begin
  try
    inherited; // если строку убрать то ошибка не покажется
  except
    ShowMessage('Неправильный ввод');
  end;
end;
 
end
.
0
Sergey_Karushev
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 4
09.05.2015, 12:18  [ТС] 3
Streletz, спасибо, но для меня это сложно. Нашел вот такой код, но он для Lazarus, на Delphi выдает ошибку:

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm2.MaskEdit1Exit(Sender: TObject);
var dt : TDate;
begin
  if not TryStrToDate(MaskEdit1.Text, dt) then
  begin
     ShowMessage('Incorrect data');
     MaskEdit1.Text :='';
  end;
end;
end;
Ошибка:
Delphi
1
2
3
Error] Unit2.pas(2791): There is no overloaded version of 'TryStrToDate' that can be called with these arguments
[Error] Unit2.pas(2797): '.' expected but ';' found
[Fatal Error] Project1.dpr(7): Could not compile used unit 'Unit2.pas'
0
Streletz
287 / 225 / 61
Регистрация: 07.04.2014
Сообщений: 1,447
09.05.2015, 13:26 4
Лучший ответ Сообщение было отмечено Sergey_Karushev как решение

Решение

Цитата Сообщение от Sergey_Karushev Посмотреть сообщение
Нашел вот такой код, но он для Lazarus, на Delphi выдает ошибку
То, что код работает на Lazarus вовсе не означает, что он будет работать на Delphi.
В Lazarus используется другая библиотека компонентов. Она во многом напоминает VCL, но тем не менее, это всё равно другая программная платформа.
В Delphi исключение в упомянутом методе ValidateError возникает раньше, чем обрабатывается событие OnExit. Так, что при некорректном вводе до выполнения найденного Вами "кода для Lazarus" просто не дойдёт. Будет выдано стандартное сообщение об ошибке "Invalid input value. Use Escape key to abandon changes" и всё. Поэтому, даже если этот код доработать для Delphi, это Вас не спасёт.
На Lazarus это, возможно, сработает, но на Delphi нет. Поэтому, советую не тратить время на подобные изыскания и воспользоваться тем, что предоставляют Delphi и ООП.
1
Verevkin
Нарушитель
1139 / 640 / 164
Регистрация: 12.03.2015
Сообщений: 4,201
09.05.2015, 13:42 5
Цитата Сообщение от Sergey_Karushev Посмотреть сообщение
Нашел такой код
это щас, я так понимаю, основы программирования, да?
Цитата Сообщение от Sergey_Karushev Посмотреть сообщение
но он мне не подходит
почему?
и почему бы не вспользоваться, скажем, компонентом вот таким?
0
Миниатюры
Контроль ввода даты в MaskEdit и выдача сообщения в случае ошибки неверного ввода  
Sergey_Karushev
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 4
09.05.2015, 17:35  [ТС] 6
Verevkin, DateTimePicker не подходит для моих задач, потому что в нем нет возможности оставить поле пустым. Похоже проще воспользоваться простым Edit'ом.
0
Verevkin
Нарушитель
1139 / 640 / 164
Регистрация: 12.03.2015
Сообщений: 4,201
09.05.2015, 17:44 7
Цитата Сообщение от Sergey_Karushev Посмотреть сообщение
то в нем нет возможности оставить поле пустым.
зато можно дать пользователю выбор – брать дату из компонента или нет. это то же самое, что и «оставить поле пустым».
0
Sergey_Karushev
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 4
09.05.2015, 17:55  [ТС] 8
На форме будет 10 полей с датами, не все будут заполнятся, если ставить DateTimePicker вместо MaskEdit, по умолчанию будет стоять сегодняшняя дата. Боюсь что пока пользователь будет заполнять, он может случайно оставить сегодняшнюю дату, а не поставить нужную. Изначально и планировал использовать DateTimePicker.
0
pivogol
20 / 20 / 8
Регистрация: 07.01.2009
Сообщений: 545
25.05.2015, 13:50 9
Ну можно рядом с календарём поставить птичку "задать дату", если юзер кликнет птичку, то календарь активируется, если нет, то дата пустая
0
northener
пофигист широкого профиля
3429 / 2328 / 631
Регистрация: 15.07.2013
Сообщений: 13,796
25.05.2015, 14:00 10
Цитата Сообщение от Sergey_Karushev Посмотреть сообщение
Нашел вот такой код, но он для Lazarus, на Delphi выдает ошибку:
Достаточно заменить var dt : TDate;
на var dt : TDateTime;
и ошибки не будет.
0
25.05.2015, 14:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2015, 14:00

контроль правильности ввода
В программе должен быть реализован контроль правильности ввода цифровых...

Контроль ввода (только буквы)
нужна помощь в написание проги задание - Создать приложение, в котором...

Контроль ввода букв из текстового файла
Уважаемые участники форума, подскажите, пожалуйста, написать программу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru