Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение жирным всех известных проге слов 
:(
    Опции темы
mr.Anderson
Дата 23.6.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Помогите кто-нибудь...

Хочу сделать у себя в блокноте выделение жирным шрифтом всех ключевых слов в C++. И не надо отсылать меня к SynHighlighter или еще куда! Мне самому хочется сделать... и не только потому, что просто хочется. У меня есть на то причины....

Для решения задачи поместил на форму TRichEdit с именем RichEdit1.

Сверху объявляю глобальный AnsiString - массив, содержащий все известные программе слова. Пока для краткости сделал только 2 слова:
Код

const int BASESIZE = 2;
const AnsiString BASE[ BASESIZE ] = { "int", "float" };

Теперь создаю событие OnChange у RichEdit'а, пишу в нем вот такое:
Код

 int curpos = 1; //Метка, откуда начинать поиск
 int cursor = RichEdit1->SelStart;
 TSearchTypes opt;
 opt << stMatchCase;

 for( int x=0; x < BASESIZE; x++ ) //Перебираем всю базу слов
 {
  if( ! RichEdit1->FindTextA( BASE[ x ], curpos, RichEdit1->Text.Length(), opt) ) return;

  curpos = RichEdit1->FindTextA( BASE[ x ], curpos, RichEdit1->Text.Length(), opt) + BASE[ x ].Length(); //Устанавливаем новое значение метки (позиция после найденного слова)

  //Выделяем найденное слово
  RichEdit1->SelStart = curpos - BASE[ x ].Length() - 1;
  RichEdit1->SelLength = BASE[ x ].Length();
  RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold;

  //Снимаем выделение с остальной части текста (после слова и до слова)
  RichEdit1->SelStart = curpos;
  RichEdit1->SelLength = RichEdit1->Text.Length();
  RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >> fsBold;

  RichEdit1->SelStart = 0;
  RichEdit1->SelLength = curpos - BASE[ x ].Length() - 1;
  RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >> fsBold;
 }

 RichEdit1->SelStart = cursor;

Но пишу что-нить - в тексте вообще ничего не выделяется. Только текст помаргивает во время набора. Что такое? Объясните, где я ошибся... 


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 23.6.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Так... Нашел пару ошибок, немного поправил, но работает снова не так, как надо...
Код

static int curpos = 1; //Óêàçûâàåò ïîçèöèþ, ñ êîòîðîé íà÷èíàòü ïîèñê
 int cursor = RichEdit1->SelStart;
 TSearchTypes opt;
 opt << stMatchCase;

 for( int x=0; x < BASESIZE; x++ ) //ïåðåáèðàåì âñå ñëîâà â áàçå
 {
  if( ! (RichEdit1->Text.Delete(1, curpos)).Pos( BASE [ x ] ) )
   continue;

  curpos = RichEdit1->FindTextA( BASE[ x ], curpos, RichEdit1->Text.Length()-curpos, opt) + BASE[ x ].Length(); //Ìåíÿåì ìåòêó
  ShowMessage("Òåêóùàÿ ïîçèöèÿ êóðñîðà: "+IntToStr(curpos));

  //Âûäåëÿåì ýòî ñëîâî
  RichEdit1->SelStart = curpos - BASE[ x ].Length();
  ShowMessage("Òåêóùàÿ ïîçèöèÿ íà÷àëà âûäåëåíèÿ ñëîâà: "+IntToStr(RichEdit1->SelStart));

  RichEdit1->SelLength = BASE[ x ].Length();
  RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold;

  //Ñíèìàåì âûäåëåíèå ñ îñòàëüíîé ÷àñòè òåêñòà ïîñëå ñëîâà
  RichEdit1->SelStart = curpos;
  ShowMessage("Òåêóùàÿ ïîçèöèÿ íà÷àëà âûäåëåíèÿ äëÿ óáèðàíèÿ æèðíîñòè ïîñëå ñëîâà: "+IntToStr(RichEdit1->SelStart));
  RichEdit1->SelLength = RichEdit1->Text.Length()-curpos;
  RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >> fsBold;
  //Ñíèìàåì âûäåëåíèå ñ îñòàëüíîé ÷àñòè òåêñòà äî ñëîâà
  RichEdit1->SelStart = 0;
  RichEdit1->SelLength = curpos - BASE[ x ].Length();
  RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >> fsBold;
 }

 RichEdit1->SelStart = cursor;

На Юникод плиз внимания не обращайте, просто времени нет его исправлять... Суть в том, что выделяет слово, но выделение с остального текста не снимает - весь текст получается жирным. Плюс второе слово из массива вообще не находит. 


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.