Как получить SYSTEMTIME из строки?
От: VladEC  
Дата: 21.06.05 13:51
Оценка: +1
Программирую (вынужденно — чужой проект) в среде MSVS 6.0 SP6 + MFC + STL(в данном моменте никак не участвует).

Задача — из диалогового окна (элемент управления Date Time Picker) получить дату в формате SYSTEMTIME.

На моей системе (по непонятным мне причинам) COledateTime вызывает ошибки и исключения и напрочь отказывается работать по документации. Единственный способ поместить в объект класса COleDateTime данные — воспользоваться конструктором не по умолчанию. Любой из набора методов Set... вызывает исключение и нулевой эффект. Возиться с исключением ОЧЕНЬ не хочется — возникает оно где-то глубоко в недрах кода.
Тот же самый объект в том же самом куске кода спокойно работает на большинстве других систем.
Где-то в MSDN видел, что все объекты Ole надо проверять на валидность, но уже потерял ссылку, да и как-то... по документации же все и из примеров выдрано!

В итоге:
1) Сопоставил элементу управления DateTimePicker текстовую переменную и вытаскиваю в нее по IDОК время (успешно — проверял отладкой)
2) Облазил MSDN — функциями API (GetLocale...) получил строку форматирования (dd/MM/yyyy и т.п.), разделители даты-времени и пр.
Нашел функции преобразования SYSTEMTIME в строку по "локальному" формату.
3) Обратное преобразование по формату найти не могу!
4) Я, конечно, могу "руками" разобрать, где в формате системной локали месяц(ММ), дата(dd), год(yyyy) и т.д., вытащить "разделитель времени", сформировать строку форматирования и sscanf'ом каким-нить или методами CString все запихнуть в компоненты SYSTEMTIME, но не может же быть, чтобы такой функции готовой не было, а?!

Неужели, помимо методов класса COleDateTime нет другого легкого способа из строки получить время?

P.S. Операционка WinXP SP2 English Corporate + Russian MUI, часть служб (если есть идеи, почему COle может не работать).

24.06.08 16:38: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Как получить SYSTEMTIME из строки?
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 21.06.05 13:59
Оценка:
Здравствуйте, VladEC, Вы писали:

VEC>Задача — из диалогового окна (элемент управления Date Time Picker) получить дату в формате SYSTEMTIME.


Гх-м-м... а банальное сообщение DTM_GETSYSTEMTIME не подходит?
[ posted via RSDN@Home 1.1.4 beta 7 r474, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Вдогонку...
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 21.06.05 14:04
Оценка:
А если именно из строки — VarDateFromStr() + см. исходный текст функции _AfxTmFromOleDate() в файле OLEVAR.CPP + исходный текст метода COleDateTime::GetAsSystemTime().
[ posted via RSDN@Home 1.1.4 beta 7 r474, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re[2]: Как получить SYSTEMTIME из строки?
От: VladEC  
Дата: 22.06.05 06:39
Оценка:
VEC>>Задача — из диалогового окна (элемент управления Date Time Picker) получить дату в формате SYSTEMTIME.

SDB>Гх-м-м... а банальное сообщение DTM_GETSYSTEMTIME не подходит?


Нет. В 6-й версии элемент CDateTimePicker вообще ведет себя СВЕРХстранно:
создал пустой проект, вставил контрол, связал с переменной COleDateTime — слетает при инициализации
m_ctrlDate = COleDateTime::GetSystemTime();


Смотрел по шагам — похоже, поля valid = 0 и m_dt = 0.0

Пытался получить хэндлер контрола через GetDlgItem — возвращает 0!

Не понимаю.

Попробовал закомментировать и задать формат контрола как VAR_DATEONLY — слетает на шаге switch(*Format), при этом переменная Format = 0x0002 — такое впечатление, что где-то внутри класса все "переворачивается" :/

Ради эксперимента попробовал в VC7 (на своей же машине) создать такой же тестовый диалог — работает!
Одно смущает — через переменную диалога типа COleDateTime "вытаскивается" значение, которым контрол был инициализирован (текущее время). Есть подозрение, что надо UpdateData() сделать, но пока не проверял.
А вообще странно — "привязанная" переменная разве не должна на автомате данные тягать?
Re: Вдогонку...
От: VladEC  
Дата: 22.06.05 06:41
Оценка:
SDB>А если именно из строки — VarDateFromStr() + см. исходный текст функции _AfxTmFromOleDate() в файле OLEVAR.CPP + исходный текст метода COleDateTime::GetAsSystemTime().

То есть в итоге придется все-таки делать синтаксический разбор
Хоть и готовым кодом.

Думаю вставить в проект какой-нибудь готовый Masked Edit от "стороннего производителя" и не париться
Re: Как получить SYSTEMTIME из строки?
От: chipmunk  
Дата: 23.06.08 20:06
Оценка:
Здравствуйте, VladEC, Вы писали:

VEC>Нашел функции преобразования SYSTEMTIME в строку по "локальному" формату.

VEC>3) Обратное преобразование по формату найти не могу!
VEC>4) Я, конечно, могу "руками" разобрать...

VEC>Неужели, помимо методов класса COleDateTime нет другого легкого способа из строки получить время?


актуально и сегодня !
Re: Как получить SYSTEMTIME из строки?
От: Кодт Россия  
Дата: 24.06.08 12:46
Оценка:
Здравствуйте, VladEC, Вы писали:

VEC>На моей системе (по непонятным мне причинам) COledateTime вызывает ошибки и исключения и напрочь отказывается работать по документации.


Ищи ошибки. Возможно, что у тебя конфликт библиотек, или расстрел памяти, или ещё сто тысяч причин. Если их не вылечишь — то будут и другие "непонятные причины" в разных местах программы.

VEC> Единственный способ поместить в объект класса COleDateTime данные — воспользоваться конструктором не по умолчанию. Любой из набора методов Set... вызывает исключение и нулевой эффект. Возиться с исключением ОЧЕНЬ не хочется — возникает оно где-то глубоко в недрах кода.


Не нужно возиться с обработкой исключений. Попробуй отладить код — посмотри, кто и почему мечет.
Кстати, все методы COleDateTime — SetDate, SetTime, SetDateTime помечены как throw(), так что очень странно, что нечто оттуда вылетает.
Это очень похоже или на конфликт библиотек, или на нарушение ODR.

Да, кстати! Какое исключение вылетает — С++ное или структурное? Случаем, не Access Violation?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.