crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Программа для создания кроссвордов
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
xwicked Дата 6.5.2013, 21:36
  Все изменения:
Цитата
- Добавлена возможность создать словарь из текстового файла со
словами;
- Добавлена возможность выбора путей к файлу свойств, файлу статистики, файлу словаря;
- Исправлена фатальная ошибка при вводе слов в сетку, без координат слов;
- Добавлена поддержка файла кроссворда формата OpenKlest 1.1;
- Добавлено сохранение положений панелей инструментов при выходе из программы;
- Добавлены новые классы: TCell, TGrid и tfileoptions;
- Добавлена возможность удалённого расположения файла свойств;
- В свойства игры добавлены кнопки "Сбросить" и "Восстановить умолчания";
- Изменены ссылки баг-трекера и git;
- Добавлена возможность разворачивания на весь экран окон статистики и руководства пользователя;
- Название программы и номер версии вынесены в отдельный заголовочный файл;

Новая версия 1.2.3
Мной было принято решение о прекращении сборок в linux-пакеты в пользу простоты установки, оформив всё в виде мастера-установщика как в ОС Оффтопик. В связи с замедлением процесса разработки прошу давать советы на крайне необходимые функции и указания на исправление критических ошибок.

Благодарю!
xwicked Дата 11.6.2012, 16:14
  Оптимизация констант:
enum eTypeCrossword {TYPE_PDF, TYPE_POST_SCRIPT, TYPE_RTF, TYPE_HTML, TYPE_TXT, TYPE_JPG, TYPE_JPEG, TYPE_BMP,
                    TYPE_TIFF, TYPE_PNG, TYPE_XPM, TYPE_XBM, TYPE_PPM, TYPE_OPEN_KLEST};
Экспорт в RTF вместе с изображением:
QString TCrosswordGrid::wordToUnicode(QString sWord)
{
    QString sTemp;

    for (int i = 0; i < sWord.length(); i++)
//Добавляет один символ Unicode, если этого не получается сделать, то отображается знак вопроса
        sTemp.append("\\u" + QString::number(sWord.at(i).unicode()) + "?");

    return sTemp;
}

//Формирование RTF-документа и сохранение
void TCrosswordGrid::saveToRTF(QString sExportName, QString strRTF, QImage imgExport)
{
    QByteArray baImage;
    QBuffer buffer(&baImage);
    buffer.open(QIODevice::WriteOnly);
    imgExport.save(&buffer, "BMP");//BMP как обязательный формат изображения
    baImage = baImage.toHex();//Побайтовое преобразование изображения в шестнадцатеричную форму
    QFile ifile(sExportName);
    QTextStream istream(&ifile);
    istream.setCodec("UTF-8");//UTF-8 кодировка документа
    ifile.open(QIODevice::WriteOnly);
//Добавление информации об изображении с сохранением изначального размера
    istream << "{\\rtf1\n{\\pict\\wmetafile8\\picw" + QString::number(columnCount() * rowHeight(0) * 27) + "\\pich"
            + QString::number(rowCount() * rowHeight(0) * 27) + "\n";
    
    int j = 0;

    for (int i = 0; i < baImage.size(); i++)
    {
        if (j == 128)//Если количество символов в строке == 128
        {
            istream << "\n";//То перевод строки; Избавляет от ошибок, при чтении документа.
            j = 0;
        }

        istream << baImage.at(i);
        j++;
    }
    istream << "}\\par\\par\n";
    istream << strRTF;
    istream << "}";
    ifile.close();
}

//Формирование RTF-текста вопросов и ответов
QString TCrosswordGrid::makeRTFText(QString ListWordH, QString ListWordV, QStringList ListOutV, QStringList ListOutH)
{
    QString strRTF;
    QString strText1;
    QString strText2;
    QString strText3;

    for(int i = 0; i < ListOutH.count(); i++)
    {
        strText1.append(wordToUnicode(ListOutH.at(i)) + "\\par\n");
    }

    strText2.clear();

    for(int i = 0; i < ListOutV.count(); i++)
    {
        strText2.append(wordToUnicode(ListOutV.at(i)) + "\\par\n");
    }

    strText3.clear();
    strText3 = "{\\b " + wordToUnicode(tr("Horizontal")) + "}:\\par\n" + wordToUnicode(ListWordH) + "\\par\n" + "{\\b " + wordToUnicode(tr("Vertical"))
               +"}:\\par\n" + wordToUnicode(ListWordV) + "\\par\n";

    strRTF.append("{\\b " + wordToUnicode(tr("Horizontal")) + "}:\\par\n"
                   + strText1 + "\\par\n"
                   "{\\b " + wordToUnicode(tr("Vertical")) + "}:\\par\n"
                   + strText2 + "\\par\n"
                   "{\\b\\i " + wordToUnicode(tr("Answers")) + "}:\\par\n"
                   + strText3 + "\\par\n");
    return strRTF;
}
Использовался материал Википедии. Скачать 1.0.0.
Цитата
Список изменений:
- Повышена безопасность работы игры;
- Добавлен экспорт кроссворда в RTF;
- Исправлена нумерация вопросов кроссворда при печати и экспорте;
- Оптимизирована скорость отображения статистики;
- Изменён цветовой стиль сетки кроссворда, уменьшен контраст цветов;
Алексей1153 Дата 10.2.2012, 6:45
  свич - это великолепная штука, когда нужно выбрать одину из циферных констант, сравнивая со значением тестируемой переменной (как в mydefines::GetExt )

