Легким движением руки брюки превращаются… (опять поиск и замена wxTextCtrl)
March 3rd, 2008 Begemot Posted in Программирование
Я уже давал ссылку на мою статью про написание Find & Replace для wxWidgets-приложений. Тот код я начинал писать для wxTextCtrl’a со стилем wxTE_RICH, а закончил и окончательно тестировал на wxRichTextCtrl’e. Сейчас я отказался от использования wxRichTextCtrl (только если вдруг его допишут до юзабельного состояния), и вернулся на самый что не на есть простой виндовый эдит, тот который в нотепаде. Пришлось править код поиска и замены. Если вам нужен код для поиска и замены в *обычном* wxTextCtrl (без wxTE_RICH), то правьте код из статьи вместе со мной. Пока я нашел вот что.
1. Выкидываем или убираем под дефайн следующую строчку
#ifdef
WeUseWXRichTextCtrl
//If we have not selection, wxTextCtrl return StartFromBack=StartFromForward=Current_Insertion_Point, but wxRichTextCtrl return -2,-2
if (StartFromBack<0) StartFromBack=StartFromForward=m_Note->GetInsertionPoint();
#endif
2. Дальше оказывается что ищет криво, причина находится в документации. Перед тем как считать startPos и endPos, добавляем следующий код (изврат конечно, но что делать, кому сейчас легко?):
#ifdef WeUseWXTextCtrl
#ifdef
__WIN32__
// проблемма с wxTextCtrl – The multiline text controls always store the text as a sequence of lines separated by \n characters, i.e. in the Unix text format even on non-Unix platforms. This allows the user code to ignore the differences between the platforms but at a price: the indices in the control such as those returned by GetInsertionPoint or GetSelection can not be used as indices into the string returned by GetValue as they’re going to be slightly off for platforms using \r\n as separator (as Windows does), for example.
m_foundPos+=(string.Left(m_foundPos)).Replace(wxT(
"\n"), wxT("\n")); // Returns the number of replacements made.
#endif
#endif
3. В OnReplace убираем или выносим под ифдеф 1 строчку.
if (SelText==FindText)
{
#ifdef
WeUseWXRichTextCtrl
m_Note->DeleteSelection(); // this line is needed only for wxRichTextCtrl and needed not for wxTextCtrl
#endif
m_Note->WriteText(m_findData.GetReplaceString());
}
В итоге брюки превращаются…
Теперь вроде все ок, но если что еще найду – напишу.