Delphi problème VirtualTreeview.OnAfterItemPaint lors du défilement?
-
19-09-2019 - |
Question
Je reçois des questions de dessin en utilisant OnAfterItemPaint événement lorsque le défilement horizontal est effectué.
En fait ce que je veux réaliser est la fusion de l'effet des cellules sélectionnées, disons par exemple 1 texte pour la colonne 1 et 2, un autre texte pour la colonne 3 et 4, etc ... Jusqu'à présent, VT n'a pas de soutien pour la fusion de la colonne, de sorte que je dessiner manuellement.
Y at-il une solution de contournement ou un autre événement que je devrais utiliser à la place?
Utilisation: Delphi 7 + VirtualTreeview 4.8.5
Source de l'événement:
begin
TargetCanvas.TextOut(ItemRect.Left+ VT1.OffsetX, ItemRect.Top,
'1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF');
end;
Avant de défilement:
texte alt http://a.imagehost.org/0869/screen1.gif
Après défilement (Déplacement vers la droite, puis vers la gauche):
La solution
Il est difficile de dire ce que vous voulez atteindre, mais en voyant que vous avez un long texte qui couvre plusieurs colonnes, je ne suis pas sûr que vous utilisez l'événement approprié - en général, vous voulez que le texte soit tronquée si elle est trop longue pour sa colonne .
Quoi qu'il en soit, la meilleure chose dans la fichier de documentation de VirtualTreeView.pdf et trouver l'événement approprié à utiliser pour ce que vous voulez peindre. Pour OnAfterItemPaint
il est dit:
La peinture après l'étape de l'article est utilisé pour ajouter des choses spécifiques des noeuds comme des cadres, etc. qui concernent toutes les colonnes de ce nœud et est appelé une fois par nœud.
donc je suppose que c'est probablement pas celui que vous voulez utiliser.
Modifier
OK, si vous allez pour la fusion des cellules que vous ne devez supprimer l'ajout de VT1.OffsetX
(et ajouter VT1.TextMargin
à la place) pour obtenir le comportement correct. Cela suppose bien sûr, vous voulez commencer la sortie de texte dans la première colonne (indice 0), sinon vous devez calculer la position horizontale du texte de la largeur des colonnes.
Mais à partir de la description des étapes de peinture je encore plutôt utiliser l'événement BeforeItemPaint
et définissez le paramètre CustomDraw
var pour True
sauter une peinture par défaut.
Autres conseils
Avez-vous essayé ceci:
TreeOptions.AutoOptions := TreeOptions.AutoOptions + [toAutoSpanColumns];
Il fait à peu près ce que vous avez besoin. Ils ne peut être question que vous ne pouvez pas spécifier quelles colonnes il est activé. Vous pouvez probablement contourner ce problème en limitation en définissant le celltext à un des espaces pour les colonnes que vous ne voulez pas étendre dans.