Получение слова под знаком - C ++, wxWidgets - PullRequest
0 голосов
/ 04 апреля 2011

Я пишу текстовый редактор с использованием фреймворка wxWidgets.Мне нужно, чтобы слово было вставлено в текстовый элемент управления.Вот что я придумал.

static bool IsWordBoundary(wxString& text)
{
    return (text.Cmp(wxT(" "))  == 0 || 
            text.Cmp(wxT('\n')) == 0 ||
            text.Cmp(wxT('\t')) == 0 ||
            text.Cmp(wxT('\r')) == 0);
}

static wxString GetWordUnderCaret(wxTextCtrl* control)
{
    int insertion_point = control->GetInsertionPoint();
    wxTextPos last_position = control->GetLastPosition();
    int start_at, ends_at = 0;

    // Finding starting position: 
    //   from the current caret position, move back each character until 
    //   we hit a word boundary.
    int caret_pos = insertion_point;
    start_at = caret_pos;
    while (caret_pos)
    {        
        wxString text = control->GetRange (caret_pos - 1, caret_pos);
        if (IsWordBoundary (text)) {
            break;
        }

        start_at = --caret_pos;
    }

    // Finding ending position: 
    //   from the current caret position, move forward each character until 
    //   we hit a word boundary.
    caret_pos = ends_at = insertion_point;    
    while (caret_pos < last_position)
    {
        wxString text = control->GetRange (caret_pos, caret_pos + 1);
        if (IsWordBoundary (text)) {
            break;
        }

        ends_at = ++caret_pos;
    }

    return (control->GetRange (start_at, ends_at));
}

Этот код работает должным образом.Но мне интересно, это лучший способ подойти к проблеме?Видите ли вы какие-либо возможные исправления в приведенном выше коде?

Любая помощь будет отличной!

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Знаки препинания являются частью слова? Это в вашем коде - это то, что вы хотите?

0 голосов
/ 05 апреля 2011

Вот как бы я это сделал:

wxString word_boundary_marks = " \n\t\r";
wxString text_in_control     = control->GetValue();
int ends_at                  = text_in_control.find_first_of( word_boundary_marks, insertion_point) - 1;
int start_at                 = text_in_control.Mid(0,insertion_point).find_last_of(word_boundary_marks) + 1;

Я не проверял это, так что, вероятно, есть одна или две ошибки "off-by-one", и вы должны добавить проверки на "not found", конец строки и любые другие маркеры слова. Мой код должен дать вам основу для того, что вам нужно.

...