Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подсветка слов в TRichView [D7, WinXP]


Garfunkel ©   (2006-01-13 12:54:00) 

Нужно подсветить в тексте все найденный аккордовые символы. Для тех, кто не знает - аккорды могут состоять из заглавных английских букв C,D,E,F,G,A,B,H а также иметь после себя символы - m,m7,7,dim7,#,b,sus4,dim,sus7,6/9 и др. Например -
C6/9, D#7-5, Am7, Gb7+5 и др.
Вопрос как быстро найти и подсветить синим цветом все найденные аккорды? Есть ли какое решение?
Заранее благодарю


Johnmen   (2006-01-13 13:16:00) [1]

Что за компонент? Кто его родитель?


asafr   (2006-01-13 13:16:00) [2]

Решение есть.. Не буду разжевывать и вдаваяться  в подробности - просто выложу процедуру и функцию для реализации подсветки слов (работает в моей программе, но подсвечивет зарезервированые слова SQL жирным текстом)... Переработав процедуру под свои задачи - можешь получить желаемый результат...

var

TheList :array of string; //Список подсвечиваемых слов (у меня формирутся динамически в др. месте)
....
....
procedure Tfm_Main.HighLight(RichE:TRichEdit);
var WStart, WEnd, WEnd2: integer;
 WorkSpace, SWord: string;
begin
 WStart  :=  1;
 WEnd  :=  1;
 with  RichE do
 begin
   WorkSpace  :=  Text + ' ' + #$D#$A;
   while WEnd >  0 do
   begin
     WEnd := SearchFor(WorkSpace, ' ', WStart);
     WEnd2 := SearchFor(WorkSpace, #$A, WStart);
     if WEnd2 <  WEnd then WEnd := WEnd2;
     SWord := copy(WorkSpace, WStart, WEnd - 1);
     if (SWord <>  ' ') and (SWord <> '') then
       if CheckList(SWord) then
       begin
         SelStart  := WStart - 1;
         SelLength := length(SWord);
         SelAttributes.Style := [fsBOLD];
         SelStart := WStart + length(SWord) + 1;
         SelAttributes.Style := [];
       end;
     WStart := WStart + WEnd;
   end;
   SelStart := length(Text)+1;
 end;
end;

function Tfm_Main.CheckList(InString: string): boolean;
var X: integer;
begin
 Result := false;
 X := 1;
 InString := StringReplace(InString, ' ', '',[rfReplaceAll]);
 InString := StringReplace(InString, #$A, '',[rfReplaceAll]);
 InString := StringReplace(InString, #$D, '',[rfReplaceAll]);
 while X <  High(TheList) + 1 do
 if TheList[X] = lowercase(InString) then
 begin
   Result := true;
   X := High(TheList) + 1;
 end
 else inc(X);
end;


Удачи!


Наверх

Титульная страница Поиск, карта сайта Написать письмо