Forma opaklık uygulayarak ederken, bir ondalık veya çift değeri kullanması gerekir?

oy
557

Bir formun opaklığını değiştirmek için bir parça-bar kullanmak istiyorum.

Bu benim kodudur:

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

Uygulamayı oluştururken, aşağıdaki hatayı veriyor:

Dolaylı türünü dönüştürülemez 'decimal'için 'double'.

Ben kullanarak çalıştı transve doubleama sonra kontrolü çalışmıyor. Bu kod, bir geçmiş VB.NET projesinde çalışıyor.

Oluştur 31/07/2008 saat 22:42
kaynak kullanıcı
Diğer dillerde...                            


13 cevaplar

oy
395

Böyle iki katına veren açık dökme gerekli değildir:

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

Gibi sürekli belirlenmesi 5000.0(ya da 5000d) yeterlidir:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Cevap 31/07/2008 saat 23:17
kaynak kullanıcı

oy
114

Bir daha genel jenerik soru için cevap "Çift vs Decimal?": Ondalık parasal hesaplamalar için hassasiyet, korumak Çift küçük farklılıklardan etkilenmezler bilimsel hesaplamalar için. Çift CPU için doğal olan bir tür olduğu için (iç gösterim saklanır 2 tabanı (temsil edilir, çift ile yapılan hesaplamalar ondalık sonra daha iyi performans gösterir) temel 10 dahili).

Cevap 01/08/2008 saat 15:23
kaynak kullanıcı

oy
75

C # örtük ve açık olanları hem sahipken dolaylı herhangi yayınları yapar çünkü kod VB.NET iyi çalıştı.

Eğer isabet kaybı olarak C # iki katına ondalık dönüşüm açık olduğunu. Mesela 1.1 için doğru bir çift olarak ifade edilemez ancak ondalık olarak ( "görebilirsiniz Kayan nokta numaralarını - düşündüğünüzden daha yanlış " nedeni niçin).

VB dönüşüm derleyici tarafından sizin için eklendi:

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

Yani (double)açıkça C # ifade edilmesi gerekir, ancak edilebilir ima VB'ın daha 'bağışlayıcı' derleyici tarafından.

Cevap 10/08/2008 saat 18:54
kaynak kullanıcı

oy
74

Neden 5000 bölerek var? Sadece TrackBar en minimum ve 0 ile 100 arasında maksimum değerleri ayarlamak ve sonra Saydamlık yüzdesi 100 ile Değerini bölün. en az 20 Aşağıdaki örnek, tamamen görünmez hale formu engeller:

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;
}
Cevap 21/09/2008 saat 04:51
kaynak kullanıcı

oy
57

İki sorunları var. İlk olarak, Opacitybir çift değil, bir ondalık değeri gerektirir. Derleyici ondalık ve çift arasında bir dönüşüm varken, bu işe yaraması için sırayla belirtmeniz gerekir açık dönüşüm olduğunu size anlatıyor. İkinci yani TrackBar.Valuebir tamsayı değeri ve önemi yok atamak değişkenin ne tür bir int bir int sonuçlarına göre bir int bölen olduğunu. Bu durumda örtülü bir onluya int den dökme veya çift var - hassasiyet kaybı yoktur çünkü cast yapmak zaman - bu yüzden derleyici şikayet etmiyor, ama olsun değer beri, muhtemelen, her zaman 0'dırtrackBar.ValueSolüsyon kodunuzu çift kullanmak (Saydamlık için doğal tip) değiştirmek ve açık olarak sabit hale getirerek kayar nokta aritmetik yapmak her zaman daha az 5000. daha bir çift - veya döküm - aritmetik teşvik etkisine sahip olan trackBar.Valueiki katına aynı şeyi yapacak olan - ya da her ikisi. Başka bir yerde kullanılan sürece Oh, ve ara değişken gerekmez. Benim tahminim derleyici zaten bunu uzağa optimize olacaktır olduğunu.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Cevap 27/02/2009 saat 12:45
kaynak kullanıcı

oy
55

Bence, mümkün olduğunca açık olması arzu edilir. Bu koda netlik ekler ve sonunda onu okuyabilir arkadaşlarınıza programcıları yardımcı olur.

Bir ekleme (veya bunun yerine) ek olarak .0numaraya kullanabileceğiniz decimal.ToDouble().

İşte bazı örnekler:

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

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Cevap 05/08/2008 saat 21:18
kaynak kullanıcı

oy
53

Gibi geliyor this.Opacitybir çift değerdir ve derleyici bunu içine ondalık bir değer tıkmak için çalışıyor sevmez.

Cevap 01/08/2008 saat 14:53
kaynak kullanıcı

oy
45

Sen kullanmalıdır 5000.0yerine 5000.

Cevap 20/11/2008 saat 15:36
kaynak kullanıcı

oy
44

Saydamlık özelliği çift tiptedir:

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

ya da sadece:

this.Opacity = trackBar1.Value / 5000.0;

veya:

this.Opacity = trackBar1.Value / 5000d;

Ben kullanıyorum dikkat edin 5000.0(ya da 5000d) çünkü çift bölünme zorlamak için trackBar1.Valuebir tam sayıdır ve bir tamsayı bölme işlemlerini olur ve sonuç bir tamsayı olacaktır.

Cevap 31/08/2011 saat 20:08
kaynak kullanıcı

oy
42

Size varsayarsak, WinForms kullandığınız Form.OpacityÇeşidi olduğu double, bu nedenle kullanmalısınız:

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

Başka bir yerde değer gerekmedikçe, yazmak için basittir:

this.Opacity = trackBar1.Value / 5000.0;

Eğer sadece size çünkü bir çift oldu olmak için kodunuzu değişti kumanda çalışmıyor nedeni:

double trans = trackbar1.Value / 5000;

hangi yorumlanır 5000bir tamsayı olarak, bu yüzden transdeğeri her zaman sıfır oldu. Açıkça ekleyerek sayısal bir kayan nokta değeri yaparak .0derleyici artık bir çifte olarak yorumlar ve uygun hesaplama gerçekleştirebilir.

Cevap 31/08/2011 saat 20:09
kaynak kullanıcı

oy
38

en iyi çözümdür:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Cevap 06/03/2012 saat 09:07
kaynak kullanıcı

oy
37

Yana Opacitybir çift değerdir, sadece baştan bir çift kullanmak ve hiç dökme, ama bu yüzden herhangi bir hassasiyet gevşek değil bölünürken, çift kullandığınızdan emin olur

Opacity = trackBar1.Value / 5000.0;
Cevap 13/05/2012 saat 03:10
kaynak kullanıcı

oy
31
this.Opacity = trackBar1.Value / 5000d;
Cevap 11/04/2013 saat 16:08
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more