wxWebConnect – теперь мечты стают ближе

July 10th, 2009 Begemot

Kirix, компания которая подарила на wxAUI, делает новый подарок – wxWebConnect Web Browser Control Library. wx обертку над  Mozilla Foundation’s Gecko engine (XULRunner). Встраиваемый веб-броузер контрол, взаимодействие с DOM, пост запросы. Вообщем теперь вполне можно написать броузер. Типа как файрфокс только побыстрее:)

Конечно я незнаю насколько библиотека полная, хорошая, безглючная – не пробывал, но Kirix, если я правильно понимаю использует ее в продакшене, так что все должно быть ок.

Незнаю, как у вас – а у меня уже руки чешутся.. это же сколько всего что хотелось можно теперь написать 🙂

P.S. интересно когда она  в wxPython’e появится?


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


Учимся вводить только цифры в wxTextCtrl

September 8th, 2008 Begemot

Поразительная фигня, казалось бы простая задача  и должно быть готовое решение. И правда есть, только поразительно кривое:(

Итак, задача – необходимо дать возможность пользователю указать число, например в настройках, количество записей  для отображения где-нибудь… Первое что приходит в голову – wxSlider, ну знаете такой контрол со стрелочками. Так как у меня диапазон от нуля до 10 000, а возможность задать шаг инкрементации для стрелочек я не нашел, и равен он 1 – то этот вариант, оказывается издевательством над юзером.

Думаем дальше и вспоминаем, про wxTextCtrl и валидаторы. Радуемся и пишем код, что-то типа

m_Count = new wxTextCtrl( this, ID_MAXCLIPTEXT, _T(""), wxDefaultPosition, wxSize(50, -1), 0, wxTextValidator(wxFILTER_NUMERIC, &count));

Я ожидал что контрол будет давать вводить в себя только цифры. Я ошибся, он также пропускал точку и запятую, что еще хоть как-то можно понять, хотя его и не просили. Но еще оказались разрешенными: ‘+’ и ‘–’. Также он спокойно пропускал все буквы кирилицы. Похоже что контрол отфильтровывал только пробел, спецсимволы и латиницу. Хотя даже это можно ввести туда пользуясь драг анд дропом или простой вставкой. Вообщем я разочаровался.

Попробывал задать более конкретно wxFILTER_INCLUDE_CHAR_LIST и разрешил только цифры. “голосуй, не голосуй, все равно … “ (с). Теже траблы со вставкой текста из буфера и …. с кирилицей. Прямо наваждение какое-то.

Решил писать сам, вот что получилось

 
h:
	void OnMaxClipTextUpdated( wxCommandEvent& event );

	wxTextCtrl* m_Count;
	
	unsigned long maxCount;
	long maxInsertionPoint;
	wxString maxCountStr;
	bool maxSetManually;

cpp:
	EVT_TEXT( ID_MAXCLIPTEXT, COPDatabase::OnMaxClipTextUpdated )

	m_Count = new wxTextCtrl( this, ID_MAXCLIPTEXT, _T(""), wxDefaultPosition, wxSize(50, -1), 0);
	m_Count->SetMaxLength(4);


void COPDatabase::OnMaxClipTextUpdated( wxCommandEvent& event )
{
	if (maxSetManually) return;
	wxString str=m_Count->GetValue();
	
	if (str.empty() || (str==wxT(" "))) // вторая проверка нужна для случая когда юзер выделяет все в контроле и жмет пробел
	{
		maxCount=0;
		str=wxT("0");
		maxInsertionPoint=1;
		// or if you want to let empty string - replace last 2 string to these - maxCountStr=wxEmptyString; maxInsertionPoint=0;
	}
		
	if (str.ToULong(&maxCount))
	{ // successfully converted to ulong, check range now
		if (maxCount>10000) maxCount=10000; 
		else if (maxCount<0) maxCount=0;

		maxInsertionPoint=m_Count->GetInsertionPoint();
		maxCountStr=wxString::Format(wxT("%i"), maxCount); // we should do like this! иначе траблы с пробелами, нулями..
	}

	maxSetManually=true;
	m_Count->SetValue(maxCountStr);
	maxSetManually=false;
	m_Count->SetInsertionPoint(maxInsertionPoint);
}

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

Поведение (юзабилити) не идеально, но твердую 4-ку я бы поставил. Хотя в случае если диапазон снизу ограничен не нулем, тогда поведение хреново будет, но у меня такого случая пока не было. Как выход можно исключить динамическую проверку диапазона, и перенести ее в код сохраняющий значение.

Еще совет, лучше поставить ограничение на длину вводимых символов, типа m_Count->SetMaxLength(4); для верхней границы 10000 и т.д.

Пользуйтесь. Высказывайтесь.


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


Явно Устанавливайте Имя Приложения: SetAppName

July 18th, 2008 Begemot

При тестировании новой версии программы, наткнулся на странное поведение. Если Cпереименовать .ехе – она забывает все свои настройки. Казалось бы странно, а на самом деле доку читать надо было внимательнее.

Настройки я храню, в конфиг файле

dataPath = wxStandardPaths().GetUserDataDir() + wxFileName::GetPathSeparator(); //стандартная папка с данным /application data/..

Но GetUserDataDir возвращает папку основываясь на AppName. Если вы не задаете его явно, то это имя ехе файла…

В принципе можно считать это бонусом:) Просто переименовав ехе, пользователь может получить две работающие копии с разными настройками и\или обойти запрет на запуск 2 экземпляров.

Но если это вам не надо, возьмите за правило в самом-самом начале программы использовать:

SetAppName(wxT("YourAppName")); //before GetUserDataDir()
SetVendorName(wxT("YourVendorName"));

Как бонус потом можете использовать в коде wxGetApp().GetAppName(), wxGetApp().GetVendorName() , повышая переносимость кода.


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