crossplatform.ru

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

4 страниц V  « < 2 3 4  
Ответить в данную темуНачать новую тему
> Программа для создания кроссвордов, Обсуждение программы и кода
Алексей1153
  опции профиля:
сообщение 9.2.2012, 7:37
Сообщение #31


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


можно немного встряну ))

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

с массивом лучше так
Раскрывающийся текст
//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 - я уже говорил, что там не так

Сообщение отредактировал Алексей1153 - 9.2.2012, 7:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xwicked
  опции профиля:
сообщение 9.2.2012, 15:34
Сообщение #32


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей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];  // замена свитча


Сообщение отредактировал xwicked - 9.2.2012, 21:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.2.2012, 19:52
Сообщение #33


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


>>Насчёт остального мне пока квалификации не хватает, чтобы понять, где что

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



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

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

а функция GetPath тоже, наверное, лучше всё же через свич сделать, а не через мап. В данном случае.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xwicked
  опции профиля:
сообщение 9.2.2012, 21:52
Сообщение #34


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 9.2.2012, 20:52) *
...
фиговый вариант :) ...
Ну, в таком случае, я лучше сам буду разбираться и проверять качество советов. Просто этот совет со switch мне дали с другого форума. Извини, пока вопросов больше нет :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.2.2012, 6:45
Сообщение #35


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


свич - это великолепная штука, когда нужно выбрать одину из циферных констант, сравнивая со значением тестируемой переменной (как в mydefines::GetExt )

работает быстро, так как компилятор строит табличную адресацию, а не перебор множества условий, как можно было бы подумать. То есть, практически вычисляется тот же индекс, по которому берётся адрес перехода для jmp , делается переход.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xwicked
  опции профиля:
сообщение 11.6.2012, 16:14
Сообщение #36


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


Оптимизация констант:
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;
- Исправлена нумерация вопросов кроссворда при печати и экспорте;
- Оптимизирована скорость отображения статистики;
- Изменён цветовой стиль сетки кроссворда, уменьшен контраст цветов;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xwicked
  опции профиля:
сообщение 6.5.2013, 21:36
Сообщение #37


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

Благодарю!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  « < 2 3 4
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 6:18