О тонкостях, точках и запятых

March 26th, 2010 Begemot

Есть у меня модуль для проверки наличия обновлений. Скачивает с сайта тхт файлик, парсит и радует юзверя наличием информации о новой версии.

Периодически народ жаловался что у него не работает, у меня все работало, я конечно бил себя в грудь и грешил на фаерволы, в принципе основания были. Пока однажды вдруг не сломалось у меня.

Начал ковыряться, оказалось фаерволы не причем, вернее не всегда причем. Оказалось что “2.8” это не всегда 2.8, банально правда?:) Вроде бы известно, банально, но пока гром не грянет…

В общем решение вот:

bool wxString::ToCDouble(double * val)  const
Variant of ToDouble() always working in "C" locale.
Works like ToDouble() but unlike it this function expects the floating point number to be formatted always with the rules dictated by the "C" locale (in particular, the decimal point must be a dot), independently from the current application-wide locale (see wxLocale).


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


Как reference counting чуть было не заставил поверить меня в мистику

January 15th, 2008 Begemot

Вчера вечером была написанна функция. Сегодня утром DialogBloks похерил мне весь файл, файл был восстановлен с архива, функция востановленна с аськи\почты. Но одно но – она не работала!, не работал не первый, ни второй вариант, всего было написанно три, третий работал но я проверил его только в конце. Функция простая как две копейки, берем строку, получаем ее внутренний буфер и отдаем винапи для изменения.

Обьявление функции:

void BegUtils::StrMakeLowerUniversal(wxString & data)

Первый

CharLower( data.GetWriteBuf(data.Length()) );

data.UngetWriteBuf();

и второй нерабочий вариант тела

wxStringBuffer buf(data, data.length()+1);

CharLower(buf);

Вчера работало – сегодня нет, классика 🙂

 

Оказалось все дело в контексте вызова – вот так работает

wxString data=_("NTnt НТнт öffnen вікно привет Donnée rápido test");

BegUtils::StrMakeLowerUniversal(data);

wxMessageBox(data);

А вот так уже нет

wxString data1=_("NTnt НТнт öffnen вікно привет Donnée rápido test");

wxString data(data1);

BegUtils::StrMakeLowerUniversal(data);

wxMessageBox(data);

Все оказалось прозаично, оптимизация строк, reference counting и разделямый внутренний буфер. Подробности обьяснять не буду – сам толком не понимаю, а ляпнуть что-нибудь и выглядеть дураком не хочется:) Зато дам вариант функции который работает и который я юзаю.

 

void

BegUtils::StrMakeLowerUniversal(wxString & data)

{

  #ifdef __WIN32__

      int len=data.length()+1;

      wxChar * buf = new wxChar[len];

      wxStrcpy(buf, data.c_str());

      CharLower(buf);

      data=buf;

      delete [] buf;

#else

      data.MakeLower();

#endif

}

 

Кстати это функция преобразования строки к нижнему регистру, которая работает со сторой на любом языке, а не только с латинскими сиволами как стандартная MakeLower. Но только под MSW.


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


wxWindowDestroyEvent

December 20th, 2007 Begemot

В обработчике wxWindowDestroyEvent окно уже какое-то полудохлое, такое ощушение что еще не совсем умерло, но уже попахивает. При IsMaximized() получаем AV. Так что MFCшники бросайте привычку делать что-то в OnDestroy, дружно юзаем деструктор.


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


wxWindowCreateEvent много раз

December 19th, 2007 Begemot

This event is sent just after the actual window associated with a wxWindow object has been created. Since it is derived from wxCommandEvent, the event propagates up the window hierarchy.

Обратите внимание на выделенное. Если хотите использовать этот событие для дополнительной инициализации диалога, по аналогии с OnInitDialog в MFC, то учтите: обработчик OnCreate для wxWindowCreateEvent вызывается много раз, первый раз после инициализации фрейма, а потом после создания каждого контрола. Так что или выберите другое место для дополнительной инициализации или предохраняйтесь:

if(event.GetEventObject()==this)

{

….

}


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