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


Автор: Uch3nik 31.1.2007, 15:35
Как мне правильно конвертировать String To Time ??? потому как после Button1Click(), Dt у меня равно 00:00:00!!!  smile 
Код

TDateTime Dt;

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        TimeFormat = "hh:mm:ss";
}       

void __fastcall TForm1::Button1Click(TObject *Sender)
{
          WORD Hh = StrToInt(Edit1->Text);
          WORD Mm = StrToInt(Edit2->Text);
          WORD Ss = StrToInt(Edit3->Text);
          WORD Ms = StrToInt(Edit4->Text);
                DecodeTime(Dt,Hh,Mm,Ss,Ms);
     ....
}



Автор: Bima 31.1.2007, 16:10
Код

Dt=Hh + ":" + Mm + ":" + Ss + "." + Ms;

Автор: abrekos1 31.1.2007, 16:16
Дык, чтобы из заданных часов, минут и секунд получить TDateTime нужно использовать EncodeTime(...). 
DecodeTime делает обратную процедуру. 

Автор: Anikmar 31.1.2007, 17:29
Цитата(abrekos1 @  31.1.2007,  16:16 Найти цитируемый пост)
Дык, чтобы из заданных часов, минут и секунд получить TDateTime нужно использовать EncodeTime(...). 
DecodeTime делает обратную процедуру.  

Это еще зачем?
В TDateTime есть конструктор, который на входе получает четыре unsigned short.
Он формирует объект TDateTime с нулефой датой и указанным в конструкторе временем (см. хелп)

Вообще TDateTime устроен просто: там есть свойство Val (по-моему) или Value не помню. Это float. Целая часть содержит дату, а дробная время - в виде количества миллисекунд с начала дня. Можно оперировать этим свойством.

Добавлено @ 17:31 
Согласно выше приведенному примеру:
Код

TDateTime dt(Hh,Mm,Ss,Ms);

Автор: Uch3nik 31.1.2007, 19:58
Спасибо, точно, исправил но всё ж не работает, а прога такая...

Код

TForm1 *Form1;
TDateTime Dt;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        TimeFormat = "hh:mm:ss";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
          TDateTime Dt = TDateTime::CurrentDateTime().FormatString(TimeFormat);
          Timer1->Interval = 1000;
          Timer1->Enabled = true;

          WORD Hh = StrToInt(Edit1->Text);
          WORD Mm = StrToInt(Edit2->Text);
          WORD Ss = StrToInt(Edit3->Text);
          WORD Ms = StrToInt(Edit4->Text);

           static TDateTime Signal(Hh,Mm,Ss,Ms);
           static TDateTime N = Signal + Dt.TimeString();


          Timer2->Interval = 1000;
          Timer2->Enabled = true;

          if(N.TimeString() == Dt.TimeString())
          {
           ShowMessage("!!!!");
          Timer2->Enabled = false;
          }
           else
           {TDateTime Dt = Time().FormatString(TimeFormat);
           return;
           }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
          TDateTime Dt = TDateTime::CurrentDateTime().FormatString(TimeFormat);
          Label1->Caption = Dt.TimeString();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
         TDateTime Dt = TDateTime::CurrentDateTime().FormatString(TimeFormat);
         TDateTime ObrOtschet = N-Dt.TimeString();
         Label2->Caption = ObrOtschet.TimeString();
}
//---------------------------------------------------------------------------

есть форма, кнопка, 4 Edit`а + 4 UpDown`а и 2 Label`а. После нажатия кнопки в 1-м Label`е отображается текущее время, а во 2-м - время до сигнала... Подскажите пожалста, как правильно написать!?

Автор: Anikmar 31.1.2007, 20:07
Цитата(Uch3nik @  31.1.2007,  19:58 Найти цитируемый пост)
static TDateTime N = Signal + Dt.TimeString();

Это что за конструкция? 
Что вы хотели сделать?

Автор: Uch3nik 31.1.2007, 20:13
ну в смысле...  smile 
Код

if((Signal + Dt)== Dt)
          {
           ShowMessage("!!!!");
          Timer2->Enabled = false;
          }
           else
           {TDateTime Dt = Time().FormatString(TimeFormat);
           return;
           }

Автор: Anikmar 31.1.2007, 20:17
Вот первые мои замечания:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
          TDateTime Dt = TDateTime::CurrentDateTime().FormatString(TimeFormat);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Это неправильно надо так:
