Colorier valeur?

Résolu
Signaler
Messages postés
77
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
9 mai 2006
-
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012
-
j'ai une succesion de valeur dans un memo1, une fois que toue les valeurs sont affichées comment puis-je mettre en rouge l'une d'elles?

34 réponses

Messages postés
77
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
9 mai 2006

selectLine ne marche pas
par exemple
begin


Richedit1.Lines.Clear;
Richedit1.Lines.add('aaaaaaaaaa');
Richedit1.Lines.add('bbbbbbbbbb');
Richedit1.Lines.add('cccccccccc');



with RichEdit1 do begin
selectline(1,clred);


end;
end;


end.

je veux mettre en rouge la 2eme ligne
Messages postés
77
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
9 mai 2006

o fait je suis sur delphi 3 peut etre que dessus ça n'extiste pas selectline
Messages postés
77
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
9 mai 2006

yeahhhhhhhhh j'y arrive!! lol
merci beaucoup de ta patiente...
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
persiste et signe.

si tes valeurs son sous forme de liste :

v1
v2
v3
v4
v5
ect...

et que ce n'est pas du texte a mettre en forme, n'utilise pas un RichEdit mais une TListBox qui serat plus adaptée a cela.

pour selectionner une ligne il suffirat de clicker sur la ligne avec la souris ou bien d'assigner le numero de la ligne a la propriété ItemIndex ou encore de selectionner la ligne avec une recherche de la valeur :

ListBox1.ItemIndex := ListBox1.Items.IndexOf('v1');

pour pouvoir dessiner dans le canvas de TListBox place la propriété Style sur lbOwnerDrawVariable
ensuite dans l'evenement OnDrawItem tu vas pouvoir dessiner ce que tu veux en faisant comme cela :

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with ListBox1.Canvas do begin
FillRect(Rect);
if index = ItemIndex then
font.Color := clRed
else
font.Color := clBlack;
TextRect(rect,2,2,ListBox1.Items[index]);
end;
end;

voila, tu peu meme dessiner des images dedans, changer la police, le style, la couleur de fond, faire des grilles, des ronds ect... ect...
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
si j'ai bien suivi la procedure de shining, elle marchera pas correctement...

Richedit1.Lines.Clear;
Richedit1.Lines.add('Yeah!'); // Ligne n° 0
Richedit1.Lines.add('Ca marche!'); // Ligne n° 1
Richedit1.Lines.add('Yeah!'); // Ligne n° 2

SelectLine(2 , clRed); // <<< là il devrait colorier la ligne 0 et non la 2. Je me trompe peut-être, j'ai pas fait les tests...

Personnellement j'opterai pour la solution de f0xi, mais je ne sais pas comment seront traitées les données après.

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

ah non !!! pas d'accord index n° 2 va tout simplement mettre en rouge la ligne n°2 qui dans ton context se situe à la ligne 3 lol pour mettre la 1er ligne en rouge il suffit de mettre SelectLine(0 , clRed); mais c'est de ma faute j'ai sans doute très mal expliquer le fonctionnement !!! on peut effectivement utilisé un TListBox mais l'usage est un peu plus compliquer(pour un débutant)
et l'exemple de Foxi semble ne pas être approprié car en effet ListBox1.ItemIndex := ListBox1.Items.IndexOf('v1'); <== nécessite de connaître la valeur du texte de plus si Items[0] := 'v1 v2 v3' ça ne marchera pas car la comparaison binaire de "v1" n'est evidemment pas celle de "v1 v2 v3" logique ?

par contre
ListBox1.ItemIndex := ListBox1.Items.IndexOf(ListBox1.Items[index]); là ok

de plus de TextRect(rect,2,2,ListBox1.Items[index]); <== tous les caractères qui dépassent ne seront pas affichés !!! contrairement au TRichEdit qui fait un retour chariot

de plus lbOwnerDrawVariable nécessite l'implémentation de "MeasureItem" afin que chaque nouvel item puisse avoir une fenêtre assez grande pour l'affichage ce qui là encore nécessite un calcul de la hauteur du texte et franchement pour un débutant ce n'est pas si evident que ça !!!
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
mais non shining....

l'avantage des composants standar de delphi c'est que la plupart du temps 60% de leurs propriétés sont inutiles dans des cas courrant.

aucunement besoin d'implementer MeasureItem.
vus que le texte est deja entré dedans, RECT aurat la bonne dimension ...
on peu bien sur egalement utiliser :
TextOut(Rect.left+2,Rect.Top+2, Listbox1.Items[index]);

si on est pas sur que le text vas entré correctement dans la zone.

sincerement, je trouve l'utilisation de la listbox 100 fois plus simple que le richedit qui est aussi souple q'un pilone en beton armé.

et pour la scrollbar horizontal, une simple astuce suffit a l'afficher, toujours dans la procedure DrawItem :

var HSW : integer = 0;

procedure Form1.ListBox1DrawItem(blabla);
begin
... dessin ...

if canvas.Textwidth(Listbox1.Items[index]) > HSW then begin
HSW := canvas.Textwidth(Listbox1.Items[index]);
Perform(LB_SETHORIZONTALEXTENT, HSW+100, 0);
end;
end;
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
Et ben non shining je viens de tester... ça met bien en rouge la ligne 1 et non la 3.
Et ce à cause du Pos qui renvoie la position de la 1ère occurence qu'il trouve et dans mon test qui a 2 fois la même chose (1 à la ligne 1 et 1 à la ligne 3), il renvoi celui qu'il a trouvé en 1er et donc la ligne 1.

