XML Engine -тупик
К средине проекта, сложилась ситуация, когда нужно выбрать нужную концепцию для продолжения работы.
Проблема в следующем:
- Есть проект (расскажу только проблемную часть), в нем есть модуль преобразования некоторой структуры XML кода в готовую программу.
- Т.е. – при запуске программа считывает XML файл и создает по его описанию форму с готовыми элементами управления (ComboBox, ListBox, Button и др. в общей сложности около 15). Создание формы с элементами управления – создается «на лету», т.е. во время исполнения программы.
- Всего 10 XML файлов с разными формами, вот тут то и начинается проблема:[LIST=1]
- Как теперь сделать так, чтобы при запуске файла, в зависимости от его содержимого «на лету» создавались разные обработчики событий для тех элементов управления, которые были описаны в текущем открытом XML файле.
- Т.е. у меня в одном XML файле есть кнопка, которая выводит сообщение «Hello World !» по нажатию на нее, а в другом файле есть тоже кнопка, которая выводит сообщение «Goodbye World !» при нажатии на нее.
- Т.е. описание формата XML абсолютно одинаково, только должны выводиться разные сообщения по нажатию на эти кнопки.
<interface>
<button name=”button1” caption=”click here”
onclick=”как сделать так, чтобы выводилось <Hello World !>” />
<button name=”button2” caption=”click here”
onclick=”как сделать так, чтобы выводилось <Goodbye World !>” />
</interface>
- Написать много обработчиков и в зависимости от аргумента XML файла подставлять той или иной по средствам switch.
- Написать все обработчики для всех элементов управления (т.е. OnClick, OnDbClick, OnChanging и др.) и в каждом с них в зависимости от аргументов XML файла вызывать соответствующий обработчик внутри COM объекта, который будет выполнять необходимые действия и возвращать результат в каком-то виде (например, тот-же XML).
- Или какой еще вариант придумать … я просто не знаю …
---
Заранее благодарен: Евгений.
И ОС - хотя о последней можно предположить, что Windows - судя по COM.
Не совсем понятно, где должен располагаться код обработчика сообщения, допустим, того же OnClick для кнопки. Задан ли он сразу в программе (тогда в чем смысл динамически создавать форму из XML?) или описывается каким-то скриптом, который тоже подгружается динамически?
Или по событиям должны быть доступны только какие-то стандартные действия (типа - по клику кнопки всегда выводить сообщение)?
использовала ХМЛ файлы для сохранения языков интерфейса программы, включая содержание различных сообщений для пользователя, все хорошо работало, проблем не наблюдалось.
И ОС - хотя о последней можно предположить, что Windows - судя по COM.
Язык С++, а ОС - Windows.:)
Изначально - делал через FastScript, но потом когда дошел до обработки DevExpress Grid - понял, что это ошибочный выбор ... :mad:
Да, обработчики записаны в программе, а смысл создавать форму из XML - это задача, которая стоит передо мной (такое ТЗ на работе).
Смысел в том, чтобы как-то "на лету" создавать содержимое обработчиков, т.е. в зависимости от аргументов XML - делать некие действия ...
Нет, действия могут быть совсем разные, от вывода сообщения до какого-то глубокого алгоритма (образно говоря) ...
А вообще смысл данного топика - выбрать приемлемый метод для реализации, или какую-то технологию ...
Заранее благодарен.
Пример на счет MessageBox - просто образно говоря пример для попытки объяснить смысл и суть проблемы ...
в любом случае должна быть логика в определении того или иного действия. если есть набор операций/алгоритмов, которые нужно выполнить в зависимости от выбора той или иной кнопки на различных формах, то возможно стоит продумать какую то комбинацию меток, кодов и т.д., которые обозначают запуск той или иной функции, которые уже заранее описаны в коде, а запускать ее можно через промежуточную функции, в которой можно через тот же switch в зависимости от метки вызывать нужную функцию .... хотя допускаю что возможно есть более умные методы решения. я ничего критического не писала, у меня такие трюки проходили.
На счет switch - я писал в первом посте, я тоже к этому дошел ... Написать набор предопределенных функций, которые затем вызывать в зависимости от обработчика и элемента управления ...
Просто я подумал, что есть может какой-то другой выход, или технология, чтобы это реализовать ...
+1 в сторону switch ! - у кого какие еще будут предложения, очень нужно до понедельника до 09:00 - выбрать решение ...
Заранее благодарен, жду ответа.
Например, можно динамически компилировать код. На C# я бы так и сделал. Это выгодно, если от готового кода нужна высокая производительность. На Си можно заюзать Tiny C, например.
Если скорость не шибко нужна, то да - switch или if решает. Выбираем из заранее заготовленных кусков кода.
onclick=”как сделать так, чтобы выводилось <Hello World !>” />
Это ж вылитый html + javascript! Ну, близко к ним. Как вариант, кинуть на форму WebBrowser, а в него этот код (c добавками) - готово!
Добавил:
Впрочем, вам кроме кнопок нужны и комбобоксы и листбоксы - видимо не пойдёт это предложение.
Я писал - язык С++.
Tiny - это что такое ? - это какой-то скриптовый язык ?!
Зачем, если есть XAML? ;)
Вроде все изложил …
Я бы в ваших жестоких реалиях C++ использвоал XSLT трансформацию интерфейса на XML в HTML + JavaScript и отображение на стандартной компоненте WebBrowser.
А, да, во втором вашем посте. Где были мои глаза?..
Ну Гугл же! Соизвольте поискать! Первые же ссылки.
Это компилятор языка Си. Годится для динамической генерации кода. Впрочем, не уверен, что будет простым вариантом.
Я думал о WPF/XAML, но не стал заикаться о том, что сам пока знаю плохо.
Да, такой вариант я предлагал, очень прост в реализации (по крайней мере для моей задачи), но - руководство отказалось от WEB интерфейса, захотелось Desktop-ное приложение ... :(
Заранее благодарен, жду ответа.
Что плохого в использовании веб-интерфейса в десктоп приложении, тем более что это наиболее быстрый способ получить то, что вам нужно.