работает быстро, так как компилятор строит табличную адресацию, а не перебор множества условий, как можно было бы подумать. То есть, практически вычисляется тот же индекс, по которому берётся адрес перехода для jmp , делается переход.
xwicked Дата 9.2.2012, 21:52
 
Цитата(Алексей1153 @ 9.2.2012, 20:52) *
...
фиговый вариант :) ...
Ну, в таком случае, я лучше сам буду разбираться и проверять качество советов. Просто этот совет со switch мне дали с другого форума. Извини, пока вопросов больше нет :)
Алексей1153 Дата 9.2.2012, 19:52
  >>Насчёт остального мне пока квалификации не хватает, чтобы понять, где что

задавай вопросы, расскажу, что там я сделал



Цитата(xwicked @ 9.2.2012, 18:34) *
А такой вариант покатит, чтобы switch заменить?

фиговый вариант :)

а функция GetPath тоже, наверное, лучше всё же через свич сделать, а не через мап. В данном случае.
xwicked Дата 9.2.2012, 15:34
 
Цитата(Алексей1153 @ 9.2.2012, 8:37) *
можно немного встряну ))

предлагаю более ООП варианты: ...
Благодарю, вариант enum ee_path_id, enum ee_ext_id я уже сам собирался так оформить. Насчёт остального мне пока квалификации не хватает, чтобы понять, где что :blink: Вчера прочитал главу про классы(C++) - потихоньку буду разбираться.
А такой вариант покатит, чтобы switch заменить?
char Test[13][6] = {".pdf",".ps",".html",".txt",".jpg",".jpeg",".bmp",".tiff",".png",".xpm",".xbm",".ppm",".ok"};  // подготовка
.....
sFilter = Test[iTypeExport];  // замена свитча
Алексей1153 Дата 9.2.2012, 7:37
  можно немного встряну ))

предлагаю более ООП варианты:

с массивом лучше так
Раскрывающийся текст
//A - класс кроссвоода
#include <vector>
class A
{
   enum
   {
     e_W=50,
     e_H=50,
     e_init=0,
   };

   typedef ushort               td_elem;//тип элемента
   typedef std::vector<td_elem> td_row;//тип строки
   typedef std::vector<td_row>  td_table;//тип таблицы

   td_table m_usTable;

   A();
};


A::A()
:m_usTable(e_H,td_row(e_W,td_elem(e_init)))
{
}

//где-то в программе:
ushort current_row=4;
ushort current_col=7;
m_usTable[current_row][current_col]=td_elem('A');


по остальному - глобальные дефайны лучше объединять в класс

файл "mydefines.h"
Раскрывающийся текст
//Определение путей констант, в соответствии с системой
class mydefines
{
public:
    enum
    {
        MODE_VIEW        =true,
        MODE_EDIT        =false,

        ACROSS_ENABLE    =true,
        ACROSS_DISABLE   =false,

        LANGUAGE_RUSSIAN =true,
        LANGUAGE_ENGLISH =false,

        TOOLBAR_SHOW     =true,
        TOOLBAR_HIDE     =false,

        EXPORT_YES       =true,
        EXPORT_NO        =false,
    };

    enum ee_path_id
    {
        PATH_TMP_SET   ,
        PATH_SHARE_DOC ,
        PATH_SHARE_APP ,
        PATH_TMP_STAT  ,
    };

    enum ee_ext_id
    {
        TYPE_PDF         ,
        TYPE_POST_SCRIPT ,
        TYPE_HTML        ,
        TYPE_TXT         ,
        TYPE_JPG         ,
        TYPE_JPEG        ,
        TYPE_BMP         ,
        TYPE_TIFF        ,
        TYPE_PNG         ,
        TYPE_XPM         ,
        TYPE_XBM         ,
        TYPE_PPM         ,
        TYPE_OPEN_KLEST  ,
    };

