Уроки Iczelion'а




Урок 35. Подсветка синтаксиса в RichEdit - часть 2


&nbsp После этого мы перерисовываем слова, которые нужно отобразить другим цветом.

&nbsp Конечно, этот путь не так прост: есть несколько вещей, которые нужно пофиксить, но вышеизложенный метод работает достаточно хорошо. Скорость отображения на экране более чем удовлетворительна.

&nbsp Теперь давайте сконцентрируемся на деталях. Процедура сабклассинга проста и не требует внимательного рассмотрения. Действительно сложная часть - это когда мы находим быстрый способ поиска слов, которые нужно подсветить. Это усложняется тем, что не надо подсвечивать слова внутри комментариев.

&nbsp Метод, который я использовал, возможно, не самый лучший, но он работает хорошо. Я уверен, что вы сможете найти более быстрый путь. Как бы то ни было, вот он:

&nbsp Я создал массив на 256 двойных слов, заполненный нулями. Каждый dword соответствует возможному ASCII-символу. Я назвал массив ASMSyntaxArray. Например, 21-ый элемент представляет собой 20h (пробел). Я использовал массив для быстрого просмотра таблицы: например, если у меня есть слово "include", я извлекаю первый символ из слова и смотрю значение соответствующего элемента. Если оно равно 0, я знаю, что среди слов, которые нужно подсвечивать, нет таких, которые бы начинались с "i". Если элемент не равен нулю, он содержит указатель на структуру WORDINFO, в которой находится информацию о слове, которое должно быть подсвечено.

&nbsp Я читаю слова, которые нужно подсвечивать, и создаю структуру WORDINFO для каждого из них.

WORDINFO struct WordLen dd ? ; длина слова: используется для быстрого сравнения pszWord dd ? ; указатель на слово pColor dd ? ; указатель на dword, содержащий цвет, которым ; нужно подсвечивать слово NextLink dd ? ; указатель на следующую структуру WORDINFO WORDINFO ends

&nbsp Как вы можете видеть, я использовал длину слова для убыстрения процесса сравнивания. Если первый символ слова совпадает, мы можем сравнить его длину с доступными словами. Каждый dword в ASMSyntaxArray содержит указатель на начало ассоциированного с ним массива WORDINFO. Например dword, который представляет символ "i", будет содержать указатель на связанный список слов, которые начинаются с "i". Поле pColor указывает на слово, содержащее цвет, которым будет подсвечиваться слово. pszWord указывает на слово, которое будет подсвечиваться, преобразованное к нижнему регистру.




Содержание  Назад  Вперед