2017-04-20 7 views
0

Je souhaite définir la couleur d'arrière-plan de la ligne active/sélectionnée dans un contrôle TDBGrid.Delphi/C++ Builder - Définir la couleur de ligne active/sélectionnée dans TDBGrid

Utilisation de l'événement OnDrawColumnCell:

1) Le code suivant fonctionnera si DBGrid a l'option dgMultiSelect, sinon, rien ne se passe:

if (grid->SelectedRows->CurrentRowSelected) { 
    grid->Canvas->Brush->Color = clBlue; 
} 

2) Le code suivant fonctionnera si DBGrid a l'option dgRowSelect, sinon, seule la cellule sélectionnée, pas la ligne entière, sera colorée:

if (State.Contains(gdSelected)) { 
    grid->Canvas->Brush->Color = clBlue; 
} 

Comment pourrais-je colorer toute la ligne active/sélectionnée Witho ut en utilisant dgRowSelect ou dgMultiSelect?

Répondre

2

De OnDrawColumnCell:

Un gestionnaire d'événement OnDrawColumnCell peut appeler la méthode DefaultDrawColumnCell de charger la grille orientée données pour écrire la valeur de données dans la cellule .

Utilisez DefaultDrawColumnCell comme ceci. C'est un code Delphi mais vous pouvez le convertir facilement.

procedure TForm1.DBGridDrawColumnCell(Sender: TObject;const Rect: TRect; 
DataCol: Integer; Column: TColumnEh;State: TGridDrawState); 
begin 
.....  
    DBGrid.Canvas.Brush.Color := clBlue; 
    DBGrid.DefaultDrawColumnCell(Rect,DataCol,Column,State); 
.... 

Mise à jour

Comment peindre la ligne active DBGrid, sans mettre dgRowSelect ou dgMultiSelect.

  1. Nous devons obtenir la position supérieure de la ligne actuelle.

Définir une classe qui un héritier de TDBGrid pour faire CellRect, Col et Row public:

type 
    TMyDBGrid = class(TDBGrid) 
    public 
    function CellRect(ACol, ARow: Longint): TRect; 
    property Col; 
    property Row; 
    end; 

function TMyDBGrid.CellRect(ACol, ARow: Longint): TRect; 
begin 
    Result := inherited CellRect(ACol, ARow); 
end; 

Maintenant, nous pouvons vérifier la partie supérieure de la cellule actuelle en cas OnDrawColumnCell:

procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 

var Col,Row : Integer; 
begin 
    col := TMyDbGrid(DBGrid1).Col; 
    row := TMyDbGrid(DBGrid1).Row; 
    if (Rect.Top = TMyDBGrid(DBGrid1).CellRect(Col,Row).Top) and 
        (not (gdFocused in State) or not Focused) then 
    DBGrid1.Canvas.Brush.Color := clBlue; 

    DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State); 
end; 
+0

Salut ami , merci pour votre réponse. J'utilise déjà ce type de code et je peins déjà les lignes. Ce que je dois savoir, c'est comment peindre SEULEMENT LA RANGE ACTIVE, et sans définir dgRowSelect ou dgMultiSelect. En d'autres termes, comment déterminer la ligne active (notez que State.Contains (gdSelected) et grid-> SelectedRows-> CurrentRowSelected ne fonctionnent pas dans ce cas) – sgm

+0

@sgm Voir Uptate –

+0

Il n'y a pas de Var focalisé! – sgm