Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выделение слов

19K
01 апреля 2008 года
vitalya777
37 / / 04.03.2008
Я пишу так:


КОД: 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 тоже не выделяется, а это нужно!
8.4K
01 апреля 2008 года
Zor
104 / / 23.04.2006
bool ВыделитьСлово = ((если пред символ не существует) || (если существует, но не входит в набор Буквы)) && ((если посл символ не существует) || (если существует, но не входит в набор Буквы));
// пробелы из образцов убрать!
19K
02 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
bool ВыделитьСлово = ((если пред символ не существует) || (если существует, но не входит в набор Буквы)) && ((если посл символ не существует) || (если существует, но не входит в набор Буквы));
// пробелы из образцов убрать!



спасибо, но можно ли примерчик поподробней?Буду очень благодарен

8.4K
02 апреля 2008 года
Zor
104 / / 23.04.2006
Код:
bool __fastcall 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::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);
    }
  }
// ...
}
19K
03 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
Код:
bool __fastcall 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::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);
    }
  }
// ...
}


спасиба, но не могу понять куда же тут вставить мой код, поможешь разобраться?

8.4K
03 апреля 2008 года
Zor
104 / / 23.04.2006
ну ты тукан. создание и инициализация SearchWords до цикла и все.
19K
03 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
ну ты тукан. создание и инициализация SearchWords до цикла и все.


а у тебя этот код работал? Потому что у меня почему-то выделяет не нужное слово а часть следуещего, не знаешь почему?

8.4K
03 апреля 2008 года
Zor
104 / / 23.04.2006
потому что ты скорее всего "RichEdit1->SelStart = Index - 1;" поменял.
19K
03 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
потому что ты скорее всего "RichEdit1->SelStart = Index - 1;" поменял.



Да нет, я ничего не менял

8.4K
03 апреля 2008 года
Zor
104 / / 23.04.2006
Тогда ктото глючит. Держи пример.

а вообще если нужна подсветка синтаксиса - есть же куда всяких готовых компонентов.
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
19K
07 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
Тогда ктото глючит. Держи пример.

а вообще если нужна подсветка синтаксиса - есть же куда всяких готовых компонентов.
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, что можно сделать?А ссылки все указуют на примеры написанные на Делфи!

8.4K
07 апреля 2008 года
Zor
104 / / 23.04.2006
из за дурного ограничения на размер архива целиком приклеить не могу. вот только проект - сам собери.
вот целиком - на депозите: http://depositfiles.com/files/4597969
с, дельфи - какая разница. практически одно и тоже.
19K
08 апреля 2008 года
vitalya777
37 / / 04.03.2008
Не могу понять что за глюки, может кто-то подскажет?
Я пишу вот-так:
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;
}

Но если искать эти слова в какой-то проге почему-то выделяет не нужные слова, а их кусочки ну и кусочки следующих!Не могу понять проблему!
8.4K
09 апреля 2008 года
Zor
104 / / 23.04.2006
Щас телепат подойдет, он ваш проект удаленно просканирует...
:)
19K
09 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
Щас телепат подойдет, он ваш проект удаленно просканирует...
:)


Этот код должен выделять слова из RichEdit1, я думал понятно всё?
Очень надо, подскажите проблему пожалуйста!

8.4K
09 апреля 2008 года
Zor
104 / / 23.04.2006
Код верный (ну, может кроме for (int i = 0; i < 4; i++) ). Так что без выложенного проекта делать нечего.
19K
09 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
Код верный (ну, может кроме for (int i = 0; i < 4; i++) ). Так что без выложенного проекта делать нечего.



Я бы выложыл, но есть ограничение на размер, может на почту тебе скинуть, бо только ты можешь помочь с этой проблемой!:confused:

8.4K
10 апреля 2008 года
Zor
104 / / 23.04.2006
удали мусор из проекта
(файлы *.~??? *.obj *.tds *.ddp *.$$$ *.dsk *.exe)
оставшееся упакуй и сюда.
19K
10 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
удали мусор из проекта
(файлы *.~??? *.obj *.tds *.ddp *.$$$ *.dsk *.exe)
оставшееся упакуй и сюда.



Извини, но пришлось разделить на 2 архива, просто соберёшь в одну папку потом и будет нормально, надеюсь хоть ты поможешь, на тебя вся надежда!

8.4K
10 апреля 2008 года
Zor
104 / / 23.04.2006
Как это ни странно, косячит свойство WordWrap у RichEdit-a...
Отключите его нафиг.

Довесок:
файл открывать неплохо бы в одном месте проги - в проперти OnClick выберите одну для всех функцию (для меню, кнопки выбора ets). Ну и опять пробелы в образцах...
19K
10 апреля 2008 года
vitalya777
37 / / 04.03.2008
Цитата: Zor
Как это ни странно, косячит свойство WordWrap у RichEdit-a...
Отключите его нафиг.

Довесок:
файл открывать неплохо бы в одном месте проги - в проперти OnClick выберите одну для всех функцию (для меню, кнопки выбора ets). Ну и опять пробелы в образцах...



большое тебе спасибо, теперь всё работает нормально!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог