I want to use a track-bar to change a form's opacity.
This is my code:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
When I build the application, it gives the following error:
Cannot implicitly convert type
'decimal'
to'double'
.
I tried using trans
and double
but then the control doesn't work. This code worked fine in a past VB.NET project.
An explicit cast to double like this isn't necessary:
Identifying the constant as
5000.0
(or as5000d
) is sufficient:You have two problems. First,
Opacity
requires a double, not a decimal value. The compiler is telling you that while there is a conversion between decimal and double, it is an explicit conversion that you need to specify in order for it to work. The second is thatTrackBar.Value
is an integer value and dividing an int by an int results in an int no matter what type of variable you assign it to. In this case there is an implicit cast from int to decimal or double - because there is no loss of precision when you do the cast - so the compiler doesn't complain, but the value you get is always 0, presumably, sincetrackBar.Value
is always less than 5000. The solution is to change your code to use double (the native type for Opacity) and do floating point arithmetic by explicitly making the constant a double - which will have the effect of promoting the arithmetic - or castingtrackBar.Value
to double, which will do the same thing - or both. Oh, and you don't need the intermediate variable unless it used elsewhere. My guess is the compiler would optimize it away, anyway.The Opacity property is of double type:
or simply:
or:
Notice that I am using
5000.0
(or5000d
) to force a double division becausetrackBar1.Value
is an integer and it would perform an integer division and the result would be an integer.Why are you dividing by 5000? Just set the TrackBar's Minimum and Maximum values between 0 and 100 and then divide the Value by 100 for the Opacity percentage. The minimum 20 example below prevents the form from becoming completely invisible:
Assuming you are using WinForms,
Form.Opacity
is of typedouble
, so you should use:Unless you need the value elsewhere, it's simpler to write:
The reason the control doesn't work when you changed your code to simply be a double was because you had:
which interpreted the
5000
as an integer, so yourtrans
value was always zero. By explicitly making the numeric a floating point value by adding the.0
the compiler can now interpret it as a double and perform the proper calculation.The best solution is: