О выборе фреймворка

November 24th, 2009 Begemot

Почему я стал программировать на wxWidgets


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


CreateStdDialogButtonSizer упрошает жизнь

November 21st, 2009 Begemot

В догонку к последнему посту, нашел еще CreateStdDialogButtonSizer  (этот метод правда есть в документации). Но раньше я почему то создавал кнопки в диалогах, пусть и с использованием wxStdDialogButtonSizer, но в ручную. А теперь можно вместо 12 строчек кода, писать всего две

if (wxSizer * buttonSizer = CreateStdDialogButtonSizer(wxOK | wxCANCEL))
             topSizer->Add(buttonSizer, 0, wxEXPAND | wxALL, 10);

повышая качество и читаемость, ляпота 🙂


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


CreateTextSizer, мелочь а приятно

November 21st, 2009 Begemot

“О сколько нам открытий чудных, готовит ковыряния миг” почти (с)

В сорцах либы нашел такой код

    topsizer->Add(CreateTextSizer(message), flagsBorder2);

Заинтересовался что такое CreateTextSizer(), в документации нету. В сорцах написанно

    // splits text up at newlines and places the
    // lines into a vertical wxBoxSizer
    wxSizer *CreateTextSizer( const wxString &message );

Решил что можно быстро и компактно размещать текст. В результате после следующего кода

wxSizerFlags flagsBorder;
flagsBorder.Border(wxALL, 10);
topSizer->Add(CreateTextSizer(_T("First line \nSecond Line \n\nNext")), flagsBorder);

Сразу четыре сайзера с текстом, но ведь точно такой же визуальный эффект дает и

wxStaticText * itemStaticText = new wxStaticText;
itemStaticText->Create(this, wxID_STATIC, _("First line \nSecond Line \n\nNext"), wxDefaultPosition, wxDefaultSize, 0);
topSizer->Add(itemStaticText, 0, wxGROW | wxALL, 10);

те же четыре строчки на экране, только в 1 сайзере.

Зачем и когда нужен  CreateTextSizer я так и не придумал, а у вас мысли есть?


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Проблемы с потерей конфиг файла

November 3rd, 2009 Begemot

Хочу пожаловаться, может кто поможет советом. Есть программы на написанные на wxWidgets и MFC, стартуют вместе с виндой и завершаются с ней же. При старте, как и рекомендует хелп делаю

wxFileConfig * config = new wxFileConfig(wxGetApp().GetAppName(), wxGetApp().GetVendorName(), dataPath + wxT("clipdiary.cfg")); // will be deleted by wxWidgets automatically

wxConfigBase::Set(config);

Потом периодически читаю\пишу, иногда, но не всегда делаю Flush(true). При выходе из программы и\или при получении сообщения EVT_QUERY_END_SESSION пишу кое-какие данные в цфг, делаю Flush(true). В самом конце делаю делаю вот такое

int MyApp::OnExit()
{
    // Баг, столкнулся с тем что почему-то не пишет в файл надо или flush или удалять указатель (при удалении он сам все пишет)
    // по идее библиотека должна сама удалять объек. но не удаляет. так что будем вручную.
    delete wxConfigBase::Set(NULL);       // Flush and delete config

    return wxApp::OnExit();
}

А проблема в том, что периодически (редко) при запуске программы – конфиг файл оказывается пустой, в смысле или совсем пустой или отсутствующий, не могу точно сказать. Программа при загрузке выдает сообщение ошибку wxWidgets, что-то типа “ошибка конвертации в юникод” точно не помню. Скорее всего проблема происходит при выключении компьютера, наверняка при каком-то “плохом” завершении работы. Раньше об этом писали пользователи, жаловались на то что пропадают настройки… Недавно поймал такое у себя – висели три мои программы на mfc, wxWidgets trunk и  2.8.10 – две последние потеряли все настройки, мфц’шная нет. Вот думаю куда копать и что делать, уже думал делать дублирование настроек во втором файле, но какой-то это странный путь 🙂 Может кто знает как сделать правильно?

 

