RichEdit- zamiana

0

Hej.
Z góry przepraszam, że z taką głupotą. Niedawno zaczęłam "bawić" się troszkę w Delphi i piszę swoją małą aplikacje z bardzo małą bazą. Mam taki niezbyt istotny, ale dość irytujący mnie problem. Jest sobie RichEdit i wczytuje do niego tekst z bazy (są to jakieś wydarzenia) i każde wydarzenie oddzielam '@!' takim znaczkiem. jak dodaje nowe wydarzenie, to pod F2 mogę sobie wsadzić właśnie taki znaczek '@!' w kolorze czerwonym, ale niestety jak wczytuje z bazy to nie potrafię powtórnie ustawić żeby znaczek '@!' w tekście były czerwone, Próbowałam tak :

RichEdit.SelAttributes.Color:=clRed;
RichEdit.SelAttributes.Style:=[fsBold];
RichEdit.Text:= StringReplace(RichEdit.text,'@!','@!',[rfReplaceAll];

I jestem w kropce, bo jak każda baba jestem uparta i chcę mieć czerwoną małpę :P

1

Po załadowaniu tekstu, ta procedurka powinna pokolorować wszystkie Twoje małpy :)

var moje_malpy : string;
    FoundAt    : LongInt;
    StartPos   : Integer;

begin
   moje_malpy := '@!';

   repeat
     with RichEdit1 do begin
       FoundAt             := FindText(moje_malpy, StartPos, Length(moje_malpy), [stMatchCase]);
       SelStart            := FoundAt;
       SelLength           := Length(moje malpy);
       SelAttributes.Color := clRed;
       SelAttributes.Style := [fsBold];
       StartPos            := FoundAt + SelLength;
     end;
   until FoundAt < 0;
end
0

Baaardzo dziękuję :D
Już się zabieram do sprawdzania :*

1

@Młody: Twój kod mi nie działa, a że nie ogarniałem nigdy za dobrze samodzielnie zamiany tekstu czy jego atrybutów to korzystałem z gotowych przykładów źródeł znalezionych na sieci. Nawet jeżeli zdefiniujemy StartPos na poczatku na 1 to i tak mi koloruje tylko pierwsze wystapienie "@!". Poniźszy kod za to działa prawidłowo dla dowolnego tekstu bez względu na wielkośc liter. Jednak przy dużej ilości tekstu w RichEdit chwile to kolorowanie trwa, ale jeśli chce się mieć formatowanie dużej ilości tekstu jak w edytorach programistycznych to poleceam pytającej skorzystać z komponentów wchodzących w skład pakietu SynEdit. I może mój kod też nie jest doskonały, więc jeżeli ktoś ma jeszcze jakiś działający, szybki i dobry sposób to może go tutaj podać.

var
  TextToFind, ATxt : string;
  StartPos, ATxtLen, FoundPos : Integer;
begin
  TextToFind := AnsiUpperCase('@!');
  with RichEdit1 do
  begin
    Lines.BeginUpdate;
    SelStart := 0;
    SelLength := Length(Text);
    SelAttributes.Color := clWindowText;
    SelStart := 0;
    repeat
      StartPos := SelStart + SelLength + 1;
      ATxtLen := Length(Text) - StartPos + 1;
      ATxt := Copy(AnsiUpperCase(Text), StartPos, ATxtLen);
      FoundPos := Pos(TextToFind, ATxt);
      if FoundPos > 0 then
      begin
        HideSelection := False;
        SelStart := StartPos + FoundPos - 2;
        SelLength := Length(TextToFind);
        SelAttributes.Color := clRed;
      end;
    until FoundPos = 0;
    SelLength := 0;
    Lines.EndUpdate;
  end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1