Chercher un caractere dans un richedit

Signaler
Messages postés
223
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
15 février 2006
-
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
-
salut J'aimerais que mon programme cherche un caractere dans un riche edit : '<' et quand il en trouve un, il change de couleur le texte qui suit.

7 réponses

Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
3
Salut,

Le principe est le suivant

procedure TForm1.RechercheUnCaractereDansLeRichEditEtColorieLaSuite(Car : Char; Couleur : TColor);
var
  i : Integer;
begin
  i := Pos(Car,RichEdit1.Text); //position du caractère dasn le richedit
  if i>0 then
    begin
      RichEdit1.SelStart := i; // sélection premier caractère suivant 
      RichEdit1.SelLength := Length(RichEdit1.Text); // jusqu'à la fin
      RichEdit1.SelAttributes.Color := Couleur; // modif couleur
      RichEdit1.SelLength := 0;  // effacement marquage sélection
    end;
end;


Ken@vo
____________________
Code, Code, Codec !
Messages postés
223
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
15 février 2006

salut kenavo,

ta procédure fonctionne mais elle vérifie seulement 1 lignes du richedit ca serait tu possible qu'elle vérifie toutes les lignes
et ca serait tu possible de la transformé en une fonction qui renverrait un valeur true or false si le caractere est trouvé ou pas

voici les quelques modification que j'ai fait a ta procédure :

 

procedure TForm1.RechercheCaractere(Car : Char; Couleur : TColor);
var
i : Integer;
begin
i := Pos(Car, memo1.text); //position du caractère dasn le richedit
if i>0 then
begin
if couleur = $00000000 then
memo1.SelStart := i + 1 // sélection premier caractère suivant
else
memo1.SelStart := i - 1; // sélection premier caractère suivant
memo1.SelLength := Length(memo1.text); // jusqu'à la fin
memo1.SelAttributes.Color := Couleur; // modif couleur
memo1.SelLength := 0; // effacement marquage sélection
end;
end;

Messages postés
223
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
15 février 2006

ee en passant memo1 c un richedit
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
3
Si tu veux (si je comprends) faire la verif ligne par ligne, il faut faire gaffe :

Richedit1.Text représente l'ensemble du texte (celui que l'on peut sélectionner et dont on peut modifier les attributs)

Richedit1.Lines[i] représente la i
ème ligne



Il faut gérer un index qui connait la position du premier caractère de la ième ligne dans le texte, trouver le caractère recherché et sa position dans la ligne, calculer la longueur du reste de la ligne, selectionner cette partie du texte (SelStart := Index + Position; SelLength := Longueur ),

et ce pour chaque ligne



Ken@vo

____________________
Code, Code, Codec !
Messages postés
223
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
15 février 2006

j'ai réussi mais la le probleme c que c beacoup trop lent débugger une page html avec ce code (changé des couleur les balise et les attribut)


procedure TForm4.JvHTButton1Click(Sender: TObject);
var
x : integer ;
baliseouverte : Boolean ;
balisefermer : Boolean ;
propattrib : Boolean ;
progress  : integer ;
begin


jvprogressbar1.Max := length(form1.memo1.Text) ;


listbox1.Clear ;


balisefermer := true  ;
baliseouverte := false ;
propattrib := false ;


form1.memo1.selstart := 1 ;
form1.memo1.sellength := length(form1.memo1.Text) ;
form1.memo1.SelAttributes.color := $00000000 ;


for x := 1 to length(form1.memo1.Text) do
begin


if  form1.memo1.Text[x] = '<' then
begin
if baliseouverte = true then listbox1.Items.Add('Erreur : double ouverture d''une balise.') ;
baliseouverte := true ;
form1.memo1.selstart := x - 1 ;
form1.memo1.sellength := length(form1.memo1.text) ;
form1.memo1.SelAttributes.Color := $00FF0000 ;
form1.memo1.sellength := 0 ;
end;


if  form1.memo1.Text[x] = '>' then
begin
if baliseouverte = false then listbox1.Items.Add('Erreur : double fermeture d''une balise.');
baliseouverte := false ;
form1.memo1.selstart := x - 1;
form1.memo1.sellength := 1 ;
form1.memo1.SelAttributes.Color := $00FF0000 ;
form1.memo1.sellength := 0 ;
form1.memo1.selstart := x ;
form1.memo1.sellength := length(form1.memo1.text) ;
form1.memo1.SelAttributes.Color := $00000000 ;
form1.memo1.sellength := 0 ;
end;


if  form1.memo1.Text[x] = '"' then
begin
if baliseouverte = true then
begin
if propattrib = true then
begin
form1.memo1.selstart := x ;
form1.memo1.sellength := length(form1.memo1.text) ;
form1.memo1.SelAttributes.Color := $000000FF ;
form1.memo1.sellength := 0 ;
propattrib := false ;
end
else
begin
form1.memo1.selstart := x - 1;
form1.memo1.sellength := length(form1.memo1.text) ;
form1.memo1.SelAttributes.Color := $00007A56 ;
form1.memo1.sellength := 0 ;
propattrib := true ;
end;
end;
end;



if  (form1.memo1.Text[x] = ' ') and (baliseouverte = true) and (propattrib = false) then
begin
form1.memo1.selstart := x ;
form1.memo1.sellength := length(form1.memo1.Text) ;
form1.memo1.SelAttributes.Color := $000000FF ;
form1.memo1.sellength := 0 ;
end;


if (form1.memo1.Text[x] = '=') and (baliseouverte = true) then
begin
if form1.memo1.Text[x + 1] <> '"' then listbox1.Items.Add('il est pr&#233;f&#233;rable d''encadr&#233; une propri&#233;t&#233; par des ["]');
form1.memo1.selstart := x + 1 ;
form1.memo1.sellength := length(form1.memo1.Text) ;
form1.memo1.SelAttributes.Color := $0000FF00 ;
form1.memo1.sellength := 0 ;
end;


jvprogressbar1.Position := x ;
application.ProcessMessages ;


end;
end;



je c pas si ya moyen de faire plus simple

tu peux telecharger mon programme ici :

htttp://copsoft.dyndns.org:81/ecureuil/htmlcreator.exe
Messages postés
223
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
15 février 2006

outils -> débugueur
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
3
Il vaudrait mieux éviter l'appel répétitif à la propriété form1.memo1.Text,
c'est long. Charge le texte dans une variable (TexteHTML par ex.) une
fois au début de la procédure et ça ira déjà beaucoup plus vite :



............

TexteHTML : string;

begin

TexteHTML := form1.memo1.Text; // 1 seul appel



jvprogressbar1.Max := length(TexteHTML);

listbox1.Clear;



balisefermer := true;

baliseouverte := false;

propattrib := false;



form1.memo1.selstart := 1;

form1.memo1.sellength := length(TexteHTML);

form1.memo1.SelAttributes.color := $00000000;



for x := 1 to length(TexteHTML) do

begin

if s[x] = '<' then

...............




Tu peux également eviter d'appeler systématiquement la mise à jour du ProgressBar

une fois sur 10 ça doit suffire !



if x mod 10 = 0 then

begin

jvprogressbar1.Position := x;

application.ProcessMessages;

end;





Ken@vo

____________________

Code, Code, Codec !