Я негодую, SetMinSize

December 23rd, 2009 Begemot

Заметил что после последнего апдейта транка, баг в программе – оказывается изменилась логика библиотеки. Я запоминаю и восстанавливаю при старте программы размеры главного окна, баг был в том, что после запуска не удавалось уменьшить размер окна – сделать его меньше чем оно было в прошлый раз. Оказалось wxFrame::Create(parent, id, _caption, pos, size, style); использует переданные size and pos для вызова SetMinSize(), там даже есть коммент

   // assume the user doesn’t want this window to shrink beneath its initial
    // size, this worked like this in wxWidgets 2.8 and before and generally
    // often makes sense for child windows (for top level ones it definitely
    // does not as the user should be able to resize the window)
    //
    // note that we can’t use IsTopLevel() from ctor

Хорошо хоть в той ревизии с которой я последний раз делал public release этого еще не было. Логика сего действия мне абсолютно непонятна…

В общем потихоньку переезжаю на тройку, тестирую, выгребаю несовместимости.

Posted in Использование | Tags: ,
Comments Off on Я негодую, SetMinSize


Между делом попробовал wxWidgets под Ubuntu

December 7th, 2009 Begemot

Выпало тут 4 часа в течении которых можно было работать только на ноуте. А там у меня недавно установленная убунта 9.10 х64. Сначала немного побаловался, поразбирался с системой (я вроде доволен) потом решил попробовать вх.

Поставил svn, выкачал trunk из репозитория, вспомнил о том, что как компилировать wxWidgets на линуксе я уже писал, по этой же инструкции собрал библиотеку, собрал пару примеров – clipboard, auidemo – и представляете себе, работает! 🙂

Правда, есть и плохой ньюанс, поработав несколько часов в линуксе, всерьоз задумался а стоит ли туда лезть и портировать свои утилиты, энтузиазма немного поубавилось…


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

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), с тройкой под вистой\семеркой это код приводит к кривому отображению иконки, проблемы с прозрачностью, тоже стоит иметь ввиду.

Posted in Использование | Tags: ,
Comments Off on Пару воскресных грабликов


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

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. надо не забыть в багтрекер закинуть описание бага.


Тонкости…

October 2nd, 2009 Begemot

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

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

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


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

September 22nd, 2009 Begemot

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


Аллилуя, wxWidgets 3.0 будет жить :)

September 11th, 2009 Begemot

Недавно я жаловался на большой размер ехе в wxWidgets 3.0, все на что меня хватило это пожаловаться в блоге, спросить на форуме и уйти назад на 2.8. Но есть более цепкие люди, они нашли в чем было дело, теперь все стало легче, екзешник похудел на 2+ мегабайта. Но все равно прибавил 0.7 по сравнению с 2.8 веткой (2.8 вместо 2.1M).

Сейчас как раз сижу перевожу свой notes manager на trunk c 2.8.10. Что радует без проблем скомпилился databaselayer и с небольшими доработками сама программа, теперь вот отлавливаю и правлю различия в логике…

И как раз в этот момент приходит радостная новость wxWidgets 2.9 выпущена в виде официального релиза!

We are pleased to announce the first release in the 2.9 development series. wxWidgets 2.9.0 gives a flavour of what will be provided in the stable wxWidgets 3.0 version next year, and we are interested in your feedback. Enhancements in 2.9 include the removal of the distinction between ANSI and Unicode builds, and a reworked Mac OS X architecture, supporting both 32-bit Carbon and 32-bit/64-bit Cocoa variants (wxOSX/Cocoa at alpha stage). You can get wxWidgets 2.9.0 from the download page.

Или вот по-русски из другого источника

Вышел первый релиз новой экспериментальной ветки кроссплатформенного C++ тулкита для построения графических интерфейсов wxWidgets 2.9.0. В новой ветке:

  1. Прекращено разделение ANSI и Unicode сборок;
  2. Переработан код для поддержки платформы Mac OS X, который теперь поддерживает как 32-bit Carbon, так и 32-bit/64-bit Cocoa API;
  3. Добавлены дополнительные свойства для grid-классов;
  4. Улучшены средства для отображения данных, которые теперь поддерживают комбинированный вывод через списки и деревья;
  5. Переработана документация.
  6. Добавлена поддержка промежуточного сохранения состояния объектов (persistent objects).
  7. Улучшены не связанные с построением GUI интерфейса возможности, такие как циклы обработки событий, таймеры и сокеты;
  8. События теперь могут быть привязаны к любой операции, не обязательно, как раньше, к методу производного от wxEvtHandler класса;

Так что не за горами уже и сама wxWidgets 3.0.  2.9 это просто название для нестабильной ветви, радуемся товарищи.

Вот вам почитать для вдохновения  The Wonderful World of wxWidgets 3.0  лично мне сразу после этого хочется бросить и перейти на 3.0 🙂

А я пока пойду писать в trac чем я недоволен 🙂


Строки в wxWidgets 3.0

September 11th, 2009 Begemot

Тут в комментариях к посту о wxWidgets 3.0 возник вопрос, о том как теперь писать строковые литералы. Вопрос интересные, изменения там существенные и я до сих пор до конца не понимаю, как все таки правильно, поэтому  решил сегодня немного поэкспериментировать с этим вопросом:

wxMessageBox(“тест test”);

Это работает, но это получается ANSI строка, можно использовать только символы текущей локали(ну и конечно первые 127). Добавив реально юникодный текст

wxMessageBox(“öffnen вікно привет Donnée rápido test”);

Получаем несколько warningов C4566 и кривой текст на экране.

В общем что бы работало надо писать одно из трех L””, _T(“”), wxT(“”) – это все сводится к L””. Если нужна локализация тогда так

wxMessageBox(_(L”öffnen вікно привет Donnée rápido test”));

Что не очень удобно, может введут новый макрос который будет делать сразу два дела… Или может он уже есть но я не знаю.

В итоге, если я правильно понимаю, картина такая – если у нас в литерале только английские буквы – пишем просто “text” или _(“text”), в противном случае L”text” или _(L”text”)(вместо L можно использовать любой из двух старых макросов _T()\wxT()). Весь старый код использующий wxT() будет отлично работать.


Попробовал wxWidgets 3.0

August 20th, 2009 Begemot

Вернее конечно еще не саму 3.0, а то, что ей скоро станет – текущее состояние сорцов из транка. Выкачал из репозитория, собрал библиотеку, собрал свою программу. Теперь у меня есть две новости – плохая и хорошая 🙂

Есть у меня программа которая не делает ничего супер специфического, но поддерживает достаточно много базовых, для любой нормальной программы, вещей. Вопреки ожиданиям, удалось достаточно быстро ее скопмилироват. Нашлось только одно место где у функции поменялись параметры и пришлось переделывать код и всего два места, в которых используются deprecated function. В общем ничего серьозного, за 20 минут скомпилил программу даже с выключенным режимом совместимости. Это радует.

Теперь то, что огорчает – размер ехешника вырос почти в два раза с 1.8М до 3.4 в релизе, и до 7M в дебаг версии. Minimal sampe из поставки wxWidgets компилируется в 4.5М кода в релизе (!). С такими делами уже и на QT можно переходить:(
Настройки для сборки wxWidgets я использую стандартные, с одним исключением – меню динамическую сборку на статическую – (/MD(d) -> /MT(d)). Статическую сборку я использую всегда для уменьшения проблем у пользователей.

Спросил на wxForum – все молчат. Но что-то такой располневший exe мне совсем не нравится…