【问题标题】:delphi TRichEdit Set background color excluding spacesdelphi TRichEdit 设置背景颜色不包括空格
【发布时间】:2010-01-15 06:38:45
【问题描述】:

我在网上找到了这段代码。这会将背景颜色添加到 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。

【问题讨论】:

    标签: delphi colors background trichedit


    【解决方案1】:

    @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;
    

    【讨论】:

    • 看起来这是逐字搜索。使用它会使我的程序非常慢,因为我有一个非常大的字符串。但我想这是我答案的最佳解决方案。 . 非常感谢:-)
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2023-03-25
    • 2017-07-07
    • 2010-09-17
    相关资源
    最近更新 更多