Tout problème a sa solution... Mais en général, celle que l'on trouve n'est jamais la bonne...
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
Il y aura même un autre problème, mais si je commence à l'expliquer, je vais flooder
mais je vais essayer de faire simple...

Richedit1.Lines.Clear;
Richedit1.Lines.add('810');
Richedit1.Lines.add('40');
Richedit1.Lines.add('1');

SelectLine(2 , clRed); //<<< là ca va colorier que le '1' de 810 (de la ligne 1 d'index 0)

Tout problème a sa solution... Mais en général, celle que l'on trouve n'est jamais la bonne...
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

très bonne remarque emantal !!!
mais j'ai fait ça vite fait !!! comment ça je me cherche des excuses ?? lol

bon essaie ça

procedure TForm1.SelectLine(Index: Integer; Color: TColor);
var
P : PChar;
Cnt : Integer;
S : String;
begin
with RichEdit1 , SelAttributes, Lines do
begin
Delimiter := ',';
P := PChar(DelimitedText);
S := '';
Cnt := 0;
while not(P^ = #0) and not(Cnt=Index) do
begin
if P^ = ',' then
inc(Cnt)
else
S := S + P^;
inc(P);
end;
SelStart := Length(S);
SelLength := Length(Lines[Index]);
Color := clRed;
end;
end;

ça devrait faire l'affaire car cette fois ci on scan uniquement l'index
j'ai fait un test avec

Add('aaa'); Ligne n°0
Add('aaa'); Ligne n°1
Add('aaa'); Ligne n°2

SelectLine(2 , clRed); ça met bien la Ligne n°2 en rouge
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
procedure SelectLine(ARichEdit : TRichEdit; ACaretPos : TPoint; const AColor: TColor);
var
X,L : Integer;
begin
L := 0;
with ARichEdit do begin
{ on remet tout le texte a la couleur par defaut }
SelectAll;
SelAttributes.Color := Font.Color;

{ on calcul de la ou on doit partir }
for X := 0 to ACaretPos.Y-1 do
{ on oublis pas les retour chariot donc +2 }

L := L + Length(Lines[x])+2;

{ on selectionne la ligne et on la mets en rouge }
SelStart := L;
SelLength := Length(Lines[ACaretPos.Y]);
SelAttributes.Color := AColor;

{ on replace le curseur la ou on est censé avoir cliquer }

SelStart := L + ACaretPos.X;
SelLength := 0;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1.Lines.Add('1000 50,5 blablabla blablabla');

RichEdit1.Lines.Add('2000 60,6 blablabla blablabla');

RichEdit1.Lines.Add('3000 70,7 blablabla blablabla');

RichEdit1.Lines.Add('4000 80,8 blablabla blablabla');

RichEdit2.Lines.Add('1000 50,5 blablabla blablabla');

RichEdit2.Lines.Add('2000 60,6 blablabla blablabla');

RichEdit2.Lines.Add('3000 70,7 blablabla blablabla');

RichEdit2.Lines.Add('4000 80,8 blablabla blablabla');

end;

{ avantage, cette procedure prend en charge tout les RichEdit que l'on veut }

procedure TForm1.RichEditMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
REObj : TRichEdit;
RECol : TColor;
begin
{ quand on clique dans le richedit, on selectionne la ligne }

if (Sender is TRichEdit) then begin
REObj := (Sender as TRichEdit);
{ en definissant une valeur a Tag on peu appliquer une couleur differente }

case REObj.Tag of
0 : RECol := clRed;
1 : RECol := clBlue;
2 : RECol := clGreen;
end;
{ enfin, on transmet tout cela a la procedure SelectLine }

SelectLine( REObj,
REObj.CaretPos,
RECol );
end;
end;
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

tiens c'est curieux que Emandhal n'est pas fait la remarque !!!
dans mon code si jamais il ya une virgule le resulat sera faux lol
tanpis pour le flood !!

version définitive qui marche

procedure TForm1.SelectLine(Index: Integer; Color_: TColor);
var
P : PChar;
Cnt : Integer;
S : String;
OldDelimiter : Char;
begin
with RichEdit1 , SelAttributes, Lines do
begin
OldDelimiter := Delimiter;
Delimiter := #254;
P := PChar(DelimitedText);// Pointeur sur le Texte
S := '';
Cnt := 0; // Compteur
while not(P^ = #0) and not(Cnt=Index) do
begin
if P^ = #254 then // si nouvelle ligne alors on incrément le Compteur
inc(Cnt)
else
S := S + P^; // sinon on concasse les caractères trouvés
inc(P); // on incrémente l'offset du Pointeur sur le prochain caractère, Nota: les caractères précédents ne sont plus en mémoire
end;
SelStart := Length(S);
SelLength := Length(Lines[Index]);
Color := Color_;
Delimeter := OldDelimeter;
end;
end;

maintenant avec tous ces codes ya l'embarras du choix mdr
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
J'ai pas osé faire la remarque
J'aurais plutot mit #14 ou #15 plutot que #254
Mais de toute façon, je ne serais pas passé par le DelimitedText. J'aurais simplement recherché les #10#13 (ou #13#10, je ne sais plus) du Text lui même qui délimite les changement de lignes.
Mais à en voir ton code, j'arrive pas à le trouver juste (il l'est pourtant surement).

Tout problème a sa solution... Mais en général, celle que l'on trouve n'est jamais la bonne...
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

ptdr j'ai mis delimeter au lieu de delimiter ça fait météo ;), j'ai mis #254 car c'est généralement une valeur qu'on utilise rarement le #14 & #15 y en a qui l'utilise pour afficher des images dans des clients IRC, ouep pour le #13 mais ya milles façon de faire ... :D et c'est généralement la mauvaise ;)