Kolorowanie RichEdit

0

Jak zrobić, żeby w RE po wpisaniu przez uzytkownika np. <html> zmienił sie tego kolor na np. clBlue... Na 4p jest tylko jak to zrobic w przypadku pojedyńczego znaku { i } , a ja chce zrobić, żeby rozpoznawało jaki tekst jest wpisany i jezeli tekst ten jest uwzględniony np w jakiejs tablicy,, to go odpowiednio pokolorować... [glowa]

0

edytor html ?? użyj SynEdit :)

0

Hmmm...Mam D7PE i jakos nie potrafie tego zainstalowac. Nie dzialają te wskazowki na 4p i zadne inne :( Wolałbym zrobic cos takiego jak "komentarze", które gdzies na 4p leza, ale żeby sprawdzało jakie słowo wpisałem miedzy <>..

0

przyklad.
(na duzych plikach dziala troche wolno)

procedure HTMLSyntaxC(RichEdit: TRichEdit; TextCol, TagCol, DopCol: TColor);
var
  i, iDop: Integer;
  s: string;
  Col: TColor;
  isTag, isDop: Boolean;
begin
  iDop := 0;
  isDop := False;
  isTag := False;
  Col := TextCol;
  RichEdit.SetFocus;

  for i := 0 to Length(RichEdit.Text) do
  begin
    RichEdit.SelStart := i;
    RichEdit.SelLength := 1;
    s := RichEdit.SelText;

    if (s = '<') or (s = '{') then isTag := True;

    if isTag then
      if (s = '"') then
        if not isDop then
        begin 
          iDop  := 1;
          isDop := True; 
        end
        else 
          isDop := False;

    if isTag then
      if isDop then 
      begin
        if iDop <> 1 then Col := DopCol; 
      end
      else 
        Col := TagCol
    else 
      Col := TextCol;

    RichEdit.SelAttributes.Color := Col;

    iDop := 0;

    if (s = '>') or (s = '}') then isTag := False;
  end; 

  RichEdit.SelLength := 0;
  richedit.setfocus;
end; 



// uzycie

  RichEdit1.Lines.BeginUpdate; 
  HTMLSyntaxC(RichEdit1, clBlue, clRed, clGreen);
  RichEdit1.Lines.EndUpdate;
0

Tylko do jakiej procedury ja mam podstawić ten kod ?? Jak daje do jakiej kolwiek w RE to jak tylko zacznę pisać, zmieniany jest kolor czcionki w całym RE, niezależnie od tego, co piszę [stuk] :-/ ;-) [glowa] Stawiam [browar] jak ktos mi pomoże :)

0

To trzeba wpisać chyba w

Private

JAK SIĘ NIE MYLE!! [diabel]

i się Pifko należy!! :-D

0

Taaaa... Za darmo to ja piwa nie rozdaje :P Chyba się nie zrozumieliśmy. Chodzi mi o to, w którym miejscu mam wywołać funkcjcę, a nie gdzie ją wstawić. Tzn. czy ją wstawić w np. OnKeyPress RE czy gdzie ??

0

Taaaa... Za darmo to ja piwa nie rozdaje :P Chyba się nie zrozumieliśmy. Chodzi mi o to, w którym miejscu mam wywołać funkcjcę, a nie gdzie ją wstawić. Tzn. czy ją wstawić w np. OnKeyPress RE czy gdzie ??

do sekcji private dodajesz taką linijkę:

procedure HTMLSyntaxC(RichEdit: TRichEdit; TextCol, TagCol, DopCol: TColor);

teraz dodaj tekst procedury tam gdzie są generowane procedury

procedure HTMLSyntaxC(RichEdit: TRichEdit; TextCol, TagCol, DopCol: TColor);
var
   i, iDop: Integer;
   s: string;
   Col: TColor;
   isTag, isDop: Boolean;
