Comment faire de la couleur un cxgrid sur la base du tableau de la valeur?
-
08-09-2020 - |
Question
Je voudrais que toutes les lignes où, en particulier, le champ nom de "bonjour" est présent pour obtenir de couleur
vert.J'ai essayé ce customdrawcell
:
if abstable1.fieldbyname('somename').asstring = 'Hello' then
cxgrid.canvas.brush.color:=clGreen
Mais il l'habitude de travailler...ce qui me manque ici ?
La solution
N'essayez pas de changer la toile les couleurs dans la Grille.Plutôt--et je trouve cela toujours être vrai-changer les couleurs dans le Vue's OnDrawCell gestionnaire, comme dans cet exemple:
procedure T_fmTabSnapList.View1CustomDrawCell(Sender: TcxCustomGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
if abstable1.fieldbyname('somename').asstring = 'Hello' then
ACanvas.Brush.Color := clGreen
end;
Le cxGrid est juste un conteneur pour les Vues.Les vues sont où la peinture se produit.s
Autres conseils
Utiliser le OnGetContentStyle événement de colonnes ou de l'objet de la grille.Les Styles sont beaucoup plus faciles à travailler que de jouer avec la toile.
Vous avez besoin de regarder les données internes pour chaque vue ligne plutôt que les données de la position actuelle dans le tableau.Également utiliser le canevas fourni dans le OnCustomDrawCell() de l'événement.
procedure TForm1.YourViewCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
if(AViewInfo.GridRecord.Values[YourColumn.Index] = 'Hello') then
ACanvas.Brush.Color := clGreen;
end;
procedure Tfm1.Grid1StylesGetContentStyle(Sender: TcxCustomGridTableView;
ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
out AStyle: TcxStyle);
Var
Style1: TcxStyle;
begin
if AItem = nil then exit;
if ARecord.Values[Grid1Med.Index] = true then
AStyle := cxStyleMed;
if ARecord.Values[Grid1CP.Index] = true then
AStyle := cxStyleHost;
if (ARecord.Values[Grid1Med.Index] = true) and
(ARecord.Values[Grid1CP.Index] = true) then
AStyle := cxStyleHostAndCP;
if not VarIsNull(ARecord.Values[colColor.Index]) then
begin
if not Assigned(AStyle) then
AStyle := TcxStyle.Create(Sender);
AStyle.Color := ARecord.Values[colColor.Index];
end;
end;
Voici un code qui fonctionne à partir d'un programme de la mine, qui fait la même chose.
procedure TDoDockets.grDocketsDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with grDockets do
begin
if (qDocketsOpenCost.asinteger > 1) and (datacol = 5)
then canvas.font.color:= clRed;
if datacol = 9 then // status
if qDocketsColour.Value <> 0
then Canvas.font.color:= tcolor (qDocketsColour.Value);
if datacol = 10 then // attention
if qDocketsAttention.asinteger = 1
then canvas.brush.color:= clRed;
if qDocketsUrgent.asinteger = 1 then canvas.brush.color:= 10092543;
// light yellow
DefaultDrawColumnCell (Rect, DataCol, Column, State);
end
end;
grDockets est la grille, et qDockets est la requête en cours est affichée dans la grille.Certaines colonnes peuvent être tirés dans une couleur différente en fonction de la valeur affichée, et dans un cas (qDocketsUrgent = 1), l'ensemble de la ligne de la couleur de fond est changé.