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

Форум программистов: 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 ] 


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

Зарегистрированные пользователи: Google [Bot]


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

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