- PVSM.RU - https://www.pvsm.ru -
Если вы фрилансер и любите экспериментировать с экзотическими средами под С++, то стоит обратить внимание на экосистему Ultimate++ [1], о которой я узнал совсем недавно благодаря циклу статей Семена Есилевского (ч.1 [2], ч.2 [3], ч.3 [4], ч.4 [5] — все есть на вики [6]) с таким финальным напутствием:
«Перевешивают ли выгоды U++ его необычность и высокий «барьер вхождения»? На мой взгляд, да. U++ – прекрасный выбор для кроссплатформенных проектов, которые разрабатываются «с нуля», особенно если предполагается интенсивное использование баз данных.»
Под катом те нюансы U++, которые удалось раскопать на форуме [7] и в мануалах [8] за месяц ежедневной работы над редактируемым справочником документов, хранящихся в базе. Сразу отмечу, что сравнения с «замечательной троицей» не будет, так как раньше для простейшего gui использовал WTL и с надеждой смотрел на библиотеку eGUI++ [9], которую, к сожалению, автор забросил, а подхватить некому.
Прежде всего, Ultimate++ это ультиматум: либо собственная среда TheIDE, либо, к примеру, такой набор под Windows, как Visual Studio + STL + POCO + WTL. Как следствие, приходится забыть об исключениях, хотя в остальном ядро приличное, что иллюстрируют фрагменты написанного мною кода асинхронной клиент-серверной передачи файлов.
//ограничения:
//функция не должна возвращать значений, а также иметь больше 4х входных параметров
void Func() {};
void Func4(int, double, String, Value) {}
//делегаты для функций
GUI_APP_MAIN
{
Callback cb = callback(Func);
cb();
//stateful
Callback cb4 = callback4(Func4, 1, 2, AsString(3), 4);
cb4();
//stateless
Callback4<int double string value> cb1 = callback(Func4);
cb1(1, 2, AsString(3), 4);
}
//делегаты в классе
class AppMain {
public:
//для THISBACK
typedef AppMain CLASSNAME;
Callback cb;
Callback cb4;
AppMain() {
cb = THISBACK(Func);
cb4 = THISBACK4(Func4, 1, 2, AsString(3), 4);
}
void Func() {};
void Func4(int, double, String, Value) {}
};
//делегаты для объектов
GUI_APP_MAIN
{
AppMain m;
m.cb = callback(&m, &AppMain::Func);
m.cb4 = callback4(&m, &AppMain::Func4, 1, 2, AsString(3), 4);
}
</int>
//класс SomeClass должен иметь конструктор по-умолчанию
Single<someclass>().SomeMethod();
//вывод на экран и в файл
StdLogSetup(LOG_COUT|LOG_FILE);
...
LOG(Format("Total %d files have sendedn", n));
LOG("Total " << n << " files have sended");
VectorMap<string string> config = LoadIniFile(GetExeDirFile("config.ini"));
String host = config.Get("HOST");
int port = ScanInt(config.Get("PORT"));
for (int i = 0; i < config.GetCount(); i++) {
if ("FILE" == config.GetKey(i)) {
Cout() << config[i] << "n";
}
}
//без ожидания завершения
Thread::Start(callback(Func));
//c ожиданием завершения
Thread th;
th.Run(callback(Func));
th.Wait();
Thread::ShutdownThreads();
Насколько я понял, OpenMP не поддерживается, вместо этого предалагается CoWork [10], работающий с делегатами, что для распараллеливания циклов совсем не удобно.
FileIn fp(fname);
Json json;
json("fname", fname)("fsize", (int)fp.GetSize())("fdata", Base64Encode(LoadFile(fname)));
ValueArray jsonAr = ParseJSON(json.ToString());
fname = jsonAr[0];
int fsize = jsonAr[1];
String fdata = Base64Decode(jsonAr[2]);
TcpSocket server;
if (!server.Listen(port)) {
LOG(Format("Can't open server port %d for listeningn", port));
return;
}
for(;;) {
LOG("Waiting...");
TcpSocket socket;
if (socket.Accept(server)) {
String msg = "";
for (int c = socket.Get(); c > 0 && c != 'n'; c = socket.Get()) {
msg.Cat(c);
}
}
}
RegExp reg("(\\)");
String path = "D:\test.txt";
if (reg.Match(path)) {
int last;
int first;
reg.GetMatchPos(0, first, last);
String drive = path.Mid(0, last);
String fname = path.Mid(last);
}
GUI_APP_MAIN
{
double *d = new double(0);
}
Просто посмотрите сюда [11] и сюда [12]. Поклонники php/Yii должны оценить.
QTF это собственный формат U++ для расширенного оформления текста. Используется в RichEdit и при генерации отчетов. В TheIDE имеется специальный дизайнер для экспериментов:
Также предусмотрен специальный диалог для печати отчета (сохранение в pdf есть в недрах ReportWindow):
Color rgb_color = Color(109, 171, 211);
String qtf_color = Format("@(%d.%d.%d)", rgb_color.GetR(), rgb_color.GetG(), rgb_color.GetB());
String qtf;
qtf.Cat(Format("[R9/%s Habrahabr &]", qtf_color));
qtf.Cat(Format("[_%s лента] [ посты] [_%s q\&a] [_%s события] [_%s хабы] [_%s компании]",
qtf_color, qtf_color, qtf_color, qtf_color, qtf_color));
Report rep;
rep << qtf;
ReportWindow().Perform(rep);
Стилевое оформление текста обрамляется тэгами [ и ], причем сначала за скобкой [ идут QTF-идентификаторы, а затем только через пробел текст. В целом принцип как в HTML, разница лишь в наименованиях.
Bazar [13] это набор пользовательских библиотек для специфических нужд, среди которых мне очень пригодилась кроссплатформенная работа с Word/Excel в Office Automation [14]:
#include <OfficeAutomation/OfficeAutomation.h>
GUI_APP_MAIN
{
//Excel
OfficeSheet sheet;
bool xlsOn = sheet.IsAvailable("Microsoft");
if (xlsOn)
sheet.Init("Microsoft");
//Open Office Calc
if (!xlsOn) {
xlsOn = sheet.IsAvailable("Open");
if (xlsOn)
sheet.Init("Open");
}
if (xlsOn) {
FileSel fs;
fs.Type("Файлы таблиц", "*.xls *.xlsx");
fs.AllFilesType();
if (fs.ExecuteOpen("Выберите Excel файл")) {
sheet.OpenSheet(~fs, true);
sheet.AddSheet(true);
}
}
//Word
OfficeDoc doc;
//Если установлен Word2003 и Word2007, открывается почему-то Word2003. Разработчик разводит руками.
bool docOn = doc.IsAvailable("Microsoft");
if (docOn)
doc.Init("Microsoft");
//Open Office Writer
if (!docOn) {
docOn = doc.IsAvailable("Open");
if (docOn)
doc.Init("Open");
}
if (docOn) {
FileSel fs;
fs.Type("Файлы Word", "*.doc *.docx *.rtf");
fs.AllFilesType();
if (fs.ExecuteOpen("Выберите Word файл")) {
doc.OpenDoc(~fs, true);
doc.AddDoc(true);
}
}
}
SetLanguage(SetLNGCharset(GetSystemLNG(), CHARSET_UTF8));
obj.f()
не трансформировался бы в obj.f() ()
Вливайтесь! Многие моменты, которые я не выписал, требуют активного улучшения. 32 мб с небольшим дистрибутива этого заслуживают.
Автор: shtr
Источник [16]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-3/45660
Ссылки в тексте:
[1] Ultimate++: http://www.ultimatepp.org/
[2] ч.1: http://osa.samag.ru/get/OpenSource068.zip
[3] ч.2: http://osa.samag.ru/get/OpenSource069.zip
[4] ч.3: http://osa.samag.ru/get/OpenSource070.zip
[5] ч.4: http://osa.samag.ru/get/OpenSource071.zip
[6] вики: http://ru.wikipedia.org/wiki/Ultimate%2B%2B
[7] форуме: http://www.ultimatepp.org/forum/
[8] мануалах: http://www.ultimatepp.org/www%24uppweb%24documentation%24en-us.html
[9] eGUI++: http://msdn.microsoft.com/ru-ru/magazine/cc534994.aspx
[10] CoWork: http://www.ultimatepp.org/reference$CoWork$en-us.html
[11] сюда: http://www.ultimatepp.org/srcdoc$Sql$tutorial$en-us.html
[12] сюда: http://www.ultimatepp.org/src$Sql$SqlExp$en-us.html
[13] Bazar: http://www.ultimatepp.org/www$uppweb$bazaar$en-us.html
[14] Office Automation: http://www.ultimatepp.org/srcdoc$OfficeAutomation$OfficeAutomation$en-us.html
[15] примеры реальных приложений: http://www.ultimatepp.org/www%24uppweb%24apps%24en-us.html
[16] Источник: http://habrahabr.ru/post/194590/
Нажмите здесь для печати.