    //Пути для разработки и отладки программы
    static QString GetPath(ee_path_id id);

    //расширение (без точки)
    static QString GetExt(ee_ext_id id);
};


файл "mydefines.cpp"
Раскрывающийся текст
#include <map>
QString mydefines::GetPath(ee_path_id id)
{
    typedef std::map<ee_path_id,QString> td_map;
    static td_map _map;

    if(_map.empty())
    {
        #if defined(Q_WS_WIN)
            _map[PATH_TMP_SET   ]=QApplication::applicationDirPath() + "/settings.xwsc";
            _map[PATH_SHARE_DOC ]=QApplication::applicationDirPath();
            _map[PATH_SHARE_APP ]=QApplication::applicationDirPath();
            _map[PATH_TMP_STAT  ]=QApplication::applicationDirPath() + "/cstat.html";
        #elif defined(Q_WS_X11)
            _map[PATH_TMP_SET   ]="/tmp/klest-crossword-0.3.7/settings.xwsc";
            _map[PATH_SHARE_DOC ]="/usr/share/doc/klest-crossword-0.3.7";
            _map[PATH_SHARE_APP ]="/usr/share/klest-crossword-0.3.7";
            _map[PATH_TMP_STAT  ]="/tmp/klest-crossword-0.3.7/cstat.html";
        #elif defined(Q_WS_MAC)
            _map[PATH_TMP_SET   ]=QApplication::applicationDirPath() + "/settings.xwsc";
            _map[PATH_SHARE_DOC ]=QApplication::applicationDirPath();
            _map[PATH_SHARE_APP ]=QApplication::applicationDirPath();
            _map[PATH_TMP_STAT  ]=QApplication::applicationDirPath() + "/cstat.html";
        #endif
    }

    td_map::const_iterator it=_map.find(id);
    if(it==_map.end())return "";
    return it->second;
}


QString mydefines::GetExt(ee_ext_id id)
{
    switch(id)
    {
        case TYPE_PDF         :return  "pdf";break;
        case TYPE_POST_SCRIPT :return  "ps" ;break;
        case TYPE_HTML        :return  "html";break;
        case TYPE_TXT         :return  "txt";break;
        case TYPE_JPG         :return  "jpg";break;
        case TYPE_JPEG        :return  "jpeg";break;
        case TYPE_BMP         :return  "bmp";break;
        case TYPE_TIFF        :return  "tiff";break;
        case TYPE_PNG         :return  "png";break;
        case TYPE_XPM         :return  "xpm";break;
        case TYPE_XBM         :return  "xbm";break;
        case TYPE_PPM         :return  "ppm";break;
        case TYPE_OPEN_KLEST  :return  "ok" ;break;
    }

    return "";
}


и где-то в прогремме:

QString filename=
    mydefines::GetPath(mydefines::PATH_SHARE_DOC)
    +"1234"
    +"."
    +mydefines::GetExt(mydefines::TYPE_BMP)
;



ну а по структуре TFileOptions - я уже говорил, что там не так
xwicked Дата 8.2.2012, 22:48
  Здравствуйте! Как я избавился от переполнения стека:
ushort usTable[50][50];//Массив сетки кроссворда
Если делал больше 50-ти, то отваливался импорт файла и запуск руководства пользователя :D
Изменил на:
ushort **usTable;//Массив сетки кроссворда
...
//Создание двумерного динамического массива
        usTable = new ushort*[TableKlestCrossword->rowCount()];

        for(int i = 0; i < TableKlestCrossword->rowCount(); i++)
            usTable[i] = new ushort[TableKlestCrossword->columnCount()];
Далее введены константы:
//Определение путей констант, в соответствии с системой
#if defined(Q_WS_WIN)

    #define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwsc"
    #define PATH_SHARE_DOC QApplication::applicationDirPath()
    #define PATH_SHARE_APP QApplication::applicationDirPath()
    #define PATH_TMP_STAT QApplication::applicationDirPath() + "/cstat.html"


#elif defined(Q_WS_X11)

    #define PATH_TMP_SET "/tmp/klest-crossword-0.3.7/settings.xwsc"
    #define PATH_SHARE_DOC "/usr/share/doc/klest-crossword-0.3.7"
    #define PATH_SHARE_APP "/usr/share/klest-crossword-0.3.7"
    #define PATH_TMP_STAT "/tmp/klest-crossword-0.3.7/cstat.html"

#elif defined(Q_WS_MAC)

    #define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwsc"
    #define PATH_SHARE_DOC QApplication::applicationDirPath()
    #define PATH_SHARE_APP QApplication::applicationDirPath()
    #define PATH_TMP_STAT QApplication::applicationDirPath() + "/cstat.html"