//        TDateTime Dt = TDateTime::CurrentDateTime();

          Timer1->Interval = 1000;
          Timer1->Enabled = true;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Рановато. Таймер надо запускать когда посчитана конечная точка

          WORD Hh = StrToInt(Edit1->Text);
          WORD Mm = StrToInt(Edit2->Text);
          WORD Ss = StrToInt(Edit3->Text);
          WORD Ms = StrToInt(Edit4->Text);

           static TDateTime Signal(Hh,Mm,Ss,Ms);
           static TDateTime N = Signal + Dt.TimeString();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Это тоже неправильно надо так:
//         Signal += Dt;
// Signal теперь обозначает время, после которого надо выключить таймер


          Timer2->Interval = 1000;
          Timer2->Enabled = true;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Это мы уже делали, зачем в 1-й раз? Оставить только здесь

          if(N.TimeString() == Dt.TimeString())
          {
           ShowMessage("!!!!");
          Timer2->Enabled = false;
          }
           else
           {TDateTime Dt = Time().FormatString(TimeFormat);
           return;
           }
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Проверку на необходимость запуска таймера конечно можно оставить, но вот эту строчку я просто не понял:
//           {TDateTime Dt = Time().FormatString(TimeFormat);
// Вы каждый раз объявляете локальную переменную. Эта переменнная будет вижна только внутри скобок - по сути код ничего не далет
}



Добавлено @ 20:25 
Второе мое замечание - я так понимаю, это функция таймера
Код

// TDateTime CurDT = TDAteTime::CurrentDateTime();
// Получаем текущую дату и время
if((Signal + Dt)== Dt)
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Проверяем: текущая дата и время больше сигнального?
// if (CurDT >= Signal)
          {
           ShowMessage("!!!!");
          Timer2->Enabled = false;
          }
           else
           {TDateTime Dt = Time().FormatString(TimeFormat);
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Опять та же ерунда. Что мы хотим? Мы хотим вывести оставшееся время на экран.
// А вы используете странную и бесполезную конструкцию
//  TDateTime Temp = (Signal - CurDT);
//  AnsiString Str = Temp.TimeString();
// ^^^^^^^^^^^^^^^^^^^^^^^^
// Str теперь содержит строковое представление оставшегося до срабатывания времени
      return;
           }


Автор: Anikmar 31.1.2007, 20:38
Предлагаю свой вариант:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Это обработчик нажатия кнопки "Запустить таймер"
// Signal - переменная типа TDateTime в переменных класса
    Signal = TDateTime(Edit1->Text.ToInt(),Edit2->Text.ToInt(),Edit3->Text.ToInt(),0);
    Signal += TDateTime::CurrentDateTime();
    Timer1->Enabled = true;
    // Сразу вызываем функцию таймера для первичного вывода - сколько времени осталось, а заодно, если сразу надо остановить таймер
    // таким образом избавляемся от дополнительной проверки
    Timer1Timer(NULL);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    TDateTime CurDate = TDateTime::CurrentDateTime();
// Получаем текущую дату
    TDateTime OstDate = Signal - CurDate;
// Получаем разницу между сигнальной датой и текущей (для вывода)
    Label2->Caption = OstDate.TimeString();
// Выводим на форму оставшееся время
    if (CurDate>=Signal)
    {
// Если закончили время - выводим сообщение
        Timer1->Enabled = false;
// Внимание! Первым делом отключаем таймер - иначе долго будем искать глюки!
        ShowMessage("Ура!");
    }
}



Вот собственно и все...

Автор: Uch3nik 31.1.2007, 21:37
Большое спасибо за объяснение... Буду разбираться...  smile 

Автор: Anikmar 31.1.2007, 22:26
Сразу предупреждаю! Никаких проверок не было - я набросал костяк, чтобы не загромождать лишним кодом. Там по ходу дела - уже сами разберетесь. Например, в моем коде вылетит исключение, если вместо цифр в контролы будут введены символы.

Автор: Uch3nik 31.1.2007, 23:16
Ничего, это уже просто. И на этом спасибо, пояснить- великое дело   smile  

Автор: derevenge 19.5.2007, 10:37
Подскажите!
Мне надо изменить дату
Надо из строки, запихать это в struct tm, а из struct tm в time_t.
Ну из строки то это запихать не сложно, а вот как из struct tm в time_t?
Я мне надо через консоль реализовать.
Пробовал через stime...но ей секунды надо


Автор: SenkraD 19.5.2007, 10:55
А что мешает испоьлзовать TDateTime и String в консоле?

Автор: derevenge 19.5.2007, 11:24
Пасиб, но я уже нашел ответ на свой вопрос, я использовал setdate & getdate

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