didi59650
Messages postés77Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 9 mai 2006
-
14 avril 2006 à 09:27
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012
-
18 avril 2006 à 13:01
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?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 14 avril 2006 à 14:10
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 :
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 14 avril 2006 à 15:39
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 !!!
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 14 avril 2006 à 16:04
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;
Emandhal
Messages postés194Date d'inscriptiondimanche 2 mars 2003StatutMembreDernière intervention10 octobre 20063 14 avril 2006 à 16:22
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...
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 14 avril 2006 à 19:10
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
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 15 avril 2006 à 10:52
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');
{ 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 }
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 16 avril 2006 à 15:34
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
Emandhal
Messages postés194Date d'inscriptiondimanche 2 mars 2003StatutMembreDernière intervention10 octobre 20063 18 avril 2006 à 12:47
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...
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 18 avril 2006 à 13:01
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 ;)