Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 8

XML в Tokyo 10.2

21.12.2017, 10:13. Показов 1771. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется следующая процедура:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.Button1Click(Sender: TObject);
Var
  Doc: IXMLDocument ;
  D1, D2: TDateTime ;
  XML: String ;
begin
  // Создаем интерфейс IXMLDocument
  Doc := TXMLDocument.Create(EmptyStr);
  Doc.Active  := True ;
  Doc.DocumentElement := Doc.CreateNode('TEST') ;
 
  // Записываем в документ текущую дату
  D1  := Trunc(Now) ;
  Doc.DocumentElement.ChildValues['DATE'] := D1 ;
 
  // проверяем, что в XML: <TEST><DATE>21.12.2017</DATE></TEST>
  XML := Doc.XML.Text ;
 
  // пытаемся прочитать их XML ранее записанную дату
  D2  := Doc.DocumentElement.ChildValues['DATE'] ;
end;
В момент получения даты из XML получаем ошибку:
Could not convert variant of type (OleStr) into type (Double)

Та же ошибка появляется, если вместо даты записывать/читать данные типа Double. Причем в XML число записывается с точкой между целой и дробной частью, а при чтении вылетает с ошибкой, т.к. требует на этом месте запятую.

В Delphi Berlin 10.1 и предыдущих версиях Delphi данный код работал без ошибок. Значит что то изменили в Delphi Tokyo 10.2. Обновился до 10.2.2, ошибка осталась. Операционка с языковыми настройками остались без изменений.
Может в интерфейсах XML что то изменили с языковыми настройками, но ни в справке, ни в исходниках ничего не нашел.
Кто нибудь знает как устранить ошибку чтения даты и числа с плавающей точкой из XML?
Сейчас при записи все конвертирую в строку, а при чтении строки конвертирую в нужный тип. Некрасиво, долго, нудно
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2017, 10:13
Ответы с готовыми решениями:

Chromium для tokyo 10.2
друзья не в курсе есть ли сторонний браузер для FMX. Стандартный Twebbrowser не выполняет задачи. узнал что есть хромиум, для 10.2 не могу...

О Delphi 10 Tokyo и Linux
Недавно вышла новая версия Delphi 10, Tokyo, в которой можно теперь разрабатывать приложения не только для Windows, Mac OS X, iOS и...

Builder 10.2 Tokyo и SQLite
Доброго времени суток! Нужна подсказка или совет. Заказчик заказал приложение с хранением данных в SQLite. Заморачиваться со стандартным...

14
 Аватар для snake32
3518 / 1701 / 236
Регистрация: 26.02.2009
Сообщений: 8,551
Записей в блоге: 6
21.12.2017, 17:37
Цитата Сообщение от Sacred_bpk Посмотреть сообщение
Причем в XML число записывается с точкой между целой и дробной частью, а при чтении вылетает с ошибкой, т.к. требует на этом месте запятую.
Попробуйте так в инициализации:
Delphi
1
FormatSettings.DecimalSeparator := '.';
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 8
21.12.2017, 17:43  [ТС]
Спасибо за совет, но не помогло.
0
 Аватар для MyEternity
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
28.12.2017, 13:19
Цитата Сообщение от Sacred_bpk Посмотреть сообщение
Спасибо за совет, но не помогло.
Как дата в XML записана?
Скриншот дайте.
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 8
28.12.2017, 13:42  [ТС]
XML выглядит самым невинным образом:
XML
1
<TEST><DATE>21.12.2017</DATE></TEST>
скриншот во вложении
Миниатюры
XML в Tokyo 10.2  
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
28.12.2017, 14:05
Sacred_bpk,
Delphi
1
D2:= StrToDate(Doc.DocumentElement.ChildValues['DATE']);
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 8
28.12.2017, 14:13  [ТС]
Да, это работает. Но, ранее, до токио, работало напрямую, без преобразования типа Variant -> String -> TDateTime. Проблема в том, что придётся переделывать очень много кода. Что то при выпуске токио "сломали" в XML. Хотелось бы поправить где то в одном месте и что бы все мои библиотеки заработали в прежнем режиме, без явного преобразования типов.
0
5987 / 4562 / 1096
Регистрация: 29.08.2013
Сообщений: 28,202
Записей в блоге: 3
28.12.2017, 14:20
я тоже попробовал, без приведения не работает

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var
  d1, d2 : Tdate;
  xml : string;
begin
  doc.Active:=True;
  doc.DocumentElement:=doc.CreateNode('test');
  d1:=Now;
  doc.DocumentElement.ChildValues['date']:=DateToStr(d1);
  xml:=doc.XML.Text;
  d2:=StrToDate(doc.DocumentElement.ChildValues['date']);
  ShowMessage(DateToStr(d2));
end;
Цитата Сообщение от Sacred_bpk Посмотреть сообщение
Но, ранее, до токио, работало напрямую, без преобразования типа Variant -> String -> TDateTime.
покажи пример, не верится мне

Добавлено через 44 секунды
Цитата Сообщение от Sacred_bpk Посмотреть сообщение
Проблема в том, что придётся переделывать очень много кода.
хелпер напиши
0
 Аватар для MyEternity
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
28.12.2017, 14:27
Цитата Сообщение от Sacred_bpk Посмотреть сообщение
<TEST><DATE>21.12.2017</DATE></TEST>
Попробуйте в XML изменить запись на такую:
XML
1
<TEST><DATE>2010-06-29T08:26:38.000</DATE></TEST>
Будет работать ваш код?

Добавлено через 3 минуты
Мне кажется что у вас XML построен некорректно.
1. Дата пишется так, как я написал в примере своем.
2. У вас там просто TDate а вы пытаетесь в TDateTime забрать - не факт что XML это даст сделать
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 8
28.12.2017, 14:28  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
покажи пример, не верится мне
немного не понял, что показывать?
прям как в приведенном примере: затолкал в XML дату. Потом XML побродил где то по системе, доехал до получателя, где дата была прочитана и присвоена переменное. Тут проблема думаю не в дате, а в чтении Double. Код не может OleStr преобразовать в Double.
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 8
28.12.2017, 14:33  [ТС]
Цитата Сообщение от MyEternity Посмотреть сообщение
Мне кажется что у вас XML построен некорректно.
1. Дата пишется так, как я написал в примере своем.
2. У вас там просто TDate а вы пытаетесь в TDateTime забрать - не факт что XML это даст сделать
Убрал усечение времени.
Содержимое XML в скриншоте во вложении.
Ошибка та же.
а вот цитата из System.pas:

TDate = type TDateTime;
TTime = type TDateTime;
Миниатюры
XML в Tokyo 10.2  
0
 Аватар для MyEternity
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
28.12.2017, 14:50
Цитата Сообщение от Sacred_bpk Посмотреть сообщение
Содержимое XML в скриншоте во вложении.
Кривое оно.
Не видно отличий???

2010-06-29T08:26:38.000
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 8
28.12.2017, 15:04  [ТС]
Цитата Сообщение от Sacred_bpk Посмотреть сообщение
В Delphi Berlin 10.1 и предыдущих версиях Delphi данный код работал без ошибок. Значит что то изменили в Delphi Tokyo 10.2. Обновился до 10.2.2, ошибка осталась.
Я хочу сказать, что чисто теорeтически пофиг что внутри XML, ибо ранее работало очень хорошо. И тут бац! приехали.
0
5987 / 4562 / 1096
Регистрация: 29.08.2013
Сообщений: 28,202
Записей в блоге: 3
28.12.2017, 15:45
Цитата Сообщение от Sacred_bpk Посмотреть сообщение
немного не понял, что показывать?
покажи рабочий код который раньше работал, а не свой пример

Цитата Сообщение от Sacred_bpk Посмотреть сообщение
ибо ранее работало очень хорошо. И тут бац! приехали.
если у тебя купленная версия - пиши в поддержку
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 8
29.12.2017, 06:47  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
покажи рабочий код который раньше работал, а не свой пример
Ну, например набор функций, которым отдаешь IXMLNode, а они проверяют на Null значение ноды и возвращают её значение или значение по умолчанию.
Delphi
1
2
3
4
5
6
7
8
9
10
11
function AsDateTime(ANode: IXMLNode; ADefaultValue: TDateTime): TDateTime;
begin
  Result  := AsDateTime(ANode.NodeValue, ADefaultValue) ;
end;
 
function AsDateTime(ANodeValue: Variant; ADefaultValue: TDateTime): TDateTime;
begin
  Result  := ADefaultValue ;
  if not VarIsNull(ANodeValue) then
                                  Result  := ANodeValue ;
end;
Вариант с Double значением получился витееватым, ибо интерфейс пишет в XML значение с точкой, а когда читает это значение, требует запятую:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function AsFloat(ANodeValue: Variant; ADefaultValue: Double): Double;
begin
  Result  := ADefaultValue ;
  if not VarIsNull(ANodeValue) then
  begin
    Try
      Result  := ANodeValue ;
    Except On E: EVariantTypeCastError do
      Try
        Result  := StrToFloatDef(ReplaceStr(ANodeValue, '.', ','), ADefaultValue) ;
      Except
        Result  := ADefaultValue ;
      End;
    End;
  end;
end;
Цитата Сообщение от qwertehok Посмотреть сообщение
если у тебя купленная версия - пиши в поддержку
Delphi лиценз. Описал проблему у них. У них пока тишина.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2017, 06:47
Помогаю со студенческими работами здесь

Бесплатная Delphi 10.2.3 Tokyo Starter
https://habrahabr.ru/post/308396/ Компания Embarcadero запустила акцию до 9 сентября 2016 года, по которой можно получить бессрочный...

Vcl.WinXCalendars из Delphi 10.2 Tokyo
Добрый вечер! У кого установлена Delphi 10.2 Tokyo скиньте пожалуйста Vcl.WinXCalendars.pas Нужени из него один компонент, которого в...

Ошибка при компиляции Builder 10.2 Tokyo
Доброго времени суток! Взял с cyberguru функцию для вывода текста по окружности, попробовал скомпилировать и получаю следующие ошибки: ...

Embacadero RAD Studio 10.2 Tokyo (Trial)
Здравствуйте форумчане Не могу разобраться с проблемой работы в IDE, пишет что модули недоступны, чтобы я не делал. Выдаёт такую...

Какие сложности в обновлении XE2 до 10.2 Tokyo
Доброго времени суток всем! Предстоит обновлять (именно апгрейты куплены) XE2 до 10.2 Tokyo, и, соответственно проекты. Проекты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru