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]
edytor html ?? użyj SynEdit :)
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 <>..
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;
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 :)
To trzeba wpisać chyba w
Private
JAK SIĘ NIE MYLE!! [diabel]
i się Pifko należy!! :-D
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 ??
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ę... :-)
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 )
To też rozwiązanie koło d... rozbić .. a co jeśli sobie zaznacza kilka wierszów i zmienie cokolwiek ... wtedy algorytm rozsypie się :(
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]
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 :)
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