Выделение слов
КОД: C/C++
void __fastcall TForm1::N4Click(TObject *Sender)
1. 2. {
3. RichEdit1->Font->Size=10;
4. int StartPos, Position=0, Endpos;
5.
6. AnsiString *SearchWords;
7. SearchWords = new AnsiString[5];
8. SearchWords[0]=" while ";
9. SearchWords[2]=" end ";
10. SearchWords[3]=" While ";
11. SearchWords[4]=" End";
12. for(int i=0;i<5;i++)
13. {
14. Position=0;
15. StartPos = 0;
16.
17. Endpos = RichEdit1->Text.Length();
18.
19. while (Position!=-1)
20. {
21. Endpos = RichEdit1->Text.Length() - StartPos;
22. Position = RichEdit1->FindText(SearchWords, StartPos, Endpos, TSearchTypes()<< stMatchCase);
23.
24. RichEdit1->SelStart = Position;
25. RichEdit1->SelLength = SearchWords.Length();
26. RichEdit1->SelAttributes->Style =RichEdit1->SelAttributes->Style<<fsBold;
27. RichEdit1->SelAttributes->Style =RichEdit1->SelAttributes->Style<<fsItalic;
28. StartPos = Position+SearchWords.Length();
29. }
30. }
31.
Как можно сделать так, чтобы эти слова выделяло только тогда, когда они сами?
Обясняю: просто например в слове Sender слово end тоже выделяет, а мне это не нужно, можно ли как-то это исправить?А если написать в програме " end ", то в слове Sender слово end не выделяется, но когда написать так в тексте : end; , то слово end тоже не выделяется, а это нужно!
// пробелы из образцов убрать!
// пробелы из образцов убрать!
спасибо, но можно ли примерчик поподробней?Буду очень благодарен
{
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::Button1Click (TObject *Sender)
{
// ...
for (int i = 0; i < 5; i++)
{
AnsiString Sample = SearchWords; // слово-образец
AnsiString Stub = Sample; // слово-заглушка
// системный символ как буква на случай коллизий типа EndEndEnd
for (int i = 1; i <= Stub.Length(); i++) Stub = (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;
}
// ставим заглушку чтобы искать дальше
S.Delete(Index, Sample.Length());
S.Insert(Stub, Index);
}
}
// ...
}
{
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::Button1Click (TObject *Sender)
{
// ...
for (int i = 0; i < 5; i++)
{
AnsiString Sample = SearchWords; // слово-образец
AnsiString Stub = Sample; // слово-заглушка
// системный символ как буква на случай коллизий типа EndEndEnd
for (int i = 1; i <= Stub.Length(); i++) Stub = (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;
}
// ставим заглушку чтобы искать дальше
S.Delete(Index, Sample.Length());
S.Insert(Stub, Index);
}
}
// ...
}
спасиба, но не могу понять куда же тут вставить мой код, поможешь разобраться?
а у тебя этот код работал? Потому что у меня почему-то выделяет не нужное слово а часть следуещего, не знаешь почему?
Да нет, я ничего не менял
а вообще если нужна подсветка синтаксиса - есть же куда всяких готовых компонентов.
http://www.delphikingdom.com/asp/itemq.asp?mode=1&ItemID=323
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=52500
http://sourceforge.net/project/showfiles.php?group_id=3221&package_id=86350
а вообще если нужна подсветка синтаксиса - есть же куда всяких готовых компонентов.
http://www.delphikingdom.com/asp/itemq.asp?mode=1&ItemID=323
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=52500
http://sourceforge.net/project/showfiles.php?group_id=3221&package_id=86350
этот пример требует файл indy60.bpi, что можно сделать?А ссылки все указуют на примеры написанные на Делфи!
вот целиком - на депозите: http://depositfiles.com/files/4597969
с, дельфи - какая разница. практически одно и тоже.
Я пишу вот-так:
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;
//RichEdit1->Font->Color=clGreen;
//int StartPos, Position=0, Endpos;
AnsiString *SearchWords = new AnsiString[110];
SearchWords[0] = "while";
SearchWords[1]= "do";
SearchWords[2]= "for";
SearchWords[3]="if";
SearchWords[4]="asm";
SearchWords[5]="continue";
SearchWords[6]="new";
SearchWords[7]="Uses";
SearchWords[8]="default";
SearchWords[9]="operator";
SearchWords[10]="size of";
SearchWords[11]="type";
SearchWords[12]="break";
SearchWords[13]="delete";
SearchWords[14]="friend";
SearchWords[15]="private";
SearchWords[16]="static";
SearchWords[17]="union";
SearchWords[18]="case";
SearchWords[19]="goto";
SearchWords[20]="protected";
SearchWords[21]="struct";
SearchWords[22]="catch";
SearchWords[23]="public";
SearchWords[24]="switch";
SearchWords[25]="virtual";
SearchWords[26]="else";
SearchWords[27]="register";
SearchWords[28]="template";
SearchWords[29]="void";
SearchWords[30] = "class";
SearchWords[31]="return";
SearchWords[32]="this";
SearchWords[33]="const";
SearchWords[34]="cout";
SearchWords[35]="cin";
SearchWords[36]="data";
SearchWords[37]="model";
SearchWords[38]="stack";
SearchWords[39]="fardata";
SearchWords[40]="code";
SearchWords[41]="then";
SearchWords[42]="program";
SearchWords[43]="label";
SearchWords[44]="var";
SearchWords[45]= "procedure";
SearchWords[46]="function";
SearchWords[47]="begin";
SearchWords[48]="end";
SearchWords[49]="write";
SearchWords[50]="read";
SearchWords[51]="writeln";
SearchWords[52]="readln";
SearchWords[53]="dim";
SearchWords[54]="select";
SearchWords[55]= "While";
SearchWords[56]="Do";
SearchWords[57]="For";
SearchWords[58]= "If";
SearchWords[59]="Asm";
SearchWords[60]="Continue";
SearchWords[61]="New";
SearchWords[62]="uses";
SearchWords[63]="Default";
SearchWords[64]="Operator";
SearchWords[65]="Size of";
SearchWords[66]="Type";
SearchWords[67]="Break";
SearchWords[68]="Delete";
SearchWords[69]="Friend";
SearchWords[70]="Private";
SearchWords[71]="Static";
SearchWords[72]="Union";
SearchWords[73]="Case";
SearchWords[74]="Goto";
SearchWords[75]="Protected";
SearchWords[76]="Struct";
SearchWords[77]="Catch";
SearchWords[78]="Public";
SearchWords[79]="Switch";
SearchWords[80]="Virtual";
SearchWords[81]="Else";
SearchWords[82]="Register";
SearchWords[83]="Template";
SearchWords[84]="Void";
SearchWords[85]= "Class";
SearchWords[86]="Return";
SearchWords[87]="This";
SearchWords[88]="Const";
SearchWords[89]="Cout";
SearchWords[90]="Cin";
SearchWords[91]="Data";
SearchWords[92]="Model";
SearchWords[93]="Stack";
SearchWords[94]="Fardata";
SearchWords[95]="Code";
SearchWords[96]="Then";
SearchWords[97]="Program";
SearchWords[98]="Label";
SearchWords[99]="Var";
SearchWords[100]= "Procedure";
SearchWords[101]="Function";
SearchWords[102]="Begin";
SearchWords[103]="End";
SearchWords[104]="Write";
SearchWords[105]="Read";
SearchWords[106]="Writeln";
SearchWords[107]="Readln";
SearchWords[108]="Dim";
SearchWords[109]="Select";
for (int i = 0; i < 4; i++)
{
AnsiString Sample = SearchWords; // слово-образец
AnsiString Stub = Sample; // слово-заглушка
// системный символ как буква на случай коллизий типа EndEndEnd
for (int i = 1; i <= Stub.Length(); i++) Stub = (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;
}
// ставим заглушку чтобы искать дальше
S.Delete(Index, Sample.Length());
S.Insert(Stub, Index);
}
}
delete[] SearchWords;
}
Но если искать эти слова в какой-то проге почему-то выделяет не нужные слова, а их кусочки ну и кусочки следующих!Не могу понять проблему!
:)
:)
Этот код должен выделять слова из RichEdit1, я думал понятно всё?
Очень надо, подскажите проблему пожалуйста!
Я бы выложыл, но есть ограничение на размер, может на почту тебе скинуть, бо только ты можешь помочь с этой проблемой!:confused:
(файлы *.~??? *.obj *.tds *.ddp *.$$$ *.dsk *.exe)
оставшееся упакуй и сюда.
(файлы *.~??? *.obj *.tds *.ddp *.$$$ *.dsk *.exe)
оставшееся упакуй и сюда.
Извини, но пришлось разделить на 2 архива, просто соберёшь в одну папку потом и будет нормально, надеюсь хоть ты поможешь, на тебя вся надежда!
Отключите его нафиг.
Довесок:
файл открывать неплохо бы в одном месте проги - в проперти OnClick выберите одну для всех функцию (для меню, кнопки выбора ets). Ну и опять пробелы в образцах...
Отключите его нафиг.
Довесок:
файл открывать неплохо бы в одном месте проги - в проперти OnClick выберите одну для всех функцию (для меню, кнопки выбора ets). Ну и опять пробелы в образцах...
большое тебе спасибо, теперь всё работает нормально!