#endif

//Пути для разработки и отладки программы
/*#define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwsc"
#define PATH_SHARE_DOC QApplication::applicationDirPath()
#define PATH_SHARE_APP QApplication::applicationDirPath()
#define PATH_TMP_STAT QApplication::applicationDirPath() + "/cstat.html"*/

#define MODE_VIEW true
#define MODE_EDIT false

#define ACROSS_ENABLE true
#define ACROSS_DISABLE false

#define LANGUAGE_RUSSIAN true
#define LANGUAGE_ENGLISH false

#define TOOLBAR_SHOW true
#define TOOLBAR_HIDE false

#define EXPORT_YES true
#define EXPORT_NO false

#define TYPE_PDF 0
#define TYPE_POST_SCRIPT 1
Что позволило пути в программе менять всего один раз :) Так же появилась возможность убрать лишние условия и оформить в switch:
        switch(iTypeExport)
        {
        case TYPE_PDF:
            sFilter = ".pdf";
            break;

        case TYPE_POST_SCRIPT:
            sFilter = ".ps";
            break;

        case TYPE_HTML:
            sFilter = ".html";
            break;

        case TYPE_TXT:
            sFilter = ".txt";
            break;

        case TYPE_JPG:
            sFilter = ".jpg";
            break;

        case TYPE_JPEG:
            sFilter = ".jpeg";
            break;

        case TYPE_BMP:
            sFilter = ".bmp";
            break;

        case TYPE_TIFF:
            sFilter = ".tiff";
            break;

        case TYPE_PNG:
            sFilter = ".png";
            break;

        case TYPE_XPM:
            sFilter = ".xpm";
            break;

        case TYPE_XBM:
            sFilter = ".xbm";
            break;

        case TYPE_PPM:
            sFilter = ".ppm";
            break;

        case TYPE_OPEN_KLEST:
            sFilter = ".ok";
            break;
        }
Введение структуры файла свойств:
//Структура файла свойств программы
struct TFileOptions
{
     bool bModeWork,//Режим работы программы
          bLanguageProgram,//Язык программы
          bStateStandardToolbar,//Состояние показа стандартной панели
          bStateExport,//Состояние экспортирования
          bCurrentDictionary;//Текущий словарь
     QString sModePassword,//Пароль режима
             sPathCrossword,//Путь для кроссвордов
             sPathExport,//Путь для экспорта
             sPathTemplate;//Путь для шаблонов
     int iNumberTimes,//Количество раз
         iTypeExport;//Тип экспорта
};
Скачать 0.3.7. На данный момент это последняя версия, прошу...
xwicked Дата 28.1.2012, 16:04
  Следующая версия программы 0.2.9. В ней я походу вышел за предел стека :lol: Ошибку я уже нашёл.

Цитата
- Оптимизирован алгоритм выбора слов в 2,5 раза;
- Добавлена возможность экспорта кроссворда в файл, форматов: HTML, PDF, PostScript, текстовый формат AcrossLite, OpenKlest(*.ok);
- Добавлена возможность поворота кроссворда;
- Добавлена возможность автоматического создания и экспорта кроссворда в форматы HTML, PDF, PostScript, текстовый формат AcrossLite, OpenKlest(*.ok);
- Добавлена возможность импорта кроссворда в формате OpenKlest(*.ok);
Экспорт в PDF и PostScript осуществляется достаточно просто: подготавливается HTML-страница и распечатывается на принтере, но печать идёт не на физическое устройство а в файл :)
    QTextEdit textEdit;
    textEdit.setHtml(strHTML);
#ifndef QT_NO_PRINTER

    QPrinter printer(QPrinter::HighResolution);//Настройка принтера на  высокое качество
    printer.setOutputFormat(QPrinter::PostScriptFormat);//Выбор печати в файл PostScript
    printer.setOutputFileName(sExportName);//Присваивание имени файла
    textEdit.document()->print(&printer);//Сама печать

#endif
Хотелось бы отметить, что с появлением функции экспорта кроссворда в Across Lite TXT, у программы across lite 2.0 появилась возможность отгадывать не только американские кроссворды, но и классические, правда всё в английском языке. Можете поэксперементировать, ради интереса :rolleyes:
xwicked Дата 1.12.2011, 5:52
 
Цитата(Sokoloff @ 29.11.2011, 12:05) *
... В линухе можно настроить виртуальный принтер печатающий в PostScript файл.
Благодарю! Я собственно говоря, так и делал. Без этой возможности печать вообще не появилась бы ;) Ну а если разница между печатью в файл и на физическом принтере нулевая, то я и дальше продолжу тестировать её таким же образом :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 14:14