AMÉLIOREZ VOS LISTVIEW: ALTERNER LA COULEUR DE LA POLICE ET / OU D'ARRIÈRE-PLAN

BZY1 Messages postés 214 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 12 avril 2008 - 12 janv. 2006 à 08:44
bnisaid Messages postés 24 Date d'inscription samedi 31 décembre 2005 Statut Membre Dernière intervention 3 novembre 2007 - 18 juin 2007 à 01:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35519-ameliorez-vos-listview-alterner-la-couleur-de-la-police-et-ou-d-arriere-plan

bnisaid Messages postés 24 Date d'inscription samedi 31 décembre 2005 Statut Membre Dernière intervention 3 novembre 2007
18 juin 2007 à 01:30
Ne fonctionne pas avec la ListView de la control Microsoft Windows
Controls 5.0 :(
horneth Messages postés 6 Date d'inscription vendredi 9 juin 2006 Statut Membre Dernière intervention 22 juin 2010
10 févr. 2007 à 18:48
alors personne peut m'expliquer svp ?
horneth Messages postés 6 Date d'inscription vendredi 9 juin 2006 Statut Membre Dernière intervention 22 juin 2010
5 févr. 2007 à 19:11
Euh merci d'essayer de m'aider mais j'avoue que je suis relativement débutant vb.net et malgré le fait que je vienne de lire un tuto sur le subclassing (http://www.vbfrance.com/tutoriaux/SUBCLASSING-VB6-VB-NET_339.aspx) ca risque d'être un peu chaud pour moi si on m'aide pas un peu parce que j'avoue que j'ai pas compris grand chose... :s

Si tu veux bien m'éclairer un peu plus ?
Merci en tout cas :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 févr. 2007 à 23:11
Subclassing
horneth Messages postés 6 Date d'inscription vendredi 9 juin 2006 Statut Membre Dernière intervention 22 juin 2010
4 févr. 2007 à 18:56
Et dans le même genre est-ce que vous savez comment changer la couleur du texte de la ligne sélectionnée dans un listbox ? J'ai bien dit un listbox pas un listview ^^
Merci ;)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 janv. 2007 à 06:47
j'ignore ce qui empeche ce code de fonctionner avec VB5 (je ne connais pas VB5)

pas de soucis, teststes, a noter que ce code montre la facon la plus rapide de savoir si un nombre est pair ou non :

If (iRow And 1) Then
teststes Messages postés 4 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 8 janvier 2007
8 janv. 2007 à 20:02
Excellent. Merci Renfield pour l'astuce sur flexgrid.
XelectroX Messages postés 209 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 6 novembre 2009
8 janv. 2007 à 19:17
Ne fonctionne pas en VB5
:-(
Si quelqu'un a une solution ...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 déc. 2006 à 23:19
rien de plus simple...

Public Sub AlternateBackColor(voGrid As MSFlexGrid, ByVal vnBackColor As OLE_COLOR, ByVal vnAlterBackColor As OLE_COLOR)
Dim iRow As Integer
Dim iCol As Integer
Dim lColor As Long
With voGrid
bMustRedraw = .Redraw
.Redraw = False
For iRow = 1 To .Rows - 1
.Row = iRow
If (iRow And 1) Then
lColor = vnBackColor
Else
lColor = vnAlterBackColor
End If
For iCol = 0 To .cols - 1
.Col = iCol
.CellBackColor = lColor
Next iCol
Next iRow
.Redraw = bMustRedraw
End With
End Sub


ensuite, tu fais un simple appel a la procédure, après que tu aies construit ta grille (et a chaque fois que tu ajoutes lignes ou colonnes...)
teststes Messages postés 4 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 8 janvier 2007
2 déc. 2006 à 00:01
Très sympa le code.
Est-ce que qqn saurait faire la même chose (alterner les couleurs par ligne) avec un Flexgrid?
zeunz Messages postés 200 Date d'inscription jeudi 26 février 2004 Statut Membre Dernière intervention 30 juin 2008
22 mai 2006 à 10:25
super et sympa. cela permet d'ameliorer nos interfaces.
merci.
KATZ317 Messages postés 4 Date d'inscription vendredi 22 avril 2005 Statut Membre Dernière intervention 4 avril 2009
20 janv. 2006 à 12:19
Merci, je cherchais ce type de code depuis un moment. Je vais l'utiliser dans une de mes applis. 9/10
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 janv. 2006 à 00:52
ma "suggestion" n'en était pas vraiment une, je ne faisais que mentionner une solution alternative...

Mod n'implique en interne qu'une division, et est donc clairement la plus rapide...
cs_Pim Messages postés 26 Date d'inscription samedi 24 août 2002 Statut Membre Dernière intervention 6 septembre 2006
12 janv. 2006 à 21:35
Un petit test sur la meilleure méthode pour déterminer si un nombre est pair ou impair.
Sur une boucle allant de 1 à 10 millions, voici les résultats, selon la métode utilisée:

- If Round(i / 2) <> i / 2 Then ... (la méthode que j'avais utilisée) : 15 secondes.

- If i mod 2 = 0 Then ... (suggérée par ImmoAssist): 5 secondes.

- If i \ 2 <> i / 2 Then ... (suggérée par Renfield): 9 secondes.

Bien sûr tout cela sur le même PC, dans les mêmes conditions (aucun autre programme en exécution, ...).

Donc, bravo à ImmoAssist qui a trouvé la solution de loin la plus rapide...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 janv. 2006 à 13:11
dans les changements apportés :

picturebox de 1 de large (mode Tile activé)
background même pour une listview vide
suppression du background, si listview en vue <> lvwReport
non modification du ScaleMode du Parent

la pictureBox fonctionne, tu peux garder cela comme c'est.

une autre solution serait de créer (API) un DC, un HBITMAP, et de génerer un IPictureDisp avec tout ca... un peu complexe, pour pas grand chose... (coté mémoire, on y gagne, je pense).
reste que vu que cette opération n'est a effectuer qu'une seule et unique fois, on est tranquille, et pas trop regardant sur ce point.
cs_Pim Messages postés 26 Date d'inscription samedi 24 août 2002 Statut Membre Dernière intervention 6 septembre 2006
12 janv. 2006 à 12:06
Ok pour les améliorations du code: elles se justifient bien.
Concernant la technique du chargement dynamique d'une PictureBox, ça ne ralentit guère l'affichage et ça me semble assez propre. Maintenant, s'il existe d'autres solutions, cela m'intéresserait de les connaître: je n'ai pas vu grand chose sur ce sujet qui soit valable. Mais je n'ai peut-être pas fait le tour des recherches possibles.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 janv. 2006 à 10:49
bien d'accord avec ImmoAssist...

à noter que ce test pourrait être :
If i \ 2 <> i / 2 Then

qui est là plus efficace que Round.


le principe est interessant, je dois dire. le chargement dynamique d'un picturebox n'est pas du meilleur gout, mais a l'avantage d'etre efficace.

j'ai nettoyé un peu le code :


Private Sub AltLVBackground(Lv As ListView, ByVal BackColorOne As OLE_COLOR, ByVal BackColorTwo As OLE_COLOR)
Dim lH As Long
Dim picAlt As PictureBox
With Lv
If .View = lvwReport Then
Set picAlt = Me.Controls.Add("VB.PictureBox", "picAlt")

.PictureAlignment = lvwTile
If .ListItems.Count > 0 Then
lH = .ListItems(1).Height
Else
.ListItems.Add
lH = .ListItems(1).Height
.ListItems.Remove (1)
End If

With picAlt
.ScaleMode = Me.ScaleMode
.BackColor = BackColorOne
.AutoRedraw = True
.Height = lH * 2
.BorderStyle = 0
.Width = 1
picAlt.Line (0, lH)-(0, lH * 2), BackColorTwo
Set Lv.Picture = .Image
End With

Set picAlt = Nothing
Me.Controls.Remove "picAlt"
Else
Set .Picture = Nothing
End If
End With
End Sub
ImmoAssist Messages postés 12 Date d'inscription lundi 16 mai 2005 Statut Membre Dernière intervention 20 février 2006
12 janv. 2006 à 08:51
Pour la ligne
If Round(i / 2) <> i / 2 Then

c'est plus performant d'utiliser

If i mod 2 = 0 Then
BZY1 Messages postés 214 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 12 avril 2008
12 janv. 2006 à 08:44
sympa je ne savais pas qu'on pouvait faire ça.
Rejoignez-nous