Skocz do zawartości

[BCB] Sprawdzanie wpisanego tekstu


Davka

Polecane posty

Witam pisze sobie Edytor HTML i wziołem się teraz za kolorową składnie i mam problem gdy użyje czegoś takiego do sprawdzania wpisanego tekstu:

 

String tekst;
tekst = Memo1->Text;

if(tekst == "<")
{
Memo1->Clear();
}

 

Program będzie sprawdzał czy cały tekst w Memo1 to "<". A moje pytanie jest takie: Jak zrobić aby sprawdzał czy w całym tekście jest znak "<"?

 

P.S: Te "Memo1->Clear()" to na takie testowanie jest oczywiście później tego nie będzie.

Link do komentarza
Udostępnij na innych stronach

Witam ponownie B)

jeżeli chcesz mieć możliwość kolorowania poszczególnych znaków

bądź ich grupy, musisz zamienić kontrolkę Memo na RichEdit.

 

int znak=RichEdit1->Text.Pos('<');
if(znak>0)
{
 RichEdit1->SelStart=znak-1;
 RichEdit1->SelLength=1;
 RichEdit1->SelAttributes->Color=clBlue;
 RichEdit1->SelLength=0;
}

 

Pozdrawiam!

Link do komentarza
Udostępnij na innych stronach

Dalej nie działa :(

 

Edit1: Znaczy koloruje następne litery.

 

o tak :rolleyes:

 

int pozycja=RichEdit1->SelStart;
int znak=RichEdit1->Text.Pos('<');
if(znak>0)
{
 RichEdit1->SelStart=znak-1;
 RichEdit1->SelLength=1;
 RichEdit1->SelAttributes->Color=clRed;
 RichEdit1->SelLength=0;
 RichEdit1->SelStart=pozycja;
 RichEdit1->SelAttributes->Color=clBlack;
}

 

Pozdrawiam!

Link do komentarza
Udostępnij na innych stronach

CYTAT(Davka @ wto, 17 cze 2008 - 21:06)

P.S: Jeszcze jedno pytanie, jak sprawdzać jaki znak został wpisany?

 

 

void __fastcall TForm1::RichEdit1Change(TObject *Sender)
{
if(RichEdit1->Text[RichEdit1->SelStart]=='o') MessageBox(Form1->Handle,"Wpisano ''o''","Programik",MB_OK);
}

 

P.S2: Znalazłem, jeszcze jeden błąd. Gdy użyje tego znaku drugi raz już nie jest kolorowy sad.gif.

 

To nie błąd, tak działa funkcja Pos.

 

Ale spokojnie, poradzimy sobie i z tym :rolleyes:

 

tylko dziś mam już mało czasu...

 

Pozdrawiam!

Link do komentarza
Udostępnij na innych stronach

możesz np. tak:

 

void __fastcall TForm1::RichEdit1Change(TObject *Sender)
{
if(RichEdit1->Text[RichEdit1->SelStart]=='<')
{
 RichEdit1->SelStart=RichEdit1->SelStart-1;
 RichEdit1->SelLength=1;
 RichEdit1->SelAttributes->Color=clRed;
 RichEdit1->SelLength=0;
 RichEdit1->SelStart=RichEdit1->SelStart+1;
 RichEdit1->SelAttributes->Color=clBlack;
}
}

 

Pozdrawiam!

Link do komentarza
Udostępnij na innych stronach

Jeśli chcesz kolorować pojedyncze znaki, to wystarczy coś takiego w OnChange :rolleyes:

 

void __fastcall TForm1::RichEdit1Change(TObject *Sender)
{
switch(RichEdit1->Text[RichEdit1->SelStart])
{
 case '<':
           RichEdit1->SelStart=RichEdit1->SelStart-1;
           RichEdit1->SelLength=1;
           RichEdit1->SelAttributes->Color=clRed;
           RichEdit1->SelLength=0;
           RichEdit1->SelStart=RichEdit1->SelStart+1;
           RichEdit1->SelAttributes->Color=clBlack;
 case '>':
           RichEdit1->SelStart=RichEdit1->SelStart-1;
           RichEdit1->SelLength=1;
           RichEdit1->SelAttributes->Color=clRed;
           RichEdit1->SelLength=0;
           RichEdit1->SelStart=RichEdit1->SelStart+1;
           RichEdit1->SelAttributes->Color=clBlack;
 default: ;
}
}

 

Pozdrawiam!

Link do komentarza
Udostępnij na innych stronach

Ech.. przecież napisałem jak należy to zrobić kilka postów powyżej..

Edit: tak to w Delphi zrobiłem do malowania lui (maluje wszystko oprócz komentarzy wielolinijkowych i napisów):

 

procedure TFCodeGeneral.Check(s: string; t: integer);
var
 a,i,p,m:longint;
 s2,s3 : string;
 k: Integer;
begin
 a := reCode.SelStart;
 with reCode do
 begin
   SelStart := SendMessage(Handle, EM_LINEINDEX, t, 0);
   SelLength := Length(s);
   SelAttributes.Style:=[];
   SelAttributes.color:=clblack;
 end;

 // Maluje komentarze i napisy
 i := 1;
 m := 0; //0-nic, 1-tekst z '', 2- tekst z "", 3 - komentarz
 while i<=Length(s) do
 begin
   case s[i] of
     '''','"': with reCode do
           begin
             if m = 0 then
             begin
               SelStart := SendMessage(Handle, EM_LINEINDEX, t, 0)+i-1;
               p := PosEx(s[i],s,i+1);
               if p <> 0 then
                 SelLength := p-i+1
               else
               begin
                 p := Length(s);
                 SelLength := 1000000;
               end;
               SelAttributes.Color := clBlue;
               Inc(i,p-i);
               SelLength:=0;
               SelAttributes.Color := clBlack;
             end;
           end;
     '-' : begin
             if m in [1,2] then
             with reCode do
             begin
               SelStart := SendMessage(Handle, EM_LINEINDEX, t, 0)+i-1;
               SelLength := 1;
               SelAttributes.Color := clBlue;
             end
             else
             if (i<Length(s)) and (s[i+1] ='-') then
             with reCode do
             begin
               SelStart := SendMessage(Handle, EM_LINEINDEX, t, 0)+i-1;
               SelLength := Length(s)-i+1;
               SelAttributes.Color := clGreen;
               SelAttributes.Style:=[fsItalic];
               break;
             end;
           end;
     else // Jakiś inny znak
     // Czy jest on w napisie lub czy jest to cyfra, ale jej poprzednikiem nie jest coś co świadczy, że nalezy do napisu. Nie działa gdy jest cyfra po cyfrze z napisu, to ją i tak koloruje na niebiesko
     if (s[i] in ['0'..'9']) and ((i=1) or not(s[i-1] in ['a'..'z','_','A'..'Z']))then
     with reCode do
     begin
       SelStart := SendMessage(Handle, EM_LINEINDEX, t, 0)+i-1;
       SelLength := 1;
       SelAttributes.Color := clBlue;
     end;
   end;
   Inc(i);
 end;

 // Słowa kluczowe
 i := 1;
 while i<=Length(s) do
 begin
   m := 1000000;
   for s2 in KeyWords do
   begin
     p := PosEx(s2,s,i);
     // Czy znalazł i jego nastepny i poprzedni znak nie jest do napisu np słowo "begin" ma "in" w środku
     if (p > 0)  and (not AN(s,p-1)) and (not AN(s,p+Length(s2))) then
       // Sprawdzam czy słowo co znalazłem jest bliżej niż poprzednio znalezione jak tak to je ustawiam
       if p<m then
       begin
         m := p;
         s3 := s2;
       end;
   end;
   // Jeśli nie mam żadnego słowa to koniec
   if m = 1000000 then
     break;
   with reCode do
   begin
     SelStart := SendMessage(Handle, EM_LINEINDEX, t, 0)+m-1;
     SelLength := 1;
     // Jak tu jest komentarz to jest do końca
     if SelAttributes.color = clGreen then
       break
     else
     // Koloruj jeśli jeśli nic to nie ma
     if SelAttributes.color = clBlack then
     begin
       SelLength := Length(s3);
       SelAttributes.Style:=[fsbold];
       SelAttributes.color:=clNavy;
       SelLength:=0;
       SelAttributes.Style:=[];
       SelAttributes.color:=clblack;
     end;
   end;
   // Przesuwam się z wyszukiwaniem za słowo
   i := m+Length(s3);
   if s3 = 'function' then
   begin
     p := PosEx('(',s,i);
     k := GetSelStartByLine(t);
     if p <> 0 then
     with reCode do
     begin
       SelStart := k+i;
       SelLength := Length( Trim(Copy(s,i,p-i)));
       SelAttributes.Style:=[fsUnderline];
       SelAttributes.color:=clPurple;     
       SelLength:=0;
       SelAttributes.Style:=[];
       SelAttributes.color:=clblack;
     end;
   end;
 end;
 with reCode do
 begin
   Selstart:=a;
   SelAttributes.Style:=[];
   SelAttributes.color:=clblack;
 end;
end;

Wywołujemy w OnChange podając stringa z danej linijki i numer linijki. reCode to mój RichEdit a KeyWords - lista słów kluczowych . Tak samo robisz z , parsuje linijkię trafiasz na "" (ma to być JEGO ", a potem jak coś to wchodzisz wgłąb i malujesz atrybuty, napisy itp.

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...