Problème de capacité bizarre [Résolu]

Signaler
Messages postés
29
Date d'inscription
jeudi 8 février 2007
Statut
Membre
Dernière intervention
3 mars 2009
-
Messages postés
29
Date d'inscription
jeudi 8 février 2007
Statut
Membre
Dernière intervention
3 mars 2009
-
Bonjour tout le monde !

J'ai un problème très bizarre, que je ne comprend absolument pas.
Je suis en train de travailler sur un OCX, déssiné avec du GDI.
À un moment, j'ai besoin de convertir des couleurs type RGB en type Long.
C'est pas de problème pour la formule, mais quand j'essaye d'executer l'appli, il m'affiche "Dépassement de capacité", alors que
le résultat est inférieur à 10.000.000 et qu'il est donné dans une variable de type double !

Je comprend pas le problème, mais je suis sur que vous pourrez m'aider !

Merci d'avance !
VB6 C'est++ mieux !

P.S.: Dans ce cas précis, le calcul à faire est :  var = 255 * 255 * 151 + 255 * 151 + 151 (= 9857431)

8 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Ton problème vient de Col.B * 255 * 255 et de Col.G * 255

Prennons Col.G, c'est une variable de type Byte, donc pouvant varier de -128 à +128

Avant toute conversion ultérieure, le résultat de cette sous opération sera du même type que le premier opérande donc ici de Col.G soit Byte.
Imaginons que Col.G soit égal à 1, le résultat sera égal à 255. Ca ne rentre pas dans un byte.

L'astuce consiste à fixer dès le départ le type à Long en convertissant ta variable en Long.

Donc avec une formule comme ceci, ça devrait je pense mieux marcher :

RGBToLong = CLong(Col.B) * 255 * 255 + CLong(Col.G) * 255 + CLong(Col.R)

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Avec ton code ça serait mieux pour comprendre.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
29
Date d'inscription
jeudi 8 février 2007
Statut
Membre
Dernière intervention
3 mars 2009

Déjà merci pour avoir répondu aussi vite !
Je te passe le code :

Ma fonction :
Private Function RGBToLong(Col As RGB_COLOR_INT) As Long
RGBToLong = Col.B * 255 * 255 + Col.G * 255 + Col.R
End Function

La déclaration de type :
Private type RGB_COLOR_INT
    B as byte
    G as byte
    R as byte
End type

L'appel de la fonction :
Dim Col1 as RGB_COLOR_INT
Dim ColLng as double
Col1.B = 151 (enfin c'est plus compliqué ici, mais en gros, c'est la valeure que je veux pour l'instant)
Col1.G = 151
Col1.R = 151
ColLng = CDbl(RGBToLong(Col1))

VB6 C'est++ mieux !
Messages postés
29
Date d'inscription
jeudi 8 février 2007
Statut
Membre
Dernière intervention
3 mars 2009

Ça marche ! Merci beaucoup ! C'était effectivement le bug.
J'avais trouvé une manière de contourner en utilisant LSet, mais elle est plus compliquée.
VB6 C'est++ mieux !
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
[javascript:alink_4.Click() variables de type Byte] sont stockées sous
la forme d'un nombre de 8 bits (1 octet unique), non signé, compris entre 0 et
255.

Le
<object id="alink_5" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_5.Click() type de données]Byte est utile pour
le stockage de données binaires.

A+ et bonne soirée

GRENIER Alain
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Personne n'est parfait

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
14762
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
24 janvier 2021
151
Bonjour

En VB6, il n'y a pas la fonction RGB ?
RGB (QteRed, QteGreen, QteBlue)

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
29
Date d'inscription
jeudi 8 février 2007
Statut
Membre
Dernière intervention
3 mars 2009

Je ne connaissais pas cette fonction., mais je viens de tester, et elle marche très bien !

Merci beaucoup !

VB6 C'est++ mieux !