Davka Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 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 More sharing options...
xevil21 Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 o tak String tekst; tekst = Memo1->Text; if(tekst.Pos('<')) { Memo1->Clear(); } Pozdrawiam! Link do komentarza Udostępnij na innych stronach More sharing options...
Davka Napisano Czerwiec 17, 2008 Autor Zgłoś Share Napisano Czerwiec 17, 2008 Dzięki za odpowiedź, będziesz w Autorach. P.S: A jeszcze jak zrobić żeby zmieniał kolor tylko ten znak? Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 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 More sharing options...
Davka Napisano Czerwiec 17, 2008 Autor Zgłoś Share Napisano Czerwiec 17, 2008 Wszystko ok tylko, że miejsce pisania cofa się . Jak to zmienić? Link do komentarza Udostępnij na innych stronach More sharing options...
Force Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 SelStart = znak+1 Baza tysięcy lotnisk: http://airportsbase.com Link do komentarza Udostępnij na innych stronach More sharing options...
Davka Napisano Czerwiec 17, 2008 Autor Zgłoś Share Napisano Czerwiec 17, 2008 SelStart = znak+1 Nie może być bo koloruje następną litere wtedy. Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 Nie może być bo koloruje następną litere wtedy. RichEdit1->SelAttributes->Color=clBlack; SelStart = znak+1; Pozdrawiam! Link do komentarza Udostępnij na innych stronach More sharing options...
Davka Napisano Czerwiec 17, 2008 Autor Zgłoś Share Napisano Czerwiec 17, 2008 Dalej nie działa Edit1: Znaczy koloruje następne litery. Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 Dalej nie działa Edit1: Znaczy koloruje następne litery. o tak 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 More sharing options...
Davka Napisano Czerwiec 17, 2008 Autor Zgłoś Share Napisano Czerwiec 17, 2008 Bardzo ci dziękuje, jesteś w Autorach P.S: Jeszcze jedno pytanie, jak sprawdzać jaki znak został wpisany? P.S2: Znalazłem, jeszcze jeden błąd. Gdy użyje tego znaku drugi raz już nie jest kolorowy . Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 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 tylko dziś mam już mało czasu... Pozdrawiam! Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 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 More sharing options...
Force Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 Wystarczy w OnChange pobrać z SelStart-a numer wiersza i używajac PosEx przemieszczać się po znaczkach " Baza tysięcy lotnisk: http://airportsbase.com Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 Jeśli chcesz kolorować pojedyncze znaki, to wystarczy coś takiego w OnChange 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 More sharing options...
Davka Napisano Czerwiec 17, 2008 Autor Zgłoś Share Napisano Czerwiec 17, 2008 Działa to wam? Bo mi błędy wywala "Cannot convert 'char' to 'char *' Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Czerwiec 17, 2008 Zgłoś Share Napisano Czerwiec 17, 2008 Mi działa. Używam C++ Builder 6. Link do komentarza Udostępnij na innych stronach More sharing options...
Davka Napisano Czerwiec 18, 2008 Autor Zgłoś Share Napisano Czerwiec 18, 2008 Mi działa. Używam C++ Builder 6. Dobra już działa ale jak chce kolorować np, "<b>" to już nie: ( Link do komentarza Udostępnij na innych stronach More sharing options...
Force Napisano Czerwiec 18, 2008 Zgłoś Share Napisano Czerwiec 18, 2008 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.