AMÉLIOREZ VOS LISTVIEW: ALTERNER LA COULEUR DE LA POLICE ET / OU D'ARRIÈRE-PLAN
BZY1
Messages postés214Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention12 avril 2008
-
12 janv. 2006 à 08:44
bnisaid
Messages postés24Date d'inscriptionsamedi 31 décembre 2005StatutMembreDerniè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.
bnisaid
Messages postés24Date d'inscriptionsamedi 31 décembre 2005StatutMembreDerniè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és6Date d'inscriptionvendredi 9 juin 2006StatutMembreDernière intervention22 juin 2010 10 févr. 2007 à 18:48
alors personne peut m'expliquer svp ?
horneth
Messages postés6Date d'inscriptionvendredi 9 juin 2006StatutMembreDernière intervention22 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 4 févr. 2007 à 23:11
Subclassing
horneth
Messages postés6Date d'inscriptionvendredi 9 juin 2006StatutMembreDernière intervention22 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és4Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention 8 janvier 2007 8 janv. 2007 à 20:02
Excellent. Merci Renfield pour l'astuce sur flexgrid.
XelectroX
Messages postés209Date d'inscriptionsamedi 11 novembre 2000StatutMembreDernière intervention 6 novembre 2009 8 janv. 2007 à 19:17
Ne fonctionne pas en VB5
:-(
Si quelqu'un a une solution ...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és4Date d'inscriptionmercredi 4 octobre 2006StatutMembreDerniè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és200Date d'inscriptionjeudi 26 février 2004StatutMembreDernière intervention30 juin 2008 22 mai 2006 à 10:25
super et sympa. cela permet d'ameliorer nos interfaces.
merci.
KATZ317
Messages postés4Date d'inscriptionvendredi 22 avril 2005StatutMembreDerniè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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és26Date d'inscriptionsamedi 24 août 2002StatutMembreDerniè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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és26Date d'inscriptionsamedi 24 août 2002StatutMembreDerniè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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és12Date d'inscriptionlundi 16 mai 2005StatutMembreDernière intervention20 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és214Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention12 avril 2008 12 janv. 2006 à 08:44
18 juin 2007 à 01:30
Controls 5.0 :(
10 févr. 2007 à 18:48
5 févr. 2007 à 19:11
Si tu veux bien m'éclairer un peu plus ?
Merci en tout cas :)
4 févr. 2007 à 23:11
4 févr. 2007 à 18:56
Merci ;)
9 janv. 2007 à 06:47
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
8 janv. 2007 à 20:02
8 janv. 2007 à 19:17
:-(
Si quelqu'un a une solution ...
2 déc. 2006 à 23:19
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...)
2 déc. 2006 à 00:01
Est-ce que qqn saurait faire la même chose (alterner les couleurs par ligne) avec un Flexgrid?
22 mai 2006 à 10:25
merci.
20 janv. 2006 à 12:19
13 janv. 2006 à 00:52
Mod n'implique en interne qu'une division, et est donc clairement la plus rapide...
12 janv. 2006 à 21:35
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...
12 janv. 2006 à 13:11
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.
12 janv. 2006 à 12:06
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.
12 janv. 2006 à 10:49
à 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
12 janv. 2006 à 08:51
If Round(i / 2) <> i / 2 Then
c'est plus performant d'utiliser
If i mod 2 = 0 Then
12 janv. 2006 à 08:44