|
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 26
|
||||||
Работа с XML в Builder07.06.2021, 14:29. Показов 10438. Ответов 31
Метки нет (Все метки)
Здравствуйте, Товарищи! Очень нужна помощь профессионала...
Есть вопрос такого плана... Есть прога, которая на сервере берет xml. Есть код на замену xml.
Пример xml у меня есть.
0
|
||||||
| 07.06.2021, 14:29 | |
|
Ответы с готовыми решениями:
31
Работа с XML файлами в Builder С++ C++ Builder и XML
|
|
Модератор
|
|
| 14.06.2021, 09:37 | |
|
Начинаем разбор кода с самого начала, т.е. с момента создания главной формы (void __fastcall TForm1::FormCreate(TObject *Sender))
Сначала создаем список, который будет хранить уникальные номера сообщений. Далее - устанавливаем соединения с локальной БД "планировщика" и выполняем запрос: попытаемся выбрать все записи, статус которых = 0, т.е. не обработанных Если таких записей нет, т.е. база либо пуста, либо все оповещения уже выполнены - сообщаем об этом и выходим из обработчика события создания формы. В противном случае - вызываем функцию GetList() которая выбирает из набора данных, полученных при выполнении запроса, уникальные номера сообщений и формирует из них список, который мы создали в самом начале, инициализируем переменную СurrentDt (эта переменная будет хранить дату/время последнего срабатывания таймера) текущими значениями даты и времени и запускаем таймер.событие таймера (void __fastcall TForm1::Timer1Timer(TObject *Sender)) На каждый тик таймера (он составляет примерно 30 сек.) выполняем запрос в БД планировщика, нет ли в базе записей о невыполненных событиях, время выполнения которых приходится на промежуток между текущим моментом и предыдущим стартом таймера. Если набор данных не пуст - изменяем значение переменной CurrentDt на текущие дату и время, формируем и показываем сообщение. Вот тут-то и надо подумать о поведении программы при отсутствии реакции пользователя на появление сообщения... событие корректного закрытия окна сообщения (void __fastcall TForm1::TaskDialog1ButtonClicked(TObject *Sender, TModalResult ModalResult, bool &CanClose)) Просто меняем запись в локальной БД, устанавливая для нее признак 1, т.е. флаг того, что сообщение было показано и прочитано. Событие нажатия на кнопку загрузки XML-файла (void __fastcall TForm1::Button1Click(TObject *Sender)) Вызываем стандартное диалоговое окно открытия файла. Если файл не выбран - выходим, ничего не делая. Если файл выбран - останавливаем таймер, грузим файл в компонент XMLDocument1 и активируем этот компонент. Дальше идет парсинг XML-документа, т.е. последовательно в цикле обрабатываются все дочерние субноды ноды "table", которые имеют имя, отличное от "types". При обработке каждой такой ноды сначала идет проверка на валидность: проверяется что номер сообщения представлен корректным числом, что такого номера сообщения нет в БД, что дата/время показа сообщения является корректной датой и дата эта не является "далеким прошлым человечества". Все это делается функцией Check(). Если текущая нода условию удовлетворяет - заполняется структура rec (она объявлена в h-файле) и после этого структура передается на динамическое создание запроса на добавление данных в БД, запрос выполняется, данные добавляются после чего обновляется НД текущих заданий, обновляется список уникальных номеров, переинициализируется переменная CurrentDt и снова стартует таймер. Так, что там еще осталось? Событие уничтожения главной формы (void __fastcall TForm1::FormDestroy(TObject *Sender)) Ну, там мы просто освобождаем память, отведенную при создании формы под список уникальных номеров. Как-то так...
1
|
|
|
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 26
|
|
| 14.06.2021, 10:56 [ТС] | |
|
Спасибо большое!!!
Если можно, поясните ещё функции, которые описанные в первых трёх абзацах...
0
|
|
|
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 26
|
||||||
| 14.06.2021, 11:12 [ТС] | ||||||
0
|
||||||
|
Модератор
|
|
| 15.06.2021, 04:24 | |
|
Правда, про первую не упоминал... Но, я думаю, из названия понятно что она делает: ищет в XML-файле ноду с заданным именем и, если нода найдена, возвращает указатель на эту ноду, в противном случае возвращает NULL... Получает в качестве параметра ноду, которая будет "началом отсчета" и от которой будет осуществляться рекурсивный поиск ноды, имя которой задается вторым параметром.
Про остальные две функции я писал в посте #21, сейчас даже выделю эти места...
0
|
|
|
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 26
|
|
| 15.06.2021, 08:28 [ТС] | |
|
Спасибо Вам огромное!!!!
С меня причитается ) Конечно, "благодаря" очень слабому, на данный момент, знанию языка, разбираться мне нужно будет усиленно... Но всё равно СПАСИБО за помощь )
0
|
|
|
Модератор
|
|
| 17.06.2021, 10:20 | |
Сообщение было отмечено Zidane как решение
Решение
Не знаю, актуально еще или нет, но вот доделал маленько...
Как и раньше мы загружаем локальную БД планировщика из файла XML, отсеивая сообщения с одинаковыми номерами и с пророченной датой запуска. Каждое сообщение может находиться в одном из 3-х состояний: активно, выполнено (т.е. пользователь видел сообщение и нажал на кнопку "Принято!") и просрочено - такой статус присваивается либо при старте программы, если дата/время запуска уже прошло, либо если сообщение отработало, но пользователь никак на это не отреагировал. При наступлении "Времени Ч" как и раньше появляется окно сообщения, которое висит на экране ровно минуту, после чего закрывается автоматически, но текущее сообщение принимает статус "Просрочено". Сделал так же возможность просмотра принятых и просроченных сообщений. Причем есть возможность повторно открыть просроченное сообщение и тогда оно становится выполненным.
2
|
|
|
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 26
|
|
| 17.06.2021, 10:59 [ТС] | |
|
Отлично... Спасибо большое. Сейчас посмотрю )))
Ещё такой вопрос... Как я понял, вы загружаете только один файл xml, который имеется. А как сделать так, чтобы подгружались к списку (к xml), который имеется, ещё и список (xml) с сервера.? (Достаточно кода) Или же я не разобрался, и два подгружается??
0
|
|
|
Модератор
|
||
| 17.06.2021, 11:53 | ||
|
1
|
||
|
place status here
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
|
|
| 17.06.2021, 12:48 | |
|
Когда-то давно делал загрузку файлов (вроде в билдере 2007). Может, подойдет в качестве примера, пусть сама программа в виду давности лет уже не работает. Проект прилагается.
1
|
|
|
0 / 0 / 0
Регистрация: 21.05.2021
Сообщений: 26
|
|
| 18.06.2021, 08:48 [ТС] | |
|
Спасибо большое!
Буду пробовать разбираться )
0
|
|
| 18.06.2021, 08:48 | |
|
XML в С++ Builder - загрузка из БД Как создать xml файл? (C++ Builder 10) Работа с XML через System.Xml Работа с xml. Вывод данных в xml Работа с картинками в builder Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|