November 21st, 2009 Begemot
В догонку к последнему посту, нашел еще CreateStdDialogButtonSizer (этот метод правда есть в документации). Но раньше я почему то создавал кнопки в диалогах, пусть и с использованием wxStdDialogButtonSizer, но в ручную. А теперь можно вместо 12 строчек кода, писать всего две
if (wxSizer * buttonSizer = CreateStdDialogButtonSizer(wxOK | wxCANCEL))
topSizer->Add(buttonSizer, 0, wxEXPAND | wxALL, 10);
повышая качество и читаемость, ляпота 🙂
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 я так и не придумал, а у вас мысли есть?
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 configreturn wxApp::OnExit();
}
А проблема в том, что периодически (редко) при запуске программы – конфиг файл оказывается пустой, в смысле или совсем пустой или отсутствующий, не могу точно сказать. Программа при загрузке выдает сообщение ошибку wxWidgets, что-то типа “ошибка конвертации в юникод” точно не помню. Скорее всего проблема происходит при выключении компьютера, наверняка при каком-то “плохом” завершении работы. Раньше об этом писали пользователи, жаловались на то что пропадают настройки… Недавно поймал такое у себя – висели три мои программы на mfc, wxWidgets trunk и 2.8.10 – две последние потеряли все настройки, мфц’шная нет. Вот думаю куда копать и что делать, уже думал делать дублирование настроек во втором файле, но какой-то это странный путь 🙂 Может кто знает как сделать правильно?
Кстати, вот инструкция как реализовать ручную загрузку функций из DLL или как в программе использовать функции из Vista API?
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), с тройкой под вистой\семеркой это код приводит к кривому отображению иконки, проблемы с прозрачностью, тоже стоит иметь ввиду.
October 21st, 2009 Begemot
…получается неприятная хрень и приходиться долго отлаживать.
Наткнулся на интересную багу, как раз перед выпуском новой версии – программа падает при выходе. После утра с дебагером, я конечно это победил, но случай интересный. Как я понимаю проблема в совокупности – плохого кода в databaselayer’e, плохого архитектурного решения и небезопасного подхода у меня и ошибки в самой wxWidgets. (disclamer : все выпады против чужого кода, основываются на сугубо субъективных догадках). По отдельности все это в принципе не критично, ну разве кроме ошибки в вх, но раз ее никто еще не обнаружил, видимо нужна редкая комбинация факторов что бы она проявилась, но сойдясь в одном проекте – приводило к падению. Итак
Мои проблемы
Две ошибки – я использовал глобальную переменную объект своего класса, для взаимодействия с базой данных. Все просто открываем, владеем и работаем с базой данных, деструктор разумеется ее закрывает. Раз деструктор все закрывает, то зачем закрывать руками при выходе? Думал я так раньше.
databaselayer
Есть там такой, имхо не очень красивый код
и вызывается он и их процедуры закрытия. Вот если бы там было написано грамотно,
то проблем не было бы.
wxWidgets trunk
Ну и похоже есть проблема в самой wx, в логике в e:\Const\wxWidgets-trunk\src\common\strconv.cpp. Там две процедуры забавно вызывают друг друга в цикле
Хорошо все-таки использовать open source библиотеки, всегда можно пойти и посмотреть в чем затык. И теперь когда я победил эту проблему, я могу спокойно релизить свой notes manager повышая свой внутренний статус wxWidgets 3.0 до использования в продакшене:)
p.s. надо не забыть в багтрекер закинуть описание бага.
October 2nd, 2009 Begemot
Собираюсь со следующих версий переводить программы (публичные релизы) на 3.0. Собрал с тройкой в принципе легко, некоторые явно видимые баги заметил\поправил сразу, пару багов запостил в trac и они уже тоже исправленны. Но все же решил сначала хотя бы 2-3 недели у себя погонять. И не зря 🙂
Вчера наткнулся на странный баг. Началось все издалека – чувствую комп ведет себя не так как надо… то ли я по клавишам не попадаю, то ли реакция на нажатия неверная. Дальше хуже, стало ясно что что-то не так. Потом выяснил, мой клипбоард менеджер, сидя в трее, периодически, перехватывает на себя фокус, на невидимое окно…
Испугался, думал я сломал в последней версии (представил как быть с пользователями…), потом оказалось бага только в версии собранной с тройкой. Еще несколько часов ковыряния – нашел где бага, еще часик смог стабильно воспроизвести – все-таки проблема в либе. В общем отписал в trac, сижу весь в надежде что все-таки поправят, а то я буду опечален.
September 26th, 2009 Begemot
Добавлял тут drag and drop к дереву, для своего легкого менеджера заметок, порядком намучался. А все оказывается не так и сложно, надо просто делать так как доктор прописал.
Задача была такая – есть дерево, хочу что бы перетаскивать можно было:
September 24th, 2009 Begemot
Человек ленив, увы.
Я давно жаловался на “баг” в тулбаре, была проблема с цветом фона под вистой, в тройке такая же проблема появилась уже и под XP. Я думал засабмитить баг, но лень моя нашептовала мне что не может быть что бы такого еще никто не заметил и не сообщил…
Когда в тройке эта проблема уже вылезла и в хп – я не выдержал, и поволынив еще недельку все-таки написал в багтрекер. Где мне быстро дали понять степень моего падения…
В общем бага была у меня, я использую AUI, проблема была в том что при добавлении тулбара в AUIManager, я указывал Resizable(false), в результате чего тулбар не растягивался на всю ширину окна. Resizable(true) тоже не выход – появляются визуальные артефакты, выкрутился так Resizable(false).MinSize(wxSize(1110, 10)):
Ну вот теперь красота, а ведь можно было эту проблему решить еще почти год назад… код то в продакшене работает, лень и пофигизм А теперь уже пора на wxAuiToolbar переходить, вроде же в тройке есть уже, буду смотреть в ближайшее время.
September 22nd, 2009 Begemot
Пока я потихоньку, потихоньку пробую тройку (собрал для себя прогу на ней, добавил несколько багов в трекер, жду), народ активно знакомится, исследует и пишет офигенные обзоры новшеств wxWidgets 3. Почитал, узнал много нового, все больше и больше хочу перевести продакшен разработку на тройку:)