C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Варианты, работа с вариантным типом
juice
Отправлено: 09.02.2005, 17:21


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Как преобразовать вариантный тип в обычный (дата-время) ? В Delphi там есть метод .AsDate. А как в Buildere?
Делаю так:

Variant vDate;
TDateTime tDate;

vDate = "02.01.2005";
tDate = vDate.VDate;

ShowMessage( DateToStr(tDate) ); //тут показывается левая дата доисторических времен

Guest
Отправлено: 09.02.2005, 17:27


Не зарегистрирован







Variant vDate = TDateTime("02.01.2005",Date);
зависит от национальных настроек
juice
Отправлено: 09.02.2005, 17:39


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Так не подходит.
Это я привел как-бы пример, а настоящий код более похож на:

Variant vDate;
TDateTime tDate;

vDate = fromExcelCell(Sh, 1, 4);
ShowMessage(fromExcelCell(Sh, 1, 4)) //выводит 02.01.2005

// вот теперь надо преобразовать:
tDate = vDate.VDate;

ShowMessage( DateToStr(tDate) );
Gedeon
Отправлено: 09.02.2005, 17:49


Ветеран

Группа: Модератор
Сообщений: 1742



Так подойдет?
CODE

   Variant v;
   v = Now();
   TDateTime DT = v.operator TDateTime();
   ShowMessage(DT.FormatString("dd.mm.yyyy hh:mm:ss"));
AVC
Отправлено: 09.02.2005, 17:51


Ветеран

Группа: Модератор
Сообщений: 1583



Тогда еще проще (если вы уверены,что Excel возвращает тип TDate/TDateTime)
tDate = vDate;
А если не DateTime то нужно применить соответствующий конструктор.
Список и параметры доступны по F1
juice
Отправлено: 09.02.2005, 17:59


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Т том-то и дело, что fromExcelCell возвращает Variant.
2Gedeon : Это уже ближе к теме, теперь я увидел что
ShowMessage(DT.FormatString("dd.mm.yyyy hh:mm:ss"));
показывает : "30.12.1899 03:02:05".
03.02.05 — это и есть дата которая в ячейке екселевской лежит. Но теперь возник вопрос — а почему дата очутилась в поле времени?
Guest
Отправлено: 09.02.2005, 18:07


Не зарегистрирован







QUOTE
том-то и дело, что fromExcelCell возвращает Variant

У каждого варианта есть тип хранимого значения или Empty/Null.
juice
Отправлено: 09.02.2005, 18:33


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Ти значения этой функции varOleStr 0x0008 Reference to a dynamically allocated Unicode string.

Народ! Вот на уникальную проблему наткнулся (она может решить все мои страдания)
rDate = StrToDate("03.02.05"); — в рантайме выдает ошибку -

EConvertError with message ''03.02.05' is not a valid date and time.

Какого "03.02.05' а не '03.02.05' ??? Глюк билдера?
juice
Отправлено: 09.02.2005, 19:18


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Уже Горячо:
rDate = StrToDate("03/02/05"); Не выдает ошибку! Теперь вопрос — как заставить понимать эту функцию формат через точку ане косую?
juice
Отправлено: 09.02.2005, 19:32


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Нашел такую вырезку:
Funсtiоn StrТоDаtе(соnst S: String): ТDаtеТimе;
Преобразовывает строковое представление даты в формат ТDаtеТimе. Дата в
параметре S должна быть записана по правилам Windоws, т.е. должна состоять
из двух или трех чисел, отделяемых символом, определенным в глобальной
переменной DаtеSераrаtоr

Что значит "глобальная переменная" ? Это переменная окружения ОС ? Если так то там и в помине такого нету. Что это такое и как ее изменить ?
HKarel
Отправлено: 09.02.2005, 23:56


Не зарегистрирован







DаtеSераrаtоr — это не глобальная переменная окружения ОС, это глобальная переменная "окружения Борланд", инициализируется при запуске программы, а берет свое значение скорее всего по следующему "адресу": Панель управления -> Языки и региональные стандарты -> Региональные параметры -> Настройка -> Дата -> Разделитель компонентов даты.
AVC
Отправлено: 10.02.2005, 10:12


Ветеран

Группа: Модератор
Сообщений: 1583



2juice
QUOTE

Ти значения этой функции varOleStr 0x0008 Reference to a dynamically allocated Unicode string.

От Excel вы получаете строку (возможно ее значение зависит от формата ячейки Excel). Не надо шаманить с функцией StrToDate. Надо преобразовать эту строку к виду, понимаемому конструктором TDateTime (заменой разделителя, изменением локальных настроек ...).
Для стабильной работы приложения нужно заставить Excel возвращать дату в каком либо унифицированном формате и настроить приложение под этот формат. Хорошо бы получить эту дату как int/float тогда все станет легко. smile.gif

Вернуться в Вопросы программирования в C++Builder