→ Для вступления в общество новичков и профессионалов программирования, пожалуйста нажмите здесь ...

Форум программистов: C++, Basic, Delphi, Pascal, JavaScript
Логин: Пароль:
Запомнить?  
@Mail.ru



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Выделение слов 
Автор Сообщение
Начинающий

Регистрация: 10.03.2008
Сообщения: 17

Репутация: 0 [ ? ]
Сообщение Выделение слов
Я пишу так:


[syntax=cpp]void __fastcall TForm1::N4Click(TObject *Sender)
{
RichEdit1->Font->Size=10;
int StartPos, Position=0, Endpos;

AnsiString *SearchWords;
SearchWords = new AnsiString[5];
SearchWords[0]=" while ";
SearchWords[2]=" end ";
SearchWords[3]=" While ";
SearchWords[4]=" End";
for(int i=0;i<5;i++)
{
Position=0;
StartPos = 0;

Endpos = RichEdit1->Text.Length();

while (Position!=-1)
{
Endpos = RichEdit1->Text.Length() - StartPos;
Position = RichEdit1->FindText(SearchWords[i], StartPos, Endpos, TSearchTypes()<< stMatchCase);

RichEdit1->SelStart = Position;
RichEdit1->SelLength = SearchWords[i].Length();
RichEdit1->SelAttributes->Style =RichEdit1->SelAttributes->Style<<fsBold;
RichEdit1->SelAttributes->Style =RichEdit1->SelAttributes->Style<<fsItalic;
StartPos = Position+SearchWords[i].Length();
}
}
[/syntax]

Как можно сделать так, чтобы эти слова выделяло только тогда, когда они сами?
Обясняю: просто например в слове Sender слово end тоже выделяет, а мне это не нужно, можно ли как-то это исправить?


30.03.2008 18:22
Профиль
Профи
Аватара пользователя

Регистрация: 26.02.2008
Сообщения: 112
Откуда: Украина

Репутация: 2 [ ? ]
Сообщение 
1. Используй соответствующую подсветку кода. В разделе объявлений очень хорошо написано как этим пользоваться(зря что-ли я потел над этим?).
2. Приведённый выше код у меня работает нормально. Фраза This is testing of Sender end while выделяется корректно.(вся фраза выделяется 10 шрифтом, слова end и while выделяются жирным курсивом)

_________________
If it works, then it created by ivan-hohol, if not, then I don't know who this created


30.03.2008 19:13
Профиль Отправить email ICQ
Начинающий

Регистрация: 10.03.2008
Сообщения: 17

Репутация: 0 [ ? ]
Сообщение 
да если написать " end ", то в слове Sender слово end не выделяется, но когда написать так: end;, то слово end тоже не выделяется, а это нужно!


30.03.2008 20:35
Профиль
Профи
Аватара пользователя

Регистрация: 26.02.2008
Сообщения: 112
Откуда: Украина

Репутация: 2 [ ? ]
Сообщение 
Если тебе нужно сделать подсветку кода, то используй регулярные выражения

_________________
If it works, then it created by ivan-hohol, if not, then I don't know who this created


01.04.2008 23:11
Профиль Отправить email ICQ
Начинающий

Регистрация: 10.03.2008
Сообщения: 17

Репутация: 0 [ ? ]
Сообщение 
Я пишу так:
[syntax=cpp]
bool __fastcall TForm1::IsChar (char C) // отсев Буквы-НеБуквы
{
if ((C >= '0') && (C <= '9')) return true;
if ((C >= 'A') && (C <= 'Z')) return true;
if ((C >= 'a') && (C <= 'z')) return true;
if (C == 0x1F) return true;
return false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender)
{
RichEdit1->Font->Size=10;
AnsiString *SearchWords = new AnsiString[5];
SearchWords[0] = "end";
SearchWords[1] = "End";
SearchWords[2] = "while";
SearchWords[3] = "While";
for (int i = 0; i < 5; i++)
{
AnsiString Sample = SearchWords[i]; // слово-образец
AnsiString Stub = Sample; // слово-заглушка
// системный символ как буква на случай коллизий типа EndEndEnd

for (int i = 1; i <= Stub.Length(); i++) Stub[i] = (char) 0x1F;
AnsiString S = RichEdit1->Lines->Text; // оригинальный текст

while (1)
{
int Index = S.Pos(Sample); // ищем совпадения
if (!Index) break;

// краевые условия
bool PrevNotPresent = (Index == 1);
bool PrevPresentButFail = ((Index > 1) && (!IsChar(S[Index - 1])));
bool NextNotPresent = ((Index + Sample.Length()) > S.Length());
bool NextPresentButFail = (((Index + Sample.Length()) <= S.Length()) &&
(!IsChar(S[Index + Sample.Length()])));

if ((PrevNotPresent || PrevPresentButFail) && (NextNotPresent || NextPresentButFail))
{
// выделяем слово
RichEdit1->SelStart = Index -1;
RichEdit1->SelLength = Sample.Length();
RichEdit1->SelAttributes->Style = TFontStyles() << fsBold ;
//RichEdit1->SelAttributes->Style = TFontStyles() << fsItalic;
}
// ставим заглушку чтобы искать дальше
S.Delete(Index, Sample.Length());
S.Insert(Stub, Index);
}} delete[] SearchWords;
[/syntax]
Может подскажете в чём моя ошибка, бо выделяет не те слова, а кусочки этих и кусочки следующих и никак не могу понять почему!


07.04.2008 23:24
Профиль
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 


Кто сейчас на конференции

Зарегистрированные пользователи: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
cron
© 2013 «Форум программистов Украины»