Вчера вечером была написанна функция. Сегодня утром 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.
1 комментарий:
Отправил им насчет визуальных багов:
http://www.kirix.com/forums/viewtopic.php?f=15&t=600
Обещают написать новый wxToolBar =)
Отправить комментарий