begin
   iDop := 0;
   isDop := False;
   isTag := False;
   Col := TextCol;
   RichEdit.SetFocus;

   for i := 0 to Length(RichEdit.Text) do
   begin
      RichEdit.SelStart := i;
      RichEdit.SelLength := 1;
      s := RichEdit.SelText;

      if (s = '<') or (s = ''
      if isTag then
         if (s = '"') then
            if not isDop then
            begin 
               iDop   := 1;
               isDop := True; 
            end
            else 
               isDop := False;

      if isTag then
         if isDop then 
         begin
            if iDop <> 1 then Col := DopCol; 
         end
         else 
            Col := TagCol
      else 
         Col := TextCol;

      RichEdit.SelAttributes.Color := Col;

      iDop := 0;

      if (s = '>') or (s = ''   end; 

   RichEdit.SelLength := 0;
   richedit.setfocus;
end; 

a żeby funkcja zadziałała dajesz

RichEdit1.Lines.BeginUpdate; 
   HTMLSyntaxC(RichEdit1, clBlue, clRed, clGreen);
   RichEdit1.Lines.EndUpdate; 

na przykład do onkeypress RE

lubię Tatrę... :-)

0

jak bedzie w keypress (itp) to przy dluzszym tekscie (ze 100 linijek) mozesz dostac kur****. bedzie to dosc dzialac (przynajmniej u mnie dzialalo wolno przy 300-siecznej linijce, fakt faktem ze kolosa (komp) nie mam, ale....)
radzilbym to dac gdzies indziej.
np w timerku.

jesli chcesz to dac w keypress (itp) to radze zrobic tak by odswiezalo tylko dana linijke w ktorej jestes, wtedy dziala to szybko
(nawet przy 1000-linijkowym tekscie)

pozdro

ja tyskie
(w koncu to "moj" kodzik :d )

0

To też rozwiązanie koło d... rozbić .. a co jeśli sobie zaznacza kilka wierszów i zmienie cokolwiek ... wtedy algorytm rozsypie się :(

0

No to się niewiele dowiedziałem....To samo robiłem bez waszej pomocy :) Ale problem jest taki, że po wpisaniu np <html> wszystko w RE jest kolorowane w przypadku tego kodu na niebiesko, a chyba tylko same tagi powinny być kolorowane.... [browar]

0

W takim razie będziesz musiał albo sam coś takiego napisać, albo poszukać w necie .. widziałem wiele metod na kolorowanie HTMLa w najróżniejsze sposoby... ewentualnie zmien Delphi na 6tke :) .. i zainstaluj SynEdit :)

0

No mi się udało napisać coś takiego:
Na sam początek - niezbędna funkcja obliczająca na podstawie pozycji kursora w RichEdit (mam na myśli CaretPos) oblicza, który to znak:

function PozycjaToDlugosc(p:Tpoint): Integer;
var i:Integer;
begin
  result:=1;
  for i:=0 to p.Y-1 do
    result:=result+Length(RichEdit1.Lines[i])+2;
  result:=result+p.x;
end;

Czas na zmienną globalną:

StartS: Integer // Początek zaznaczenia i koniec zaznaczenia

W końcu procedura OnKeyPress komponentu RichEdit:

procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
var x:Integer;
begin
  x:=PozycjaToDlugosc(RichEdit1.CaretPos);
  If StartS>x then StartS:=StartS+1;
  If Key='<' then StartS:=x;
  If (Key='>') and (x>StartS) and (RichEdit1.Text[StartS]='<' ) then begin
    RichEdit1.SelStart:=StartS;
    RichEdit1.SelLength:=x-StartS-1;
    RichEdit1.SelAttributes.Color:=clRed;
    RichEdit1.SelStart:=x-1;
    RichEdit1.SelLength:=0;
    RichEdit1.SelAttributes.Color:=clBlack;
  end;
end;

Wydaje mi się, że działa zgodnie z założeniami, chodzi to całkiem płynnie nawet przy tekście długości 1000 i więcej linijek (przynajmniej na moim sprzęcie -Athlon 1800+, 256 DDR RAM). Wydaje mi się, że samo kolorowanie tekstu jest pokręcone jakieś, ale to chyba nie problem zmienić.

//Ile razy można edytować i poprawiać swój post? Powinien być jakiś licznik, bo czuję, że mógłbym rekord ustanowić :-D

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