[delphi] Richedit kolorowanie

0

Witam

2 raz w swojej aplikacji korzystam z richedit szukałem rozwiązania na google ale nie do końca znalazłem bo miałem jak pokolorować słowo wyszukane ale nie do końca mi o to chodzi.

Do rzeczy w richedit mam tekst

"imie+karol_n
ul+krakowska_1
kod+65001_poznan"

i nie mam pojęcia jak pokolorować każdy wyraz do znaku + by uzyskać efekt

"imie+karol_n
ul+krakowska_1
kod+65001_poznan"

proszę o pomoc

0

W pętli for w każdej linii zaznaczasz fragment do wystąpienia znaku i ustawiasz atrybut tekstu.

0

W pętli for w każdej linii zaznaczasz fragment do wystąpienia znaku i ustawiasz atrybut tekstu

Aha, za pomocą RichEdit.SelAttributes.Color ?
Zastosuj to do 215 linii ;-)

0

Od czego są pętle?

0

no i nadal mam problem bo nie wiem jak zrobić aby zaznaczyło w pętli każdy wyraz do wyznaczonego znaku

jedynie co udało mi się odszukać to

var start : LongInt;

   szukane_slowo : String;

begin

 szukane_slowo := '+';

 with RichEdit1 do

   begin

     start := FindText(szukane_slowo, 0, Length(Text), [stMatchCase]);

     while start<>-1 do

       begin

         SelStart := start;

         SelLength := ?????;  //nie wiem jak obliczyć aby od znaku pokolorowało do początku każdej lini

         SelAttributes.color := clred;

         start := FindText(szukane_slowo, start+Length(szukane_slowo), Length(Text), [stMatchCase]);

       end;

   end;
end;
0

Pos

Btw. pisałeś, że chcesz kolorować pierwszy wyraz w każdej linii. Dlaczego nie skorzystasz z Lines i nie przejdziesz po całym w pętli for? RichEdit1.Lines[0], RichEdit1.Lines[1] itd?

0

bo każda linia ma różną długość pierwszego wyrazu

to działam dalej :)

0

maxi12: ale przecież AdamPL Tobie napisał - Pos jest rozwiązaniem.
I co z tego że wyrazy mają różną długość jak kończą się znakiem "+".

0

bo każda linia ma różną długość pierwszego wyrazu

LOL

0

no dobra to mam na razie taki kod

 var
 StartPos,i,lines: Integer;
begin
     with RichEdit1 do
     begin

for i :=0 to RichEdit1.Lines.Count-1 do
   SetFocus;

  SelStart  :=  
  SelLength :=  pos('+', richedit1.Lines.text);
SelAttributes.Color := clred;
     end;

tylko nie wiem co wstawić w selstart .. aby zaczelo od początku lini

0

tylko nie wiem co wstawić w selstart .. aby zaczelo od początku lini

0? :D

Tylko zmień richedit1.Lines.Text na richedit1.Lines.Strings[i] tak żeby zwracał kolejne linie z richedit.

0

to dałem

  SelStart  := 0;
  SelLength :=  pos('+', richedit1.lines.Strings[i]);

i zaznacza tylko pierwsza linie niezależnie czy w pierwszenij lini jest zna + czy nie ma

0

Zamiast zera ustaw na początek linii.

Jak to zrobić masz opisane w gotowcach, szukaj RichEdit1.Perform.

Poza tym można zrobić to na piechotę ustawiając SelStart na odpowiedni znak, wcześniej trzeba policzyć ilość znaków w poprzednich liniach i zsumować. Innymi słowy:
1 linia zaczyna się na znaku 0
2 linia zaczyna się na znaku 0 + długość linii 1
3 linia zaczyna się na znaku 0 + długość linii 1 + długość linii 2

Oczywiście lepiej będzie jak skorzystasz z Perform z parametrem EM_LINEINDEX ale możesz również tym sposobem na piechotę.

0

udało się :)

Dziękuje Adam za wskazówki i cierpliwość:) ale gdybyś mógł jeszcze zerknąć czy aby na pewno jest dobrze ;)
co prawda koloruje też znak '+' ale to już drobiazg

var
i: Integer;
begin

     with RichEdit1 do
     begin

for i :=0 to RichEdit1.Lines.Count -1  do
begin

  SelStart  :=   Richedit1.Perform(EM_LINEINDEX, i,0)  ;
  SelLength :=  pos('+', richedit1.Lines.strings[i]);
SelAttributes.Color := clred;
     end;
   end;
end;
0

blad 2 razy dodalo post

0
maxi12 napisał(a)

co prawda koloruje też znak '+' ale to już drobiazg

Można by w sumie w drugiej pętli kolorować ten znak '+' na czarno :)

b

0

Jeżeli koloruje też '+' to wystarczy odjąć 1 znak od SelLength.

SelLength := Pos() - 1;

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