Question

Je souhaite utiliser une barre de suivi pour modifier l'opacité d'un formulaire.

Voici mon code :

decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;

Lorsque je crée l'application, l'erreur suivante s'affiche :

Impossible de convertir implicitement le type 'decimal' à 'double'.

J'ai essayé d'utiliser trans et double mais alors le contrôle ne fonctionne pas.Ce code a bien fonctionné dans un précédent projet VB.NET.

Était-ce utile?

La solution

Un casting explicite pour doubler comme celui-ci n'est pas nécessaire :

double trans = (double) trackBar1.Value / 5000.0;

Identifier la constante comme 5000.0 (ou comme 5000d) est suffisant:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;

Autres conseils

Une réponse plus générique à la question générique « Décimal vs Double ? » : Décimal pour les calculs monétaires afin de préserver la précision, Double pour des calculs scientifiques qui ne sont pas affectés par de petites différences.Puisque Double est un type natif du CPU (la représentation interne est stockée dans socle 2), les calculs effectués avec Double fonctionnent mieux que Decimal (qui est représenté en base 10 intérieurement).

Votre code a bien fonctionné dans VB.NET car il effectue implicitement des conversions, alors que C# en a à la fois des conversions implicites et explicites.

En C#, la conversion de décimal en double est explicite car vous perdez en précision.Par exemple, 1.1 ne peut pas être exprimé avec précision sous forme de double, mais peut être exprimé sous forme décimale (voir "Nombres à virgule flottante – plus inexacts que vous ne le pensez" pour la raison).

En VB, la conversion a été ajoutée pour vous par le compilateur :

decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;

Que (double) doit être explicitement indiqué en C#, mais peut être implicite par le compilateur plus « indulgent » de VB.

Pourquoi divises-tu par 5000 ?Définissez simplement les valeurs minimale et maximale de la TrackBar entre 0 et 100, puis divisez la valeur par 100 pour le pourcentage d'opacité.Le minimum de 20 exemples ci-dessous empêche le formulaire de devenir complètement invisible :

private void Form1_Load(object sender, System.EventArgs e)
{
    TrackBar1.Minimum = 20;
    TrackBar1.Maximum = 100;

    TrackBar1.LargeChange = 10;
    TrackBar1.SmallChange = 1;
    TrackBar1.TickFrequency = 5;
}

private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
    this.Opacity = TrackBar1.Value / 100;
}

Vous avez deux problèmes.D'abord, Opacity nécessite une valeur double et non décimale.Le compilateur vous indique que même s'il existe une conversion entre décimal et double, il s'agit d'une conversion explicite que vous devez spécifier pour qu'elle fonctionne.La seconde est que TrackBar.Value est une valeur entière et diviser un int par un int donne un int quel que soit le type de variable auquel vous l'attribuez.Dans ce cas, il y a une conversion implicite de int en décimal ou double - car il n'y a pas de perte de précision lorsque vous effectuez la conversion - donc le compilateur ne se plaint pas, mais la valeur que vous obtenez est toujours 0, probablement, puisque trackBar.Value est toujours inférieur à 5 000.La solution est de changer votre code pour utiliser double (le type natif d'Opacity) et de faire de l'arithmétique à virgule flottante en faisant explicitement de la constante un double - ce qui aura pour effet de promouvoir l'arithmétique - ou de lancer trackBar.Value doubler, ce qui fera la même chose - ou les deux.Oh, et vous n'avez pas besoin de la variable intermédiaire à moins qu'elle ne soit utilisée ailleurs.Je suppose que le compilateur l'optimiserait de toute façon.

trackBar.Opacity = (double)trackBar.Value / 5000.0;

À mon avis, il est souhaitable d'être le plus explicite possible.Cela ajoute de la clarté au code et aide vos collègues programmeurs qui pourraient éventuellement le lire.

En plus (ou à la place) d'ajouter un .0 au numéro, vous pouvez utiliser decimal.ToDouble().

Voici quelques exemples:

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

Cela ressemble this.Opacity est une valeur double, et le compilateur n'aime pas que vous essayiez d'y insérer une valeur décimale.

Tu devrais utiliser 5000.0 au lieu de 5000.

Le Opacité la propriété est de double type :

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

ou simplement:

this.Opacity = trackBar1.Value / 5000.0;

ou:

this.Opacity = trackBar1.Value / 5000d;

Notez que j'utilise 5000.0 (ou 5000d) pour forcer une double division car trackBar1.Value est un entier et il effectuerait une division entière et le résultat serait un entier.

En supposant que vous utilisez WinForms, Form.Opacity est du type double, vous devez donc utiliser :

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

Sauf si vous avez besoin de la valeur ailleurs, il est plus simple d'écrire :

this.Opacity = trackBar1.Value / 5000.0;

La raison pour laquelle le contrôle ne fonctionne pas lorsque vous modifiez votre code pour qu'il soit simplement un double est parce que vous aviez :

double trans = trackbar1.Value / 5000;

qui a interprété le 5000 comme un entier, et parce que trackbar1.Value est aussi un entier votre trans la valeur était toujours nulle.En faisant explicitement du numérique une valeur à virgule flottante en ajoutant le .0 le compilateur peut maintenant l'interpréter comme un double et effectuer le calcul approprié.

La meilleure solution est :

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

Depuis Opacity est une valeur double, j'utiliserais simplement un double dès le départ et je ne lancerais pas du tout, mais assurez-vous d'utiliser un double lors de la division afin de ne pas perdre de précision

Opacity = trackBar1.Value / 5000.0;
this.Opacity = trackBar1.Value / 5000d;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top