Кстати, вот инструкция как реализовать ручную загрузку функций из DLL или как в программе использовать функции из Vista API?


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Пару воскресных грабликов

October 26th, 2009 Begemot

Если вы используете проверку на запуск второго экземпляра и переходите на wxWidgets 3, то имейте ввиду что в wxConnection::OnExecute второй и третий параметр надо заменить на с wxChar * data, int size  на  const void * data, size_t size. Иначе не работает и выдает ошибку. Я заметил только спустя месяц использования\разработки двух своих  прог скомпиленных в тройке:)

И еще раньше битмап для картинки в меню можно было получить из главной иконки как wxIcon(wxT("main"), wxBITMAP_TYPE_ICO_RESOURCE, 16, 16), с тройкой под вистой\семеркой это код приводит к кривому отображению иконки, проблемы с прозрачностью, тоже стоит иметь ввиду.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Когда все пишут плохой код…

October 21st, 2009 Begemot

…получается неприятная хрень и приходиться долго отлаживать.

Наткнулся на интересную багу, как раз перед выпуском новой версии – программа падает при выходе. После утра с дебагером, я конечно это победил, но случай интересный. Как я понимаю проблема в совокупности – плохого кода в databaselayer’e, плохого архитектурного решения и небезопасного подхода у меня и ошибки в самой wxWidgets. (disclamer : все выпады против чужого кода, основываются на сугубо субъективных догадках). По отдельности все это в принципе не критично, ну разве кроме ошибки в вх, но раз ее никто еще не обнаружил, видимо нужна редкая комбинация факторов что бы она проявилась, но сойдясь в одном проекте – приводило к падению. Итак

Мои проблемы

Две ошибки – я использовал глобальную переменную объект своего класса, для взаимодействия с базой данных. Все просто открываем, владеем и работаем с базой данных, деструктор разумеется ее закрывает. Раз деструктор все закрывает, то зачем закрывать руками при выходе? Думал я так раньше.

databaselayer

Есть там такой, имхо не очень красивый код

void DatabaseErrorReporter::ResetErrorCodes()
{
   m_strErrorMessage = _("");

   m_nErrorCode = DATABASE_LAYER_OK;
}

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

   m_strErrorMessage = wxEmptyString;  
  //   m_strErrorMessage = _wxT("");  или так

то проблем не было бы.

 

wxWidgets trunk

Ну и похоже есть проблема в самой wx, в логике в e:\Const\wxWidgets-trunk\src\common\strconv.cpp. Там две процедуры забавно вызывают друг друга в цикле

    Flashnote.exe!wxMBConv::ToWChar(wchar_t * dst=0x00000000, unsigned int dstLen=0, const char * src=0x00a1414b, unsigned int srcLen=4294967295)  Строка 161 + 0x14 байт C++
    Flashnote.exe!wxMBConv::MB2WC(wchar_t * outBuff=0x00000000, const char * inBuff=0x00a1414b, unsigned int outLen=0)  Строка 357 + 0x1c байт    C++
    Flashnote.exe!wxMBConv::ToWChar(wchar_t * dst=0x00000000, unsigned int dstLen=0, const char * src=0x00a1414b, unsigned int srcLen=4294967295)  Строка 230 + 0x17 байт C++
    Flashnote.exe!wxMBConv::MB2WC(wchar_t * outBuff=0x00000000, const char * inBuff=0x00a1414b, unsigned int outLen=0)  Строка 357 + 0x1c байт    C++
    Flashnote.exe!wxMBConv::ToWChar(wchar_t * dst=0x00000000, unsigned int dstLen=0, const char * src=0x00a1414b, unsigned int srcLen=4294967295)  Строка 230 + 0x17 байт C++
    Flashnote.exe!wxMBConv::MB2WC(wchar_t * outBuff=0x00000000, const char * inBuff=0x00a1414b, unsigned int outLen=0)  Строка 357 + 0x1c байт    C++
    Flashnote.exe!wxMBConv::ToWChar(wchar_t * dst=0x00000000, unsigned int dstLen=0, const char * src=0x00a1414b, unsigned int srcLen=4294967295)  Строка 230 + 0x17 байт C++

Хорошо все-таки использовать  open source библиотеки, всегда можно пойти и посмотреть в чем затык.  И теперь когда я победил эту проблему, я могу спокойно релизить свой notes manager повышая свой внутренний статус wxWidgets 3.0 до использования в продакшене:)

 

p.s. надо не забыть в багтрекер закинуть описание бага.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Тонкости…

October 2nd, 2009 Begemot

Собираюсь со следующих версий переводить программы (публичные релизы) на 3.0. Собрал с тройкой в принципе легко, некоторые явно видимые баги заметил\поправил сразу, пару багов запостил в trac и они уже тоже исправленны. Но все же решил сначала хотя бы 2-3 недели у себя погонять. И не зря 🙂

Вчера наткнулся на странный баг. Началось все издалека – чувствую комп ведет себя не так как надо… то ли я по клавишам не попадаю, то ли реакция на нажатия неверная. Дальше хуже, стало ясно что что-то не так. Потом выяснил, мой клипбоард менеджер, сидя в трее, периодически,  перехватывает на себя фокус, на невидимое окно…

Испугался, думал я сломал в последней версии (представил как быть с пользователями…), потом оказалось бага только в версии собранной с тройкой. Еще несколько часов ковыряния – нашел где бага, еще часик смог стабильно воспроизвести – все-таки проблема в либе. В общем отписал в trac, сижу весь в надежде что все-таки поправят, а то я буду опечален.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Drag and Drop at wxTreeCtrl

September 26th, 2009 Begemot

Добавлял тут drag and drop к дереву, для своего легкого менеджера заметок, порядком намучался. А все оказывается не так и сложно, надо просто делать так как доктор прописал.

Задача была такая – есть дерево, хочу что бы перетаскивать можно было:

  1. Ветви внутри дерева
  2. Данные (текст) из дерева наружу
  3. Текст снаружи в дерево.

Read the rest of this entry »


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


О лени, багах и тулбарах

September 24th, 2009 Begemot

Человек ленив, увы.

Я давно жаловался на “баг” в тулбаре, была проблема с цветом фона под вистой, в тройке такая же проблема появилась уже и под XP. Я думал засабмитить баг, но лень моя нашептовала мне что не может быть что бы такого еще никто не заметил и не сообщил…

Когда в тройке эта проблема уже вылезла и в хп – я не выдержал, и поволынив еще недельку все-таки написал в багтрекер. Где мне быстро дали понять степень моего падения…

В общем бага была у меня, я использую AUI, проблема была в том что при добавлении тулбара в AUIManager, я указывал Resizable(false), в результате чего тулбар не растягивался на всю ширину окна. Resizable(true) тоже не выход – появляются визуальные артефакты, выкрутился так Resizable(false).MinSize(wxSize(1110, 10)):

itemFrame1->GetAuiManager().AddPane(pToolBar, wxAuiPaneInfo().ToolbarPane().Name(_T("TpplBarPane")).Top().Layer(10).Resizable(false).MinSize(wxSize(1110, 10)).Dockable(false).CaptionVisible(false).CloseButton(false).DestroyOnClose(false).Floatable(false).Gripper(false).Movable(false).PaneBorder(false));

Ну вот теперь красота, а ведь можно было эту проблему решить еще почти год назад… код то в продакшене работает, лень и пофигизм А теперь уже пора на wxAuiToolbar переходить, вроде же в тройке есть уже, буду смотреть в ближайшее время.


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


И снова о нововведениях в wxWidgets 3.0

September 22nd, 2009 Begemot

Пока я потихоньку, потихоньку пробую тройку (собрал для себя прогу на ней, добавил несколько багов в трекер, жду), народ активно знакомится, исследует и пишет офигенные обзоры новшеств wxWidgets 3. Почитал, узнал много нового, все больше и больше хочу перевести продакшен разработку на тройку:)


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.