Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проверка на "размер" дня


Автор: mr.Anderson 30.8.2005, 20:40
Юзверь вводит дату в три Эдита (в качестве календаря я использую DateTimePicker). В первом - день, во втором - месяц, в третьем - год. Надо проверить, что ввел юзер в качестве дня. Если день превышает 31, то надо исправить на 31 или 30, в зависимости от месяца. Я написал так:
Код

int day=Edit1->Text.ToInt();
int month=Edit2->Text.ToInt();
AnsiString string_day=Edit1->Text;
//------------------------------------------//
if(day>=32)
{
 //Проверка на месяцы с 30-ю днями
 if(month==4 || month==6 || month==9 || month==11) {string_day="30";return;}
 else string_day="31";
}
//------------------------------------------//
Form1->DateTimePicker1->Date=Edit1->Text+"."+Edit2->Text+"."+Edit3->Text;

Однако, при вводе неверного дня программа просто "вываливается" и говорит, что не существует даты с днем, большим 31. Что не так? Алгоритм вроде верный...

Автор: BreakPointMAN 30.8.2005, 21:17
Цитата(sim7 @ 30.8.2005, 20:40)
Юзверь вводит дату в три Эдита (в качестве календаря я использую DateTimePicker). В первом - день, во втором - месяц, в третьем - год.

А зачем такие извращения, если DateTimePicker и так предназначен для корректного ввода даты?!



Цитата(sim7 @ 30.8.2005, 20:40)
Form1->DateTimePicker1->Date=Edit1->Text+"."+Edit2->Text+"."+Edit3->Text;

Как используется string_day? Ты уверен, что эта переменная вообще используется? Ты изменяешь Edit1->Text в соответствии с ее значением?

Кстати, а високосный год кто учитывать будет?

Автор: codelord 31.8.2005, 07:39
sim7 держи, поправил.
Цитата(BreakPointMAN @ 30.8.2005, 21:17)
Кстати, а високосный год кто учитывать будет?

теперь будет:
Код

int day=Edit1->Text.ToInt();    
int month=Edit2->Text.ToInt();
//------------------------------------------//
if(day>=31)    
{
 if(month==4 || month==6 || month==9 || month==11) Edit1->Text="30";
 else Edit1->Text="31";
}
if(day>=29 &&  month==2)
        {
        int year=Edit3->Text.ToInt();
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) Edit1->Text="29";
        else  Edit1->Text="28";
        }
//------------------------------------------//    
Form1->DateTimePicker1->Date=Edit1->Text+"."+Edit2->Text+"."+Edit3->Text; 

Автор: Vyacheslav 31.8.2005, 08:49
Я понимаю, что все хочется делать своими руками, но не проще ли smile
Код

int year = Edit1->Text.ToInt();
int month = Edit2->Text.ToInt();
int day = Edit3->Text.ToInt();
if ( day > DaysInAMonth(year, month) ) {
     day = DaysInAMonth(year, month);
}


Автор: mr.Anderson 31.8.2005, 16:00
codelord, я тож пробовал ваш вариант. Ничего у меня не получалось.
Vyacheslav, где вы такие функции берете? Мне бы их списочек найти... Всех...
И еще вопрос. Почему вы изменяете ToInt() у Эдита, а не свойство Text?

Автор: _hunter 31.8.2005, 16:08
список функций в хелпе по модулю DateUtils
можеш пичать int year = StrToInt(Edit1->Text);

Автор: Vyacheslav 31.8.2005, 17:07
Цитата(sim7 @ 31.8.2005, 16:00)
Vyacheslav, где вы такие функции берете? Мне бы их списочек найти... Всех...
И еще вопрос. Почему вы изменяете ToInt() у Эдита, а не свойство Text?

Я в принипе не могу изменить ToInt(). Просто меняю переменную day типа int, которая предварительно была заполнена спомощью ToInt()
Если Вы хотите значение завести обратно в Edit, то нужно добавить еще строку
Код

Edit->Text = AnsiString(day);


Если же стоит вопрос о заполнении TDataTimePicker, то лучше бы выглядело
Код

Form1->DateTimePicker1->Date = TDateTime( year,  month,  day);


Автор: mr.Anderson 1.9.2005, 16:36
А вот мне и унтересно, почему же
Код

Edit1->Text="31";

Не срабатывает?

Автор: _hunter 1.9.2005, 16:45
почему не срабатывает? срабатывает

Автор: mr.Anderson 2.9.2005, 19:01
Да? А у меня в этой проверке почему-то не срабатывает. Просто не исправляет, и все тут.

Автор: _hunter 2.9.2005, 19:14
в какой проверке? нет там никакой проверки...

Автор: codelord 2.9.2005, 19:45
Если это проверка то вместо "=" будет "=="

Автор: mr.Anderson 3.9.2005, 18:32
Вы меня не поняли. Я имел в виду, что в коде
Код

int day=Edit1->Text.ToInt();    
int month=Edit2->Text.ToInt();
//------------------------------------------//
if(day>=31)    
{
 if(month==4 || month==6 || month==9 || month==11) Edit1->Text="30";
 else Edit1->Text="31";
}
if(day>=29 &&  month==2)
        {
        int year=Edit3->Text.ToInt();
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) Edit1->Text="29";
        else  Edit1->Text="28";
        }
//------------------------------------------//    
Form1->DateTimePicker1->Date=Edit1->Text+"."+Edit2->Text+"."+Edit3->Text; 

У меня просто не меняется значение Эдитов, а выкидывается ошибка о "Несуществующей дате".

Автор: codelord 3.9.2005, 21:49
пожалуйста:

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)