Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TDateTime, Конвертирование 
V
    Опции темы
Uch3nik
Дата 31.1.2007, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.11.2006
Где: Москва

Репутация: нет
Всего: нет



Как мне правильно конвертировать 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);
     ....
}



PM MAIL   Вверх
Bima
Дата 31.1.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Код

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



--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
abrekos1
Дата 31.1.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 9.1.2007

Репутация: нет
Всего: нет



Дык, чтобы из заданных часов, минут и секунд получить TDateTime нужно использовать EncodeTime(...). 
DecodeTime делает обратную процедуру. 
PM MAIL   Вверх
Anikmar
Дата 31.1.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(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);

PM MAIL ICQ   Вверх
Uch3nik
Дата 31.1.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.11.2006
Где: Москва

Репутация: нет
Всего: нет



Спасибо, точно, исправил но всё ж не работает, а прога такая...

Код

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-м - время до сигнала... Подскажите пожалста, как правильно написать!?

Это сообщение отредактировал(а) Uch3nik - 31.1.2007, 19:58
PM MAIL   Вверх
Anikmar
Дата 31.1.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



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

Это что за конструкция? 
Что вы хотели сделать?
PM MAIL ICQ   Вверх
Uch3nik
Дата 31.1.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.11.2006
Где: Москва

Репутация: нет
Всего: нет



ну в смысле...  smile 
Код

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

PM MAIL   Вверх
Anikmar
Дата 31.1.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Вот первые мои замечания:
Код

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;
           }


PM MAIL ICQ   Вверх
Anikmar
Дата 31.1.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Предлагаю свой вариант:
Код

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("Ура!");
    }
}



Вот собственно и все...
PM MAIL ICQ   Вверх
Uch3nik
Дата 31.1.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.11.2006
Где: Москва

Репутация: нет
Всего: нет



Большое спасибо за объяснение... Буду разбираться...  smile 
PM MAIL   Вверх
Anikmar
Дата 31.1.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Сразу предупреждаю! Никаких проверок не было - я набросал костяк, чтобы не загромождать лишним кодом. Там по ходу дела - уже сами разберетесь. Например, в моем коде вылетит исключение, если вместо цифр в контролы будут введены символы.
PM MAIL ICQ   Вверх
Uch3nik
Дата 31.1.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.11.2006
Где: Москва

Репутация: нет
Всего: нет



Ничего, это уже просто. И на этом спасибо, пояснить- великое дело   smile  
PM MAIL   Вверх
derevenge
Дата 19.5.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.4.2007

Репутация: нет
Всего: нет



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



Это сообщение отредактировал(а) derevenge - 19.5.2007, 10:53
PM MAIL   Вверх
SenkraD
Дата 19.5.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



А что мешает испоьлзовать TDateTime и String в консоле?



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
derevenge
Дата 19.5.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.4.2007

Репутация: нет
Всего: нет



Пасиб, но я уже нашел ответ на свой вопрос, я использовал setdate & getdate
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0952 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.