Хороший рецепт для функциональности «номеров строк» - PullRequest
0 голосов
/ 23 декабря 2011

Мне нужно добавить нумерацию строк в мое приложение (c ++ / cli - .net2.0), которое является редактором кода для специализированного языка программирования.

Проблема в исполнении моего решения. Я сделал это так, для каждого события textChanged моего элемента управления _rtbCode эта функция запускается:

void DocumentElement::SetupLineNumbersCount() {
    StringBuilder ^builder = gcnew StringBuilder();
    if(_tbLineNumbers->Lines->Length > _rtbCode->Lines->Length) {
        for(int i = 0; i <= _rtbCode->Lines->Length;) {
            if(i != 0) builder->Append("\r\n");
            builder->Append(++ i);
            builder->Append(".");
        }
        _tbLineNumbers->Text = builder->ToString();
    }
    else if(_tbLineNumbers->Lines->Length < _rtbCode->Lines->Length) {
        builder->Append(_tbLineNumbers->Text);
        for(int i = _tbLineNumbers->Lines->Length; i < _rtbCode->Lines->Length;) {
            builder->Append("\r\n");
            builder->Append(++ i);
            builder->Append(".");
        }
        _tbLineNumbers->Text = builder->ToString();
    }
}

Где _tbLineNumbers - это текстовое поле, в которое помещаются номера строк. Это слишком медленно (я сравнил это с некоторыми другими редакторами кода). Я попытался вставить пару строк (около 10000), и у меня огромная задержка реакции. Я уверен, что эта функция является узким местом в моем приложении, и я не знаю, как ее улучшить, пожалуйста, помогите - некоторые советы. Спасибо и Счастливого Рождества :) 1006 *

(я был там: Как напечатать номера строк для текстового поля в c # )

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

Было бы лучше обновить номер строки TextBox при событиях прокрутки / изменения размера кода TextBox?

Таким образом, вам нужно будет заботиться только о видимом наборе строк и набратьокно кода не потребует обновления номеров строк.

GetFirstVisibleLineIndex

GetLastVisibleLineIndex

Это может помочь вамтоже!

0 голосов
/ 23 декабря 2011

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

Я бы посоветовал вам взглянуть более прозаично.

Вам действительно нужно проверять System.Environment.Newline символов и даже тогда, только когда текстдобавляется программно, например, копировать, вставлять, открывать файл и т. д. В противном случае вы можете проверить наличие события нажатия клавиши, чтобы определить, была ли нажата клавиша возврата или ввода (так как они вставляют символы новой строки в текст).

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

В качестве альтернативы, сделайте так, чтобы нумерация строк занимала первые 4 символа каждой строки (как пример) с кодом, начинающимся с позиции7. Опять же, рассчитывайте номер строки только тогда, когда происходит событие новой строки, автоматически добавляя номер строки и следующие 3 пробела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...