[C++ Builder]
void __fastcall TForm1::tvCustomersDblClick(TObject *Sender)
{
TcxGridRecordHitTest * AHitTest;
TcxCustomGridRecord * ARecord;
TPoint APoint;
GetCursorPos(&APoint);
TcxGridSite * ASite = Grid->FocusedView->Site;
APoint = ASite->ScreenToClient(APoint);
if (AHitTest = dynamic_cast<TcxGridRecordHitTest *>
(ASite->ViewInfo->GetHitTest(APoint)))
{
ARecord = AHitTest->GridRecord;
//Call your procedure to activate an edit dialog for the clicked record
OpenEditRecordDialog(ARecord);
}
}
Exemple : Démarrage manuel du glisser-déposer
L' exemple suivant montre comment vous pouvez démarrer le glisser-déposer manuellement
dans la vue tvCustomers en gérant son événement OnMouseDown . Pour démarrer une
opération de glisser-déposer pour une vue, vous devez appeler la méthode BeginDrag de
l'objet de site grille de la vue (la méthode BeginDrag est héritée de la classe TControl). Le site
de grille ( TcxGridSite ) représente le contrôle qui contient et affiche la vue. Il est passé en
tant que paramètre Sender à l'événement OnMouseDown . Remarque : le site de la grille est
également accessible via la propriété Site de la vue . Pour activer le démarrage manuel du
glisser-déposer, vous devez définir la propriété DragMode de la vue sur dmManual .
Le gestionnaire OnMouseDown suivant démarre le glisser-déposer si l'utilisateur clique dans
un enregistrement de grille.
[Delphi]
procedure TForm1.tvCustomersMouseDown(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
with TcxGridSite(Sender) do
begin
if ViewInfo.GetHitTest(X, Y).HitTestCode = htRecord then
BeginDrag(False);
end;
end;
[C++ Builder]
void __fastcall TForm1::tvCustomersMouseDown(TObject *Sender, TMouseButton
Button, TShiftState Shift, int X, int Y)
{
TcxGridSite * ASite = (TcxGridSite *)Sender;
if (dynamic_cast<TcxGridRecordHitTest*>(ASite->ViewInfo->GetHitTest(X,
Y)))
ASite->BeginDrag(false);
Exemple : TcxCustomGridView.OnGetStoredProperties,
TcxCustomGridView.OnGetStoredPropertyValue,
TcxCustomGridView.OnSetStoredPropertyValue,
TcxCustomGridView.OnInitStoredObject
L' ExpressQuantumGrid vous permet d'enregistrer la disposition de la vue dans un certain
nombre de fichiers externes et de la restaurer ultérieurement. Cet exemple montre comment
rendre persistante la disposition de la vue de table à bandes dans un fichier INI.
L' exemple suppose qu'un formulaire contient une vue de table à bandes nommée
BandedTableView . Pour enregistrer les propriétés de la Vue dans un fichier INI, nous allons
utiliser la procédure StoreToIniFile en utilisant les options par défaut. '
BandedTableViewProperties.ini ' est le nom de fichier spécifié pour le fichier INI.
[Delphi]
//...
BandedTableView.StoreToIniFile('BandedTableViewProperties.ini');
La liste des propriétés qui seront enregistrées dans fichier doit être personnalisée car seules
quelques-unes des propriétés de la vue sont enregistrées par défaut. Chaque fois que la
procédure de magasin ( StoreToIniFile , StoreToRegistry , StoreToStorage ou StoreToStream)
est appelée, une liste des propriétés qui seront enregistrées est créée. Lorsque la liste est
complète (elle contient toutes les propriétés de la vue qui sont enregistrées par défaut), l'
événement OnGetStoredProperties est déclenché. À ce stade, vous pouvez facilement
personnaliser la liste, si nécessaire. Par exemple, ajoutons les propriétés qui contrôlent
l'apparence du panneau indicateur dans une vue, l' indicateur et IndicatorWidth . En plus de
cela, nous empêcherons l'enregistrement de propriétés indésirables, en l'occurrence une
propriété qui contrôle la visibilité du panneau de pied de page et qui s'appelle ' Footer '.
Ajoutons la procédure de gestion d'événement OnGetStoredProperties et nommons-la '
GetStoredProperties '. Les noms des propriétés à stocker sont contenus dans une liste passée
en tant que paramètre AProperties . Ajustez la liste comme indiqué ci-dessous.
[Delphi]
procedure TForm1.GetStoredProperties(Sender: TcxCustomGridView;
AProperties: TStrings);
begin
AProperties.Add('Indicator');
AProperties.Add('IndicatorWidth');
AProperties.Delete(AProperties.IndexOf('Footer'));
end;
Les propriétés à enregistrer dans le fichier INI ont été spécifiées, mais la vue réelle à laquelle
correspondent les propriétés Indicator et IndicatorWidth ne l'a pas été. Il est maintenant
temps de définir le lien entre eux. Pour ce faire, gérez l' événement
OnGetStoredPropertyValue , qui est déclenché lorsque les valeurs de la propriété sont
stockées dans un magasin de données externe (un fichier INI dans ce cas). Ajoutons la
procédure de gestion de cet événement et nommons-la ' GetStoredPropertyValue '. Dans le
code suivant, nous attribuons les valeurs réelles des propriétés aux propriétés stockées en
fonction de leurs noms. Rien ne doit être fait ici pour la propriété stockée Footer car nous
l'avons précédemment supprimée de la liste des propriétés qui seront enregistrées.
[Delphi]
procedure TForm1.GetStoredPropertyValue(Sender: TcxCustomGridView;
const AName: String; var AValue: Variant);
begin
if AName = 'Indicator' then
if Sender is TcxGridTableView then
begin
AValue := TcxGridTableView(Sender).OptionsView.Indicator;
Exit;
end;
if AName = 'IndicatorWidth' then
if Sender is TcxGridTableView then
begin
AValue := TcxGridTableView(Sender).OptionsView.IndicatorWidth;
Exit;
end;
end;
Étant donné que le processus de magasin de vues inclut le stockage de l'ensemble complet des
propriétés de la vue ainsi que des propriétés des éléments de la vue de la grille (colonnes,
lignes de la vue de la carte, bandes) qui appartiennent à la vue, les événements appropriés sont
également déclenchés pour ces éléments, vous permettant ainsi pour personnaliser
complètement l'ensemble du processus de stockage. Afin de modifier le stockage des
propriétés de colonne de grille ou de ligne de carte, utilisez les événements suivants :
Item.OnGetStoredProperties , Item.OnGetStoredPropertyValue et
Item.OnSetStoredPropertyValue . Pour les propriétés de bande dans les vues de table par
bandes, utilisez les événements suivants : Band.OnGetStoredProperties ,
Band.OnGetStoredPropertyValue et Band.OnSetStoredPropertyValue .
Le processus de personnalisation de stockage et de restauration des propriétés pour les
colonnes et les bandes est similaire au processus de personnalisation d'une vue.
Remarque importante : lorsqu'un élément de vue de grille tel qu'une bande, une colonne ou
une ligne de carte est restauré à partir d'un magasin de données externe dans la vue où l'objet
qui correspond à l'élément est détruit, l'élément est recréé et l'objet nécessite donc que ses
événements sont réassociés aux gestionnaires d'événements existants. Cela peut être accompli
en gérant l' événement OnInitStoredObject .
Le code suivant représente le gestionnaire d'événements OnInitStoredObject et montre
comment réassocier les événements de toutes les colonnes (aucune identification spécifique
n'est effectuée) dont le stockage et la restauration des propriétés sont personnalisés en gérant
les événements Item.OnGetStoredProperties , Item.OnGetStoredPropertyValue et
Item.OnSetStoredPropertyValue avec les gestionnaires d'événements existants
(respectivement les procédures colGetStoredProperties, colGetStoredPropertyValue et
colSetStoredPropertyValue).
[Delphi]
procedure TForm1.InitStoredObject(Sender: TcxCustomGridView; AObject:
TObject);
begin
if AObject is TcxGridBandedColumn then
with TcxGridBandedColumn(AObject) do
begin
OnGetStoredProperties := colGetStoredProperties;
OnGetStoredPropertyValue := colGetStoredPropertyValue;
OnSetStoredPropertyValue := colSetStoredPropertyValue;
end;
end;
Exemple : TcxCustomGridView.OnStartDrag
Cet exemple montre comment créer un objet glisser personnalisé pour le glisser-déposer. L'objet
glisser fournira une image de glissement à afficher tout en faisant glisser les enregistrements de la
vue tvItems. Si un utilisateur commence à glisser dans la vue avec la fonctionnalité de sélection
multiple activée (la propriété OptionsSelection.MultiSelect est définie sur True ), l'image de
[C++ Builder]
void __fastcall TForm1::tvItemsStartDrag(TObject *Sender, TDragObject
*&DragObject) {
DragObject = new TMyDragControlObject((TcxGridSite*)Sender);
}
}
Exemple : TcxCustomGridView.StoreToRegistry,
TcxCustomGridView.RestoreFromRegistry
Supposons que nous ayons deux vues sensibles aux données ( tvSource et tvTarget ) et que
nous ayons besoin de la deuxième vue pour afficher les mêmes données que la première (en
utilisant la même disposition de vue). Les paramètres de la première vue sont stockés à
l'aide de la procédure StoreToRegistry . Afin de pouvoir restaurer les paramètres de la vue
dans une autre vue, définissez le paramètre ASaveViewName sur une chaîne non vide. Ce
nom sera utilisé dans la procédure RestoreFromRegistry lors du chargement des paramètres
dans la vue cible. Si vous spécifiez un nom pour le paramètre ASaveViewName , les éléments
seront stockés par leurs ID. La procédure de restauration lit les entrées du registre et les
applique aux éléments correspondants en fonction de leurs valeurs d'ID. Pour que le code
suivant fonctionne correctement, les éléments des vues tvSource et tvTarget doivent avoir
les mêmes identifiants. Lorsque vous exécutez le programme, tous les éléments d'une vue se
voient attribuer des ID uniques de base zéro. L'ID du premier élément est 0, l'ID du second
est 1, etc. Les ID fournissent l'identité unique des éléments dans la vue. Lorsqu'un élément
est supprimé, un élément nouvellement créé peut obtenir l'ID de l'élément supprimé. Ainsi,
les ID des éléments ne seront pas réutilisés dans l'état actuel de la vue, mais pourront être
réutilisés pendant la durée de vie de la vue. Il s'agit d'une limite unique à ces identifiants. Le
code ci-dessous est créé avec l'hypothèse suivante : les ID des éléments de la vue tvSource
sont des numéros séquentiels. L'ID du premier élément est zéro. la vue tvTarget ne contient
aucun élément avant l'exécution du programme. Cela garantit que les éléments créés au
moment de l'exécution obtiendront également des ID séquentiels basés sur zéro (les mêmes
que dans la vue tvSource ).
[Delphi]
var
AStoreKey, ASaveViewName: string;
I: Integer;
AOptions: TcxGridStorageOptions;
//...
//The path to the layout
AStoreKey := 'Software\MyProjects\TestStoring';
//The name to refer to the stored settings
ASaveViewName := 'tvSource Layout';
AOptions := [];
//Create items in the tvTarget View
for I := 0 to tvSource.ItemCount - 1 do
tvTarget.CreateItem;
//Save settings of the tvSource View
tvSource.StoreToRegistry(AStoreKey, True, AOptions, ASaveViewName);
//Apply settings to the tvTarget View
tvTarget.RestoreFromRegistry(AStoreKey, False, False, AOptions,
ASaveViewName);
//Make certain that the tvTarget View displays the same data as the
tvSource View
tvTarget.DataController.DataSource := tvSource.DataController.DataSource;
Exemple : Parcourir les niveaux
L' exemple suivant montre comment vous pouvez déplacer le focus entre les niveaux
d'imbrication dans un contrôle de grille. Supposons que vous ayez deux boutons sur votre
formulaire : ButtonLevelUp et ButtonLevelDown. Cliquer sur ces boutons déplace le focus
vers les niveaux supérieur et inférieur respectivement. Cliquer sur le bouton ButtonLevelUp
déplace le focus d'un niveau d'imbrication vers un niveau supérieur. Si l'enregistrement
actuellement ciblé appartient à un détail, cette action déplace le focus vers la ligne principale
propriétaire du détail. Si le regroupement est appliqué et que l'enregistrement actuel
appartient à un groupe de données, un clic sur ce bouton déplace le focus sur la ligne du
groupe immédiat contenant l'enregistrement. Le code suivant montre le gestionnaire
d'événements OnClick du bouton ButtonLevelUp. Pour obtenir un enregistrement parent
pour l'enregistrement ciblé, nous utilisons la propriété ParentRecord . La propriété Focused
d'un enregistrement vous permet de déplacer le focus sur cet enregistrement.
[Delphi]
procedure TForm1.ButtonLevelUpClick(Sender: TObject);
var
ARecord: TcxCustomGridRecord;
begin
with TcxCustomGridTableView(Grid.FocusedView) do
begin
ARecord := Controller.FocusedRecord;
if Assigned(ARecord) then
begin
ARecord := ARecord.ParentRecord;
if Assigned(ARecord) then
ARecord.Focused := True;
end;
end;
end;
[C++ Builder]
void __fastcall TForm1::ButtonLevelUpClick(TObject *Sender)
{
TcxCustomGridRecord * ARecord;
TcxCustomGridTableView * AView = (TcxCustomGridTableView *)Grid-
>FocusedView;
ARecord = AView->Controller->FocusedRecord;
if (ARecord != NULL)
{
ARecord = ARecord->ParentRecord;
if (ARecord != NULL)
ARecord->Focused = true;
}
}
Lorsque l'utilisateur final clique sur le bouton ButtonLevelDown, le focus passe d'un niveau
supérieur à un niveau d'imbrication. Si une ligne de groupe est ciblée, elle est d'abord
développée, puis l'enregistrement suivant est ciblé. Si une ligne principale est ciblée, elle est
également développée, puis le focus se déplace vers le premier enregistrement dans la vue
détaillée correspondante. Le code suivant montre l' événement OnClick pour le bouton
ButtonLevelDown. La fonction GetFirstChild renvoie le premier enfant d'un enregistrement
donné. Notez qu'avant l'appel de GetFirstChild , l'enregistrement est développé en premier.
Cela garantit que la fonction GetFirstFocusableChild et l' instruction Records[ARecord.Index +
1] renverront les enregistrements enfants appropriés. GetFirstFocusableChild renvoie un
enregistrement enfant pour une ligne principale. L' instruction Records[ARecord.Index + 1]
renvoie un enregistrement enfant pour une ligne de groupe.
[Delphi]
procedure TForm1.ButtonLevelDownClick(Sender: TObject);
function GetFirstChild(ARecord: TcxCustomGridRecord):
TcxCustomGridRecord;
begin
if ARecord is TcxGridMasterDataRow then
Result := ARecord.GetFirstFocusableChild
else
if ARecord is TcxGridGroupRow then
Result := ARecord.ViewData.Records[ARecord.Index + 1]
else
Result := nil;
end;
var
ARecord: TcxCustomGridRecord;
begin
with TcxCustomGridTableView(Grid.FocusedView) do
begin
ARecord := Controller.FocusedRecord;
if Assigned(ARecord) then
begin
ARecord.Expand(False);
ARecord := Controller.FocusedRecord;
ARecord := GetFirstChild(ARecord);
if Assigned(ARecord) then
ARecord.Focused := True;
end;
end;
end;
Bouton déroulant du filtre (Filter Dropdown Button)
en-têtes de colonne dans les vues de tableau et les vues de tableau à bandes , les légendes
de ligne de carte dans les vues de carte et les éléments de données dans les vues de mise en
page peuvent afficher des boutons déroulants de filtre (boutons de filtre en abrégé). Les
utilisateurs finaux peuvent cliquer sur ces boutons pour appeler les listes déroulantes de
filtres .
[Constructeur C++]
cxSetResourceString(&_cxSDatePopupClear, "Löschen");
Ce code modifie la légende du bouton Effacer pour tous les éditeurs de date de
l'application actuelle.
L' objet ViewInfo , qui contient toutes les informations requises pour peindre chaque élément,
est passé via le paramètre ViewInfo . De nombreuses propriétés ViewInfo ne sont requises que
par la structure interne de la grille, vous pouvez donc les ignorer. Les propriétés ViewInfo les
plus utiles sont : Propriété Bounds . Détermine le rectangle de délimitation de l'élément de
grille repeint. Chaque événement de dessin personnalisé fournit un canevas de contrôle de
grille représenté par le paramètre ACanvas . Comme le paramètre ACanvas fait référence à
l'ensemble du canevas de contrôle de la grille, vous devez utiliser AViewInfo . Propriété
Bounds pour déterminer la position et la taille de l'élément de grille actuel. Le rectangle
contenu dans cette propriété détermine les coins supérieur gauche et inférieur droit de
l'élément dans le contrôle de grille via les champs Bounds .Top , Bounds .Left, Bounds
.Bottom et Bounds .Right correspondants. Propriété des paramètres . Contient un ensemble
de champs qui déterminent le style de l'élément peint. Avec les champs Params .Color,
Params .TextColor et Params .Font, vous pouvez spécifier la couleur d'arrière-plan, la
couleur du texte (le cas échéant) et la police (un objet TFont) appliquées à l'élément de grille.
Propriété DisplayValue (ReadOnly) – Spécifie la valeur affichée par l'élément.
Le paramètre ACanvas fournit le canevas où l'élément est peint. N'oubliez pas que la propriété
ACanvas fournit l'ensemble du canevas du contrôle de grille. Vous devez donc utiliser la
propriété AViewInfo .Bounds pour déterminer le rectangle de délimitation de l'élément
repeint. Bien qu'ACanvas soit du type TcxCanvas , il publie toutes les méthodes de canevas
les plus utiles. Si vous souhaitez accéder au canevas VCL standard, vous devez utiliser la
propriété ACanvas .Canvas. Le paramètre ADone détermine si un gestionnaire d'événements
dessine complètement un élément approprié. Si ADone vaut True , la procédure de dessin par
défaut n'est pas appelée.
TcxGridBandedTableView.OnCustomDrawBandHeader
Se produit lorsqu'un en- tête de bande dans une vue de table à bandes doit être peint. Syntaxe
TcxGridBandCustomDrawHeaderEvent = procédure (expéditeur :
TcxGridBandedTableView ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridBandHeaderViewInfo ; var ADone : booléen) de objet ;
propriété OnCustomDrawBandHeader : TcxGridBandCustomDrawHeaderEvent ;
Description Cet événement se déclenche chaque fois qu'un en-tête de bande doit être dessiné.
Comme pour les autres événements de dessin personnalisés, il fournit un canevas pour le
contrôle de grille (le paramètre ACanvas ), ViewInfo pour obtenir le rectangle englobant de
l'en-tête de bande (le paramètre AViewInfo et sa propriété Bounds ). Sender est la vue qui a
initié le repaint. Le paramètre ADone est initialement False , vous devez le définir sur True
pour indiquer à la grille que vous avez choisi de dessiner l'en-tête de bande.
TcxGridColumn.OnCustomDrawFooterCell
Se produit lorsqu'une cellule de pied de page ou une cellule de pied de page de groupe dans la
colonne actuelle doit être peinte. Syntaxe
TcxGridColumnCustomDrawHeaderEvent = procédure (Expéditeur :
TcxGridTableView ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridColumnHeaderViewInfo ; var ADone : Booléen) de objet ;
propriété OnCustomDrawFooterCell : TcxGridColumnCustomDrawHeaderEvent ;
Description Comme pour les autres événements de dessin personnalisés, cet événement
fournit un canevas pour le contrôle de grille (le paramètre ACanvas ) et ViewInfo pour obtenir
le rectangle englobant de l'élément peint (le paramètre AViewInfo et sa propriété Bounds ).
L'expéditeur est généralement l'élément qui a causé le repaint. Le paramètre ADone est
initialement False , vous devez le définir sur True pour indiquer à la grille que vous avez
choisi de dessiner cet élément de manière personnalisée.
Pour peindre manuellement les résumés de groupe d'une colonne situés dans des lignes de
groupe , gérez plutôt l' événement TcxGridColumn.OnCustomDrawGroupSummaryCell de la
colonne.
TcxGridColumn.OnCustomDrawHeader
Se produit lorsqu'un en- tête de colonne doit être peint. Syntaxe
TcxGridColumnCustomDrawHeaderEvent = procédure (Expéditeur :
TcxGridTableView ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridColumnHeaderViewInfo ; var ADone : Booléen) de objet ;
propriété OnCustomDrawHeader : TcxGridColumnCustomDrawHeaderEvent ;
Description Comme pour les autres événements de dessin personnalisés, cet événement
fournit un canevas pour le contrôle de grille (le paramètre ACanvas ) et ViewInfo pour obtenir
le rectangle englobant de l'élément peint (le paramètre AViewInfo et sa propriété Bounds ).
L'expéditeur est généralement l'élément qui a causé le repaint. Le paramètre ADone est
initialement False , vous devez le définir sur True pour indiquer à la grille que vous avez
choisi de dessiner cet élément de manière personnalisée.
TcxGridTableView.OnCustomDrawColumnHeader
Se produit lorsqu'un en- tête de colonne doit être peint. Syntaxe
TcxGridColumnCustomDrawHeaderEvent = procédure (Expéditeur :
TcxGridTableView ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridColumnHeaderViewInfo ; var ADone : Booléen) de objet ;
propriété OnCustomDrawColumnHeader : TcxGridColumnCustomDrawHeaderEvent ;
Description Cet événement se produit chaque fois qu'un en-tête de colonne doit être dessiné.
Comme avec les autres événements de dessin personnalisés, l'événement fournit un canevas
pour le contrôle de grille (le paramètre ACanvas ) et un objet ViewInfo pour obtenir le
rectangle englobant de l'élément peint (le paramètre AViewInfo et sa propriété Bounds ).
Sender est la vue qui a causé le repaint. Le paramètre ADone est initialement False .
Définissez-le sur True pour indiquer à la grille que vous avez choisi de dessiner l'élément
(en-tête de colonne).
TcxCustomGridTableView.OnCustomDrawPartBackground
Vous permet de personnaliser l'arrière-plan d'un élément View . Syntaxe
TcxGridPartCustomDrawBackgroundEvent = procédure (Expéditeur :
TcxCustomGridTableView ; ACanvas : TcxCanvas ; AViewInfo :
TcxCustomGridCellViewInfo ; var ADone : Booléen) de objet ;
propriété OnCustomDrawPartBackground :
TcxGridPartCustomDrawBackgroundEvent ;
Description Cet événement se déclenche pour les éléments suivants : panneau Filtre ; panneau
Rechercher ; Panneau de pied de page ; Panneaux de pied de groupe ; Zone Grouper par .
Le paramètre Sender de l'événement OnCustomDrawPartBackground identifie la vue dont
l'élément doit être peint. Le paramètre ACanvas fournit la surface de dessin. Le paramètre
ADone spécifie si le dessin par défaut doit être effectué après l'exécution du gestionnaire
d'événements. Définissez ce paramètre sur True si vous avez peint l'élément et que le
traitement par défaut n'est pas requis.
Le paramètre AViewInfo permet d'accéder à l' objet ViewInfo dont les propriétés et la méthode
permettent d'obtenir des informations sur l'élément peint. Par exemple, vous pouvez
déterminer l'élément à peindre et obtenir les limites de l'élément à l'aide de la propriété
Bounds de cet objet . Le tableau ci-dessous répertorie tous les éléments disponibles pour la
peinture personnalisée à l'aide de l'événement et les types d'objets ViewInfo correspondants
(noms de classe).
Élément Nom de la classe ViewInfo
Panneau de filtre TcxGridFilterViewInfoTcxGridFilterViewInfo
Panneau Rechercher TcxGridFindPanelViewInfo
Panneau de pied de page TcxGridFooterViewInfoTcxGridFooterViewInfo
Panneaux de pied de page de TcxGridRowFooterViewInfo
groupe
Zone Grouper par TcxGridGroupByBoxViewInfo
Dans l'exemple ci-dessous, la zone Grouper par est personnalisée en gérant l' événement
OnCustomDrawPartBackground . La boîte est rendue avec une image personnalisée
chargée à partir d'un fichier externe. Pour les autres éléments de la vue, la peinture par défaut
est utilisée.
[Delphi]
//A brush used to fill the "group by" box
var
APatternBrush: TBrush;
//Create the pattern brush by loading an image to it
procedure TForm1.FormCreate(Sender: TObject);
begin
APatternBrush := TBrush.Create;
APatternBrush.Bitmap := TBitmap.Create;
APatternBrush.Bitmap.LoadFromFile('c:\texture1.bmp');
end;
//An OnCustomDrawPartBackground handler
procedure TForm1.cxGrid1DBTableView1CustomDrawPartBackground(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean);
begin
if AViewInfo is TcxGridGroupByBoxViewInfo then
begin
//Fill the "group by" box with the pattern brush
ACanvas.Brush := APatternBrush;
ACanvas.FillRect(AViewInfo.Bounds);
//Disable the default painting of the "group by" box
ADone := True;
end else
//Enable the default painting of other View elements
ADone := False;
end;
end;
//Dispose of the pattern brush
procedure TForm1.FormDestroy(Sender: TObject);
begin
APatternBrush.Bitmap.Free;
APatternBrush.Free;
end;
La capture d'écran suivante montre le résultat de la gestion de l'événement.
TcxCustomGridTableItem.OnCustomDrawCell
Se produit lorsqu'une cellule de tableau ou une cellule de carte doit être peinte. Syntaxe
TcxGridTableDataCellCustomDrawEvent = procédure (Expéditeur :
TcxCustomGridTableView ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridTableDataCellViewInfo ; var ADone : Booléen) de objet ;
propriété OnCustomDrawCell : TcxGridTableDataCellCustomDrawEvent ;
Description Cet événement se produit chaque fois qu'une cellule de tableau ou une cellule de
carte doit être peinte. Comme pour les autres événements de dessin personnalisés, il fournit un
canevas pour le contrôle de grille ( paramètre ACanvas ), ViewInfo pour obtenir le rectangle
englobant de l'élément peint ( paramètre AViewInfo et sa propriété Bounds ). L'expéditeur est
généralement l'élément qui a causé le repaint. Le paramètre ADone est initialement False ,
vous devez le définir sur True pour indiquer à la grille que vous avez choisi de dessiner cet
élément de manière personnalisée.
TcxGridTableView.OnCustomDrawGroupCell
Vous permet de peindre des lignes groupées de manière personnalisée. Syntaxe
TcxGridTableCellCustomDrawEvent = procédure (Expéditeur :
TcxCustomGridTableView ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridTableCellViewInfo ; var ADone : Booléen) de objet ;
propriété OnCustomDrawGroupCell : TcxGridTableCellCustomDrawEvent ;
Description Gérez l' événement OnCustomDrawGroupCell pour prendre le contrôle de la
peinture des lignes groupées. Cet événement se déclenche juste avant qu'une ligne de
regroupement ne soit peinte. Les paramètres d'événement ACanvas et AViewInfo spécifient le
canevas sur lequel dessiner et l' objet ViewInfo sur les lignes, respectivement. Veuillez vous
référer à la description de la classe TcxGridTableCellViewInfo pour plus de détails sur cet
objet ViewInfo.
Le paramètre ADone spécifie si le dessin par défaut doit être effectué après l'exécution du
gestionnaire d'événements. Définissez-le sur True pour interdire la peinture par défaut pour la
ligne traitée. Laissez le paramètre défini sur False pour peindre la rangée de groupe en
utilisant le processus de peinture normal.
Le paramètre Sender spécifie la vue dont la ligne est peinte.
TcxGridColumn.OnCustomDrawGroupSummaryCell
Se déclenche chaque fois qu'un résumé de groupe (appartenant à la colonne actuellement
traitée) est sur le point d'être dessiné dans une ligne de groupe . Syntaxe
TcxGridGroupSummaryCellCustomDrawEvent = procédure (Sender : TObject ;
ACanvas : TcxCanvas ; ARow : TcxGridGroupRow ; AColumn : TcxGridColumn ;
ASummaryItem : TcxDataSummaryItem ; AViewInfo :
TcxCustomGridViewCellViewInfo ; var ADone : booléen) de l'objet ;
propriété OnCustomDrawGroupSummaryCell :
TcxGridGroupSummaryCellCustomDrawEvent ;
Description Implémentez le gestionnaire d'événements
OnCustomDrawGroupSummaryCell pour personnaliser le résumé du groupe dans une
ligne de groupe pour une colonne particulière. L'expéditeur spécifie la colonne actuellement
traitée. ACanvas spécifie la surface de dessin. ARow spécifie la ligne du groupe dans laquelle
le résumé du groupe est actuellement dessiné. AColumn spécifie la colonne actuellement
traitée. ASummaryItem spécifie le résumé du groupe actuellement dessiné. AViewInfo fournit
les informations ViewInfo pour rendre le résumé du groupe. ADone spécifie si la peinture par
défaut est requise. Définissez ADone sur True pour empêcher la peinture par défaut.
Pour peindre manuellement les résumés de groupe d'une colonne situés dans les panneaux de
pied de groupe , gérez plutôt l' événement OnCustomDrawFooterCell de la colonne.
TcxGridTableView.OnCustomDrawIndicatorCell
Se produit lors de la peinture d'une cellule d'indicateur dans une vue de tableau. Syntaxe
TcxGridIndicatorCellCustomDrawEvent = procedure(Sender : TcxGridTableView ;
ACanvas : TcxCanvas ; AViewInfo : TcxCustomGridIndicatorItemViewInfo ; var
ADone : booléen) de objet ;
propriété OnCustomDrawIndicatorCell : TcxGridIndicatorCellCustomDrawEvent ;
Description L' événement OnCustomDrawIndicatorCell se produit chaque fois qu'une
cellule d'indicateur doit être peinte. Semblable à d'autres événements de dessin personnalisés,
il fournit un canevas pour le contrôle de grille (le paramètre ACanvas ) et les informations
ViewInfo sur la cellule de l'indicateur (le paramètre AViewInfo ). Le paramètre Sender est la
vue qui a initié le repaint. Le paramètre ADone est initialement False . Vous devez le définir
sur True pour informer le contrôle de grille que le dessin personnalisé a été appliqué à cet
élément.
L'exemple suivant montre comment imiter une colonne fixe de la vue Table à l'aide de l'
événement OnCustomDrawIndicatorCell
procedure
TViewTableSimpleDemoMainForm.cxgFilmsDBTableViewCustomDrawIndicatorCell(Sen
der: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo:
TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
var
FValue: string;
FBounds: TRect;
begin
FBounds := AViewInfo.Bounds;
if (AViewInfo is TcxGridIndicatorHeaderItemViewInfo) then
begin
ACanvas.Brush.Color := $00C56A31;
ACanvas.FillRect(FBounds);
ACanvas.DrawComplexFrame(FBounds, clBlack, clBlack, cxBordersAll, 1);
ACanvas.Font.Color := clWhite;
ACanvas.Font.Style := [fsBold];
ACanvas.Brush.Style := bsClear;
InflateRect(FBounds, -3, 0);
ACanvas.DrawText('Year', FBounds, cxAlignLeft or cxAlignVCenter);
ADone := True;
end
else if (AViewInfo is TcxGridIndicatorRowItemViewInfo) then
begin
ACanvas.FillRect(FBounds);
ACanvas.DrawComplexFrame(FBounds, clBlack, clBlack, [bBottom, bLeft,
bRight], 1);
FValue :=
TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Values[cxgFilmsDBTabl
eViewYEAR.Index];
InflateRect(FBounds, -3, -2);
ACanvas.Font.Color := clBlack;
ACanvas.Brush.Style := bsClear;
ACanvas.DrawText(FValue, FBounds, cxAlignRight or cxAlignTop);
ADone := True;
end;
end;
TcxGridChartDiagram.OnCustomDrawLegend
Se produit lorsqu'une légende de graphique doit être peinte. Syntaxe
TcxGridChartDiagramLegendCustomDrawEvent = procédure (Expéditeur :
TcxGridChartDiagram ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridChartLegendViewInfo ; var ADone : Booléen) de l'objet ;
propriété OnCustomDrawLegend : TcxGridChartDiagramLegendCustomDrawEvent ;
Description L' événement OnCustomDrawLegend se produit chaque fois que la zone d'une
légende de graphique doit être peinte. Comme pour les autres événements de dessin
personnalisés, il fournit un canevas pour le contrôle de grille (le paramètre ACanvas ),
ViewInfo (le paramètre AViewInfo et sa propriété Bounds ) pour obtenir le rectangle
englobant de l'élément peint (dans ce cas, la légende du graphique). L'expéditeur est
normalement l'élément qui a causé le repaint. La valeur du paramètre ADone est initialement
définie sur False . Définissez-le sur True pour empêcher la grille d'effectuer la peinture par
défaut et de peindre sur toute peinture personnalisée. Remarque : L'événement
OnCustomDrawLegend de la vue graphique peut remplacer l' événement
OnCustomDrawLegend du diagramme puisque le premier est déclenché après le second.
Pour en savoir plus sur le dessin personnalisé, veuillez consulter la rubrique Dessin
personnalisé .
TcxGridChartDiagram.OnCustomDrawLegendItem
Se produit lorsqu'un élément de légende doit être peint. Syntaxe
TcxGridChartDiagramLegendItemCustomDrawEvent = procédure (Expéditeur :
TcxGridChartDiagram ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridChartLegendItemViewInfo ; var ADone : Booléen) de l'objet ;
propriété OnCustomDrawLegendItem :
TcxGridChartDiagramLegendItemCustomDrawEvent ;
Description L' événement OnCustomDrawLegendItem se produit chaque fois qu'un élément
de légende (une clé de légende et sa description, c'est-à-dire le texte d'affichage de la série qui
correspond à l'élément de légende) doit être peint. Comme pour les autres événements de
dessin personnalisés, il fournit un canevas pour le contrôle de grille (le paramètre ACanvas ),
ViewInfo (le paramètre AViewInfo et sa propriété Bounds ) pour obtenir le rectangle
englobant de l'élément peint (dans ce cas, l'élément de légende). L'expéditeur est
généralement l'élément qui a causé le repaint. La valeur du paramètre ADone est initialement
False . Définissez-le sur True pour empêcher le contrôle de grille d'effectuer une peinture de
dessin par défaut sur la peinture personnalisée effectuée. Remarque : L'événement
OnCustomDrawLegendItem de la vue graphique peut remplacer l' événement
OnCustomDrawLegendItem du diagramme puisque le premier est déclenché après le
second.
Pour en savoir plus sur le dessin personnalisé, veuillez consulter la rubrique Dessin
personnalisé .
TcxGridChartHistogram.OnCustomDrawPlot
Se produit lorsque la zone de traçage d'un graphique doit être peinte. Syntaxe
TcxGridChartHistogramPlotCustomDrawEvent = procédure (Expéditeur :
TcxGridChartHistogram ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridChartHistogramViewInfo ; const ABounds : TRect ; var ADone :
Booléen) de l'objet ;
propriété OnCustomDrawPlot :
TcxGridChartHistogramPlotCustomDrawEvent ;
Description Le paramètre Sender permet d'accéder au diagramme qui a provoqué le redessin
de la zone de traçage d'un graphique. Les paramètres ACanvas et AViewInfo permettent
d'accéder au canevas et à ViewInfo du contrôle de grille. Le paramètre ABounds spécifie le
rectangle de délimitation de la zone de traçage d'un graphique en cours de peinture. Notez que
les mêmes informations sont accessibles via le AViewInfo . Propriété PlotBounds . Comme
pour les autres événements de dessin personnalisés, la valeur du paramètre ADone est
initialement False . Définissez-le sur True pour empêcher le contrôle de grille d'effectuer la
peinture par défaut.
Pour en savoir plus sur le dessin personnalisé,reportez-vous à la rubrique Dessin personnalisé.
TcxGridChartDiagram.OnCustomDrawValue
Se produit lorsqu'un marqueur de données doit être peint. Syntaxe
TcxGridChartDiagramValueCustomDrawEvent = procédure (Expéditeur :
TcxGridChartDiagram ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridChartDiagramValueViewInfo ; var ADone : Booléen) de l'objet ;
propriété OnCustomDrawValue : TcxGridChartDiagramValueCustomDrawEvent ;
Description L' événement OnCustomDrawValue se produit chaque fois qu'un marqueur de
données (par exemple, une barre pour un diagramme à barres ou une colonne pour un
diagramme à colonnes) doit être dessiné. Comme pour les autres événements de dessin
personnalisés, il fournit un canevas pour le contrôle de grille (le paramètre ACanvas ),
ViewInfo (le paramètre AViewInfo et ses Bounds propriété) pour obtenir le rectangle
englobant de l'élément peint (dans ce cas, le marqueur de données). L'expéditeur est
généralement l'élément qui a causé le repaint. La valeur du paramètre ADone est initialement
False . Définissez-le sur True pour empêcher la grille d'effectuer la peinture par défaut et de
peindre sur toute peinture personnalisée. Notez que l' événement OnCustomDrawValue du
diagramme pour une série spécifique est déclenché uniquement lorsque le gestionnaire
d'événement OnCustomDrawValue de cette série n'a pas fini de dessiner le marqueur de
données.
Pour en savoir plus sur le dessin personnalisé, veuillez consulter la rubrique Dessin
personnalisé .
TcxGridChartAreaDiagram.OnCustomDrawValueArea
Se produit lorsqu'une zone de valeur pour un marqueur de données doit être peinte. Syntaxe
TcxGridChartAreaDiagramValueAreaCustomDrawEvent = procédure (expéditeur :
TcxGridChartAreaDiagram ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridChartAreaDiagramValueViewInfo ; var ADone : booléen) de l'objet ;
propriété OnCustomDrawValueArea :
TcxGridChartAreaDiagramValueAreaCustomDrawEvent ;
Description Dans les diagrammes d'aires , les marqueurs de données sont peints en deux
passes. La zone de valeurs d'un diagramme en aires est dessinée en premier, puis les
marqueurs de valeur et les lignes qui relient les points de valeur adjacents sont peints. Vous
pouvez gérer l' événement OnCustomDrawValueArea pour personnaliser une zone de
valeur pour chaque marqueur de données. Pour personnaliser les marqueurs de valeur de
peinture et les lignes reliant les points de valeur adjacents après la première passe, gérez la
OnCustomDrawValue du diagramme ou la série correspondante.
Le paramètre Sender permet d'accéder au diagramme de zone qui a provoqué le repeint d'une
zone de valeur ; Les paramètres ACanvas et AViewInfo permettent d'accéder au canevas et à
ViewInfo du contrôle de grille. Le rectangle de délimitation de la zone de valeur peinte peut
être obtenu via AViewInfo . Limite la propriété. Comme pour les autres événements de dessin
personnalisés, la valeur du paramètre ADone est initialement False .
Pour en savoir plus sur le dessin personnalisé, veuillez consulter la rubrique Dessin
personnalisé .
TcxGridChartPieDiagram.OnCustomDrawSeriesSite
Se produit lorsque la zone d'un site de série doit être peinte. Syntaxe
TcxGridChartPieDiagramSeriesSiteCustomDrawEvent = procédure (Expéditeur :
TcxGridChartPieDiagram ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridChartPieSeriesSiteViewInfo ; var ADone : booléen) de l'objet ;
propriété OnCustomDrawSeriesSite :
TcxGridChartPieDiagramSeriesSiteCustomDrawEvent ;
Description Le paramètre Expéditeur permet d'accéder au diagramme circulaire qui a
provoqué le repeint de la zone d'un site de série. Les paramètres ACanvas et AViewInfo
permettent d'accéder au canevas et à ViewInfo du contrôle de grille. Le rectangle de
délimitation de la zone du site de la série en cours de peinture peut être obtenu via AViewInfo .
Limite la propriété. La série dont le site est en train d'être peint est accessible via le
AViewInfo . Propriété de série . Comme pour les autres événements de dessin personnalisés,
la valeur du paramètre ADone est initialement False .
Pour en savoir plus sur le dessin personnalisé, reportez-vous à la rubrique Dessin personnalisé
TcxGridChartPieDiagram.OnCustomDrawSeriesSiteCaption
Se produit lorsque la légende d'un site de série doit être peinte. Syntaxe
TcxGridChartPieDiagramSeriesSiteCaptionCustomDrawEvent = procédure
(Expéditeur : TcxGridChartPieDiagram ; ACanvas : TcxCanvas ; AViewInfo :
TcxGridChartPieSeriesSiteCaptionViewInfo ; var ADone : Boolean) de l'objet
;
propriété OnCustomDrawSeriesSiteCaption :
TcxGridChartPieDiagramSeriesSiteCaptionCustomDrawEvent ;
Description Le paramètre Sender permet d'accéder au diagramme circulaire qui a provoqué le
repaint de la légende du site de la série. Les paramètres ACanvas et AViewInfo permettent
d'accéder au canevas et à ViewInfo du contrôle de grille. Le rectangle de délimitation de la
légende du site de la série en cours de peinture peut être obtenu via AViewInfo . Limite la
propriété. La série dont le site est en train d'être peint est accessible via le AViewInfo .
Propriété de série . Comme pour les autres événements de dessin personnalisés, la valeur du
paramètre ADone est initialement False .
Pour en savoir plus sur le dessin personnalisé, reportez-vous à la rubrique Dessin
personnalisé.
Comment personnaliser le contrôle de la grille à l'aide de peintres
personnalisés
éléments de vue de la grille de peinture , l'implémentation standard consiste à gérer les
événements associés. Mais pour certains éléments, la seule approche consiste à remplacer les
méthodes des classes utilisées pour peindre ces éléments. Parallèlement, vous devrez
également remplacer les méthodes qui renvoient une classe painter appropriée . Pour les
getters ViewInfo et painter, la règle de convention de dénomination suivante est utilisée.
Toutes les méthodes qui permettent d'accéder aux objets ViewInfo utilisent le modèle
d'identificateur suivant - GetXXXViewInfoClass . Chaque instance d'une classe de peintre
est accessible à partir de l'objet ViewInfo via la méthode GetPainterClass . Pour illustrer
comment vous pouvez implémenter des tâches de peinture personnalisées dans ces cas,
considérez l'exemple suivant. Supposons que vous deviez personnaliser la ligne de données de
base . La grille ne fournit pas d'événement associé pour cela, vous devrez donc dériver des
classes TcxGridMasterDataRowViewInfo et TcxGridMasterDataRowPainter . Dans le
descendant de TcxGridMasterDataRowViewInfo , remplacez la méthode GetPainterClass
, dans laquelle vous renvoyez la sous-classe de TcxGridMasterDataRowPainter . Ensuite,
pour informer le contrôle que de nouvelles classes sont maintenant utilisées pour représenter
visuellement la ligne de données maître, implémentez les descendants des classes suivantes et
remplacez les méthodes suivantes : La classe TcxGridMasterDataRow et sa méthode
GetViewInfoClass . La classe TcxGridViewData et sa méthode GetRecordClass . La classe
TcxGridTableView et sa méthode GetViewDataClass . La classe
TcxGridMasterDataRowViewInfo et sa méthode GetPainterClass . Enfin, remplacez la
méthode TcxMyGridMasterDataRowPainter.DrawExpandButtonCell pour peindre la
zone du bouton de développement de la ligne de données maître avec la couleur spécifiée.
L'exemple suivant montre comment implémenter la peinture personnalisée de la ligne de
données maître à l'aide du mécanisme d'héritage décrit :
[Delphi]
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
cxDataStorage, cxEdit, DB, cxDBData, cxGridLevel, cxGridCustomTableView,
cxGridTableView, cxGridDBTableView, cxClasses, cxControls,
cxGridCustomView, cxGrid, DBTables, cxGridRows;
type
TcxMyGridDBTableView = class(TcxGridDBTableView)
protected
function GetViewDataClass: TcxCustomGridViewDataClass; override;
end;
TcxMyGridViewData = class(TcxGridViewData)
protected
function GetRecordClass(ARecordInfo: TcxRowInfo):
TcxCustomGridRecordClass; override;
end;
TcxMyGridMasterDataRow = class(TcxGridMasterDataRow)
protected
function GetViewInfoClass: TcxCustomGridRecordViewInfoClass; override;
end;
TcxMyGridMasterDataRowViewInfo = class(TcxGridMasterDataRowViewInfo)
protected
function GetPainterClass: TcxCustomGridCellPainterClass; override;
end;
TcxMyGridMasterDataRowPainter = class(TcxGridMasterDataRowPainter)
protected
procedure DrawExpandButtonCell; override;
end;
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DataSource2: TDataSource;
Table2: TTable;
cxGrid1: TcxGrid;
cxGrid1DBTableView1: TcxGridDBTableView;
// ...
cxGrid1Level1: TcxGridLevel;
cxGrid1Level2: TcxGridLevel;
cxGrid2Level1: TcxGridLevel;
cxGrid2: TcxGrid;
cxGrid2Level2: TcxGridLevel;
cxGrid2DBTableView1: TcxGridDBTableView;
cxGrid2TableView1: TcxGridTableView;
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
cxGridDBDataDefinitions;
{ TcxMyGridDBTableView }
function TcxMyGridDBTableView.GetViewDataClass: TcxCustomGridViewDataClass;
begin
Result := TcxMyGridViewData;
end;
{ TcxMyGridViewData }
function TcxMyGridViewData.GetRecordClass(
ARecordInfo: TcxRowInfo): TcxCustomGridRecordClass;
begin
if GridView.IsMaster then
Result := TcxMyGridMasterDataRow
else
Result := inherited GetRecordClass(ARecordInfo);
end;
{ TcxMyGridMasterDataRow }
function TcxMyGridMasterDataRow.GetViewInfoClass:
TcxCustomGridRecordViewInfoClass;
begin
Result := TcxMyGridMasterDataRowViewInfo;
end;
{ TcxMyGridMasterDataRowViewInfo }
function TcxMyGridMasterDataRowViewInfo.GetPainterClass:
TcxCustomGridCellPainterClass;
begin
Result := TcxMyGridMasterDataRowPainter;
end;
{ TcxMyGridMasterDataRowPainter }
procedure TcxMyGridMasterDataRowPainter.DrawExpandButtonCell;
var
ABounds: TRect;
begin
Canvas.Brush.Color := $4FC8FB;
ABounds :=
TcxMyGridMasterDataRowViewInfo(ViewInfo).ExpandButtonCellViewInfo.Bounds;
Canvas.FillRect(ABounds);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
AView: TcxMyGridDBTableView;
begin
cxGrid2.BeginUpdate;
try
AView :=
TcxMyGridDBTableView(cxGrid2.CreateView(TcxMyGridDBTableView));
AView.Assign(cxGrid1DBTableView1);
cxGrid2Level1.GridView := AView;
AView :=
TcxMyGridDBTableView(cxGrid2.CreateView(TcxMyGridDBTableView));
AView.Assign(cxGrid1DBTableView2);
cxGrid2Level2.GridView := AView;
finally
cxGrid2.EndUpdate;
end;
end;
end.
Voici le résultat de l'exécution du code :
Affichage de RecNo dans la grille tcxGrid
Utilisé l’événement suivant :
procedure <AForm>.<AcxGridTableViewColumn>GetDataText(Sender:
TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
var
AIndex: Integer;
begin
AIndex :=
TcxGridTableView(Sender.GridView).DataController.GetRowIndexByRecordIndex(
ARecordIndex, False);
AText := IntToStr(AIndex + 1);
end;