2010-01-15 5 views
1

Я нашел этот код через сеть. Это ставит цвет фона выбранных текстов на TRichEdit:delphi TRichEdit Установить цвет фона, исключая пробелы

uses 
RichEdit; 

procedure RE_SetSelBgColor(RichEdit: TRichEdit; AColor: TColor); 
var 
    Format: CHARFORMAT2; 
begin 
    FillChar(Format, SizeOf(Format), 0); 
    with Format do 
    begin 
    cbSize := SizeOf(Format); 
    dwMask := CFM_BACKCOLOR; 
    crBackColor := AColor; 
    Richedit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format)); 
    end; 
end; 

// Example: Set clYellow background color for the selected text. 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
    RE_SetSelBgColor(RichEdit1, clYellow); 
end; 

Однако то, что мне нужно, чтобы исключить пробелы. Кто-нибудь может мне помочь? Любая идея была бы полезна? Моей идеей было бы выбрать все пробельные символы, а затем отформатировать их, но тогда я не знаю, как их выбрать. Кстати, я использую delphi 2009.

ответ

2

@junmats, с помощью этого кода вы можете выбрать любое слово в элементе управления richedit.

испытаны в Delphi 2010 и Windows 7,

uses 
    RichEdit; 

procedure SetWordBackGroundColor(RichEdit : TRichEdit; aWord : String;AColor: TColor); 
var 
    Format: CHARFORMAT2; 
    Index : Integer; 
    Len : Integer; 
begin 
      FillChar(Format, SizeOf(Format), 0); 
      Format.cbSize := SizeOf(Format); 
      Format.dwMask := CFM_BACKCOLOR; 
      Format.crBackColor := AColor; 

      Index := 0; 
      Len := Length(RichEdit.Lines.Text) ; 
      Index := RichEdit.FindText(aWord, Index, Len, []); 

      while Index <> -1 do 
      begin 
       RichEdit.SelStart := Index; 
       RichEdit.SelLength := Length(aWord) ; 
       RichEdit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format)); 
       Index := RichEdit.FindText(aWord,Index + Length(aWord),Len, []) ; 
      end; 
end; 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
      SetWordBackGroundColor(RichEdit1,' ',clYellow);// will mark all spaces 
end; 

если вы хотите выбрать все слова, кроме пространства, вы можете сделать что-то вроде этого

Procedure GetListofWords(Text : String; var ListofWords : TStringList); 
var 
    DummyStr : String; 
    FoundWord : String; 
begin 
    DummyStr := Text; 
    FoundWord := ''; 
    if (Length(Text) = 0) then exit; 

    while (Pos(' ', DummyStr) > 0) do 
    begin 
    FoundWord := Copy(DummyStr, 1, Pos(' ', DummyStr) - 1); 
    ListofWords.Add(FoundWord); 
    DummyStr := Copy(DummyStr, Pos(' ', DummyStr) + 1, Length(DummyStr) - Length(FoundWord) + 1); 
    end; 

    if (Length(DummyStr) > 0) then 
    ListofWords.Add(DummyStr); 

end; 



procedure TForm1.Button1Click(Sender: TObject); 
var 
ListofWords : TStringList; 
i   : integer; 
begin 
      ListofWords:=TStringList.Create; 
      try 
      GetListofWords(RichEdit1.Lines.Text,ListofWords); 
      if ListofWords.Count>0 then 
      for i:=0 to ListofWords.Count - 1 do 
      SetWordBackGroundColor(RichEdit1,ListofWords[i],clYellow); 
      finally 
      ListofWords.Clear; 
      ListofWords.Free; 
      end; 
end; 
+0

выглядит это слово в поиске слово. Используя это, моя программа будет очень медленной, так как у меня очень большой кусок строки. Но я думаю, это лучшее решение для моего ответа. Спасибо большое :-) – junmats

Смежные вопросы