ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 2007
-
3 nov. 2006 à 16:56
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
20 juin 2007 à 16:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juin 2007 à 16:43
ravi que ca te plaise
darth3d
Messages postés6Date d'inscriptionsamedi 29 novembre 2003StatutMembreDernière intervention 8 avril 2009 20 juin 2007 à 16:34
Yaaaar !
Justement ce que je cherchais :)
Ca va me faire gagner du temp ce petit code !
Dans tout les cas ca merite une bonne note ;)
@++
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 nov. 2006 à 11:03
pas utiles ces verifs...
VB va s'assurer tout seul que tu places bien un Long
evites de renommer a ton gout les variables, constantes et type issus d'API
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 9 nov. 2006 à 00:14
En fait, là, j'ai carrément un doute (bon, le code fonctionne mais...).
Le fait de faire ça : (assigner des valeurs à l'arguments de la procédure)
If Value < 0 Then Value = Abs(Value)
If Value > 16777215 Then
Value = Value Mod 16777215
Est-ce que ça pompe plus de mémoire (normalement non mais...) ???
Il faut que le truc soit vraiment très rapide... Vois-tu une autre optimisation possible (dans l'ordre des tests par exemple, ou alors, les éviter carrément par on ne sait trop quelle malicieuse astuce) ?
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 9 nov. 2006 à 00:08
Remoi. Eh oui, je vais encore t'embêter un peu... Faut bien, parce qu'après tout, ce code est vraiment à la base de mon projet et faut donc qu'il soit le plus "parfait" possible.
J'ai modifier ton code comme ceci (module de classe) :
(Les principales modifications : rename des éléments, utilisation de la procédure événementielle _Initialize, Gestion des erreurs de Couleur
Option Explicit
Private Type typSafeArray
intDimensions As Integer
intFeatures As Integer
lngElements As Long
lngLocks As Long
lngData As Long
lngNbrBytes As Long
lngLbound As Long
End Type
Private Declare Function ArrPtr ...
Private Declare Sub CopyMemory ...
Private lngColor As Long
Private tblComponentRGB() As Byte
Private stcSafeArrayCvalue As typSafeArray
Private Sub Class_Initialize()
With stcSafeArrayCvalue
.intDimensions = 1
.lngElements = 1
.lngNbrBytes = 3
.intFeatures = cstSAfeatAuto Or cstSAfeatStatic Or cstSAfeatFixedSize
.lngData = VarPtr(lngColor)
End With
CopyMemory ByVal ArrPtr(tblComponentRGB), VarPtr(stcSafeArrayCvalue), 4
End Sub
Public Property Get R() As Byte: R = tblComponentRGB(0): End Property
...G puis B
Public Property Get C() As Long: C = lngColor: End Property
Public Property Let R(ByVal Value As Byte): tblComponentRGB(0) = Value: End Property
... G puis B
Public Property Let C(ByVal Value As Long)
On Error GoTo ErrorManagement
If Value < 0 Then Value = Abs(Value)
If Value > 16777215 Then
Value = Value Mod 16777215
Else
lngColor = Value
End If
Exit Property
ErrorManagement:
Err.Raise Err.Number, "zzzGDI.clsRGBC", Err.Description
End Property
Dit moi, ne crois-tu pas nécessaire de gérer la couleur via l'interface Get/Let plutot qu'en variable Long public ???
Selon toi, la gestion d'erreur est bonne ou ça risque de poser des problèmes (à cause de l'utilisation d'API par exemple...) ???
Selon toi, quelles sont les retentissements de ces modifs tant sur l'utilisation de la mémoire que sur la vitesse (bénignes, ...) ???
Pi y'a toujours un truc que je pige pas avec CopyMemory... Là, ça te crée bien un "lien mémoire", mais ce lien, que devient-il à la destruction de l'objet ??? Parce que sinon on a aussi _Terminate !
Comme je vais utiliser pas mal d'instances de cet objet (jusqu'a une quinzaine simultanément), cela ne risque-t-il pas de poser un quelconque problème ?
Je sais, chuis chiant pour pas dire casse-cou***e :D
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 6 nov. 2006 à 16:34
Je te remercie pour ces quelques explications - même si j'ai pas encore vraiment compris la dif entre le cEl. et le cbEl. [je pige vite mais faut m'expliquer lontemps...], je n'auserais pas t'en demander plus. Oh pi ça irra, le principal c'est que je comprenne à peu prêt ce que je fais, les détails, on s'en fout ;-) [warf l'newbie !!!]
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 6 nov. 2006 à 15:28
cbElements = 1 c'est pour dire => 1 octet
cElements 3 c'est pour dire> 3 élément
mettre cbElements = 4 nous donnera 4 éléments de type Byte
un tableau, en VB est un SafeArray
un SafeArray, c'est :
Private Type SafeArray
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
rgsaBound() as SafeArrayBound '(selon le nombre de dimensions)
End Type
Private SafeArrayBound
cElements As Long
lLbound As Long
End Type
pour une dimension, on peut n'utiliser qu'une seule structure
ici, nous fabriquons un entête, en spécifiant les dimensions de notre tableau.
ensuite, nous faisons en sorte que le tableau ColorChannel() utilise notre entête personnalisé. (le CopyMemory...)
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 6 nov. 2006 à 14:48
Arf, j'ai peur de pas avoir tout compris... Soyont clair :
cbElements 1 c'est pour dire> 1 octet
cElements 3 c'est pour dire> 3 élément
ou alors l'inverse ???
Et si c'est bien ça, est-ce que mettre cbElements = 4 nous donnera 3 éléments de type Long ???
Je sais bien que API-Guide n'a pas tout... mais alors... D'OÙ TU TIRES TOUTES CES INFOS ??? De la MSDN sur le site de Ms ???
Pi j'ai pas non plus très bien compris ta suggestion... Remettre l'entête du tableau en sortie !?!?!? De quel tableau, pi quelle entête ???
Sami l'newbie ;-)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 6 nov. 2006 à 14:01
l'API Guide ne donne pas tout ^^
concernant ArrPtr, dis toi simplement que ca renvoie un pointeur vers un tableau.
concernant les champs du SafeArray :
'# Tableau une dimension
.cDims = 1
'# Un octet par élément (normal, pour un tableau de byte :p)
.cbElements = 1
'# Notre tableau comporte trois éléments
.cElements = 3
en gros, on déclare simplement un tableau a une dimension, de trois octets...
(donc trois éléments prenant chaqun un octet.)
en sortie, dans l'absolu, il faudrait sans doute remettre l'entête du tableau qui était là, à l'origine...
mais rien de bien méchant.
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 6 nov. 2006 à 13:49
Heu... dit Renfield, en fait, j'ai bien une question là qui me taraude... Dans ton code :
Public Sub Initialize()
With mlpColorValueSA
.intDimensions = 1 '# Tableau une dimension
.lngElements = 1 '??????????????????? Pourquoi ????????????????????
.lngElements = 3 '> pour la forme, le style ???
.intFeatures = cstSAfeatAuto Or cstSAfeatStatic Or cstSAfeatFixedSize
.pvData = VarPtr(Color)
End With
Pi dit moi... c'est bien de nous inviter à consulter la doc mais... dit moi tout... d'où tu tires les infos sur l'API ArrPtr ??? Perso j'utilise, peut-être à tort API-Guide et elle n'y est pas.
Pi dit, comme je n'ai encore jamais eu l'occasion de manipuler les pointeurs, dit moi, ne faut-il pas les détruire en sortie de code ???
Enfin, ce que je veux dire par là c'est que, comprenant ton code mais ne le maitrisant pas réellement, est-il fiable à 100% ? Peut-on encore l'améliorer ? Parce que je compte l'utiliser pour la source dont je vous ai parlé l'autre jour.
cs_lucgod1
Messages postés10Date d'inscriptiondimanche 17 septembre 2006StatutMembreDernière intervention24 janvier 2007 4 nov. 2006 à 18:31
Excuses-moi RENFIELD, LUGOD1 rectifie, le site POUR INFO est ...
http://pourpre.com/colorbox/ ...(interressant pour les équivalences).
Bye from Liège-BELGIUM.
cs_lucgod1
Messages postés10Date d'inscriptiondimanche 17 septembre 2006StatutMembreDernière intervention24 janvier 2007 4 nov. 2006 à 18:03
20 juin 2007 à 16:43
20 juin 2007 à 16:34
Justement ce que je cherchais :)
Ca va me faire gagner du temp ce petit code !
Dans tout les cas ca merite une bonne note ;)
@++
9 nov. 2006 à 11:03
VB va s'assurer tout seul que tu places bien un Long
evites de renommer a ton gout les variables, constantes et type issus d'API
9 nov. 2006 à 00:14
Le fait de faire ça : (assigner des valeurs à l'arguments de la procédure)
If Value < 0 Then Value = Abs(Value)
If Value > 16777215 Then
Value = Value Mod 16777215
Est-ce que ça pompe plus de mémoire (normalement non mais...) ???
Il faut que le truc soit vraiment très rapide... Vois-tu une autre optimisation possible (dans l'ordre des tests par exemple, ou alors, les éviter carrément par on ne sait trop quelle malicieuse astuce) ?
9 nov. 2006 à 00:08
J'ai modifier ton code comme ceci (module de classe) :
(Les principales modifications : rename des éléments, utilisation de la procédure événementielle _Initialize, Gestion des erreurs de Couleur
Option Explicit
Private Type typSafeArray
intDimensions As Integer
intFeatures As Integer
lngElements As Long
lngLocks As Long
lngData As Long
lngNbrBytes As Long
lngLbound As Long
End Type
Private Const cstSAfeatAuto = &H1
Private Const cstSAfeatStatic = &H2
Private Const cstSAfeatFixedSize = &H10
Private Declare Function ArrPtr ...
Private Declare Sub CopyMemory ...
Private lngColor As Long
Private tblComponentRGB() As Byte
Private stcSafeArrayCvalue As typSafeArray
Private Sub Class_Initialize()
With stcSafeArrayCvalue
.intDimensions = 1
.lngElements = 1
.lngNbrBytes = 3
.intFeatures = cstSAfeatAuto Or cstSAfeatStatic Or cstSAfeatFixedSize
.lngData = VarPtr(lngColor)
End With
CopyMemory ByVal ArrPtr(tblComponentRGB), VarPtr(stcSafeArrayCvalue), 4
End Sub
Public Property Get R() As Byte: R = tblComponentRGB(0): End Property
...G puis B
Public Property Get C() As Long: C = lngColor: End Property
Public Property Let R(ByVal Value As Byte): tblComponentRGB(0) = Value: End Property
... G puis B
Public Property Let C(ByVal Value As Long)
On Error GoTo ErrorManagement
If Value < 0 Then Value = Abs(Value)
If Value > 16777215 Then
Value = Value Mod 16777215
Else
lngColor = Value
End If
Exit Property
ErrorManagement:
Err.Raise Err.Number, "zzzGDI.clsRGBC", Err.Description
End Property
Dit moi, ne crois-tu pas nécessaire de gérer la couleur via l'interface Get/Let plutot qu'en variable Long public ???
Selon toi, la gestion d'erreur est bonne ou ça risque de poser des problèmes (à cause de l'utilisation d'API par exemple...) ???
Selon toi, quelles sont les retentissements de ces modifs tant sur l'utilisation de la mémoire que sur la vitesse (bénignes, ...) ???
Pi y'a toujours un truc que je pige pas avec CopyMemory... Là, ça te crée bien un "lien mémoire", mais ce lien, que devient-il à la destruction de l'objet ??? Parce que sinon on a aussi _Terminate !
Comme je vais utiliser pas mal d'instances de cet objet (jusqu'a une quinzaine simultanément), cela ne risque-t-il pas de poser un quelconque problème ?
Je sais, chuis chiant pour pas dire casse-cou***e :D
6 nov. 2006 à 16:34
6 nov. 2006 à 15:28
cElements 3 c'est pour dire> 3 élément
mettre cbElements = 4 nous donnera 4 éléments de type Byte
un tableau, en VB est un SafeArray
un SafeArray, c'est :
Private Type SafeArray
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
rgsaBound() as SafeArrayBound '(selon le nombre de dimensions)
End Type
Private SafeArrayBound
cElements As Long
lLbound As Long
End Type
pour une dimension, on peut n'utiliser qu'une seule structure
ici, nous fabriquons un entête, en spécifiant les dimensions de notre tableau.
ensuite, nous faisons en sorte que le tableau ColorChannel() utilise notre entête personnalisé. (le CopyMemory...)
Doc dispo sur :
http://msdn2.microsoft.com/en-us/library/ms221482(VS.80).aspx
6 nov. 2006 à 14:48
cbElements 1 c'est pour dire> 1 octet
cElements 3 c'est pour dire> 3 élément
ou alors l'inverse ???
Et si c'est bien ça, est-ce que mettre cbElements = 4 nous donnera 3 éléments de type Long ???
Je sais bien que API-Guide n'a pas tout... mais alors... D'OÙ TU TIRES TOUTES CES INFOS ??? De la MSDN sur le site de Ms ???
Pi j'ai pas non plus très bien compris ta suggestion... Remettre l'entête du tableau en sortie !?!?!? De quel tableau, pi quelle entête ???
Sami l'newbie ;-)
6 nov. 2006 à 14:01
concernant ArrPtr, dis toi simplement que ca renvoie un pointeur vers un tableau.
concernant les champs du SafeArray :
'# Tableau une dimension
.cDims = 1
'# Un octet par élément (normal, pour un tableau de byte :p)
.cbElements = 1
'# Notre tableau comporte trois éléments
.cElements = 3
en gros, on déclare simplement un tableau a une dimension, de trois octets...
(donc trois éléments prenant chaqun un octet.)
en sortie, dans l'absolu, il faudrait sans doute remettre l'entête du tableau qui était là, à l'origine...
mais rien de bien méchant.
6 nov. 2006 à 13:49
Public Sub Initialize()
With mlpColorValueSA
.intDimensions = 1 '# Tableau une dimension
.lngElements = 1 '??????????????????? Pourquoi ????????????????????
.lngElements = 3 '> pour la forme, le style ???
.intFeatures = cstSAfeatAuto Or cstSAfeatStatic Or cstSAfeatFixedSize
.pvData = VarPtr(Color)
End With
Pi dit moi... c'est bien de nous inviter à consulter la doc mais... dit moi tout... d'où tu tires les infos sur l'API ArrPtr ??? Perso j'utilise, peut-être à tort API-Guide et elle n'y est pas.
Pi dit, comme je n'ai encore jamais eu l'occasion de manipuler les pointeurs, dit moi, ne faut-il pas les détruire en sortie de code ???
Enfin, ce que je veux dire par là c'est que, comprenant ton code mais ne le maitrisant pas réellement, est-il fiable à 100% ? Peut-on encore l'améliorer ? Parce que je compte l'utiliser pour la source dont je vous ai parlé l'autre jour.
4 nov. 2006 à 18:31
http://pourpre.com/colorbox/
...(interressant pour les équivalences).
Bye from Liège-BELGIUM.
4 nov. 2006 à 18:03
Pour les internautes divers (INFO)...
http://www.01net.com/telecharger/windows/Multimedia/outils_internet/fiches/17864.html
3 nov. 2006 à 16:56
C'est, je pense, exactement ce que je recherchais !!!
...