Не wxWidgets

QT LGPL

January 14th, 2009 Begemot

Говорят QT скоро будет доступно под лицензией LGPL, а это значит ее можно будет свободно использовать для коммерческих продуктов.

Если это правда, то интересно:

1. что будет с wxWidgets (я qt не смотрел из-за цены, но говорят что оно лучше)

2. зачем это Нокии??

3. что дальше делать?:)
 

ссылка раз, ссылка два


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


Precompiled headers

December 30th, 2008 Begemot

На шестом году программирования я наконец дорос до того что бы узнать что такое precompiled headers, как их делать и зачем они нужны:) Раньше я и конечно использовал, благо визард MFC-приложения делает precompiled header по умолчанию и заставляет им пользоватся. Но с переходом на wxWidgets надо было учить самому, а с “учить” у меня что-то последнее время проблемы.

Все оказалось не так и сложно, объясняю на бытов уровне, так что если кто знает как пользоватся – дальше не читайте! Обьясняю на примере VC 2008:

  1. Создаете и добавляете в проект x.h и x.cpp файлы
  2. В x.cpp пишете #include “x.h”
  3. В .h добавляете все все хедеры которые вам нужны
  4. Во все cpp файлы проекта добавляете  #include “x.h”
  5. Вызываете контекстое меню для x.cpp, выбираете свойства файла  С++ ->Precompiled headers -> Create Precompiled headers \Yc  |   x.h    | $(IntDir)\$(TargetName).pch
  6. Теперь настройки проекта, туда же. Use Precompiled headers |   x.h    | $(IntDir)\$(TargetName).pch
  7. Радуйтесь

После этих действий  полная сборка проекта занимает максимум 12 секунд вместо 1:20, и это я еще далеко не все стандартные хедеры вынес в precompiled headers. Компиляция части проекта, тоже быстрее  1-2 секунды.

Знаю что это азы, но вдруг кто как и я их не знает:)

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


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


Сюрпризы sqlite CURRENT_TIMESTAMP

December 13th, 2008 Begemot

Думаете достаточно просто определить стобец как

created TIMESTAMP not null default CURRENT_TIMESTAMP,

и забыть про него. В смысле не задавать значения этого поля при вставке, мол sqlite сама туда добавит текущее время? Напрасно 🙂

SQLite действительно сама занесет в него текущее время при вставке строки, но это будет время в UTC, без учета вашего смещения. В таком случае читать его надо как

SELECT datetime(created, 'localtime') FROM my_table; 

вместо обычного

SELECT created FROM my_table;

Но я думаю что лучше сразу правильно писать в дб, указывая значения для этого столбца как datetime(‘now’, ‘localtime’). В коде использованием SqliteDatabaseLayer, это будет выглядеть примерно так

PreparedStatement* pStatement = db->PrepareStatement(wxT(“INSERT INTO log (created, title) VALUES (datetime(‘now’, ‘localtime’), ?);”));

Больше про функции работы с датой в sqlite.

 

 


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


hex2bin and bin2hex c++ functions

December 11th, 2008 Begemot

Написал тут себе пару функций для перевода массива байт в hex строку и наоборот.  Особого отношения к wxWidgets не имеют, да и сами фунции конечно тривиальные, но может кому съэкономит час работы (а может и два!) работы, а это в наше нелегкое кризисное время, не мало 🙂

#include <assert.h>
#include <vector>
using namespace std;

std::vector<unsigned char> hex2bin(const TCHAR * hexstring)
{
	std::vector<unsigned char> v;
	int ind=-1; 
	bool first=true;
	TCHAR c, b;
	while(hexstring[++ind])
	{
		c=hexstring[ind];
		if( (c>47) &amp;amp;&amp;amp; (c<58)) c-=48; 
		else  if ( (c>64) &amp;amp;&amp;amp; (c<71))  c-=65-10;
		else  if ( (c>96) &amp;amp;&amp;amp; (c<103)) c-=97-10;
		else continue;
		
		if (first) b=c<<4; else v.push_back(static_cast<unsigned char>(b+c));

		first=!first;
	}
	return v;
}

//bufferlen should be at least len*2+1 or len*3 if separator is set
int bin2hex(unsigned char *data, int len, TCHAR *buffer, int bufferlen, TCHAR separator)
{
	assert( ((separator==0) &amp;amp;&amp;amp; (bufferlen>len*2)) || (separator &amp;amp;&amp;amp; (bufferlen>len*3-1)));
	if (((separator==0) &amp;amp;&amp;amp; (bufferlen<len*2+1)) || (separator &amp;amp;&amp;amp; (bufferlen<len*3))) 
	{
		if (bufferlen>0) buffer[0]=0;
		return 0;
	}
	   
	const TCHAR hex[]={_T('0'), _T('1'), _T('2'), _T('3'), _T('4'), _T('5'), _T('6'),
 _T('7'), _T('8'), _T('9'), _T('a'), _T('b'), _T('c'), _T('d'), _T('e'), _T('f')}; 

    int ind=-1;
    while(len>0) 
    {
		buffer[++ind] = hex[*data >> 4];
		buffer[++ind] = hex[*data &amp;amp; 0x0F];
		if (separator!=0) buffer[++ind] = separator;
		++data; --len;
    }
	if (separator!=0) --ind;
	buffer[++ind]=0;
	return ind; // count TCHAR without end \0
}

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