Ενώ η εφαρμογή αδιαφάνεια σε μια φόρμα, θα πρέπει να χρησιμοποιήσετε ένα δεκαδικό ή ένα διπλό αξία;

ψήφοι
557

Θέλω να χρησιμοποιήσω ένα κομμάτι-μπαρ για να αλλάξετε την αδιαφάνεια μιας φόρμας.

Αυτός είναι ο κωδικός μου:

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

Όταν δημιουργήσετε την εφαρμογή, δίνει το ακόλουθο μήνυμα λάθους:

Δεν είναι δυνατή η μετατροπή σιωπηρά τύπου 'decimal'με 'double'.

Προσπάθησα χρήση transκαι doubleαλλά στη συνέχεια ο έλεγχος δεν λειτουργεί. Αυτός ο κωδικός λειτούργησε καλά στο παρελθόν VB.NET έργου.

Δημοσιεύθηκε 31/07/2008 στις 22:42
πηγή χρήστη
Σε άλλες γλώσσες...                            


13 απαντήσεις

ψήφοι
395

Μια ρητή καστ να διπλασιάσει σαν αυτό δεν είναι απαραίτητο:

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

Προσδιορισμός της σταθεράς ως 5000.0(ή ως 5000d) είναι επαρκής:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
Απαντήθηκε 31/07/2008 στις 23:17
πηγή χρήστη

ψήφοι
114

Μια πιο γενική απάντηση για το γενικό ερώτημα «δεκαδικών εναντίον Διπλή;»: δεκαδικών για τις νομισματικές τους υπολογισμούς για τη διατήρηση της ακρίβειας, διπλό για επιστημονικούς υπολογισμούς που δεν παίρνουν επηρεάζεται από μικρές διαφορές. Δεδομένου Double είναι ένα είδος το οποίο είναι εγγενές στη CPU (εσωτερική αναπαράσταση αποθηκεύεται στη βάση 2 ), υπολογισμοί γίνονται με διπλό αποδίδουν καλύτερα στη συνέχεια Δεκαδικό (που εκπροσωπείται σε βάση 10 εσωτερικά).

Απαντήθηκε 01/08/2008 στις 15:23
πηγή χρήστη

ψήφοι
75

Ο κωδικός σας λειτούργησε καλά σε VB.NET, επειδή το κάνει σιωπηρά κάθε εκμαγεία, ενώ η C # έχει τόσο σιωπηρή και ρητή αυτά.

Στην C # η μετατροπή από δεκαδικό σε διπλάσιο είναι ρητή, όπως μπορείτε να περιοριστεί η ακρίβεια. Για παράδειγμα 1.1 δεν μπορεί να εκφραστεί με ακρίβεια ως ένα διπλό, αλλά μπορεί ως ένα δεκαδικό (βλέπε « αριθμοί κινητής υποδιαστολής - πιο ακριβής από ό, τι νομίζετε » για τον λόγο).

Στην VB η μετατροπή προστέθηκε για σας από τον compiler:

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

Αυτό (double)πρέπει να αναφέρεται ρητά σε C #, αλλά μπορεί να υπονοείται από την πιο «επιεικής» compiler της VB.

Απαντήθηκε 10/08/2008 στις 18:54
πηγή χρήστη

ψήφοι
74

Γιατί η διαίρεση με το 5000; Απλά ρυθμίστε Ελάχιστες του trackbar και μέγιστες τιμές μεταξύ 0 και 100 και, στη συνέχεια, διαιρέστε την τιμή από 100 για το ποσοστό αδιαφάνειας. κάτω από το ελάχιστο 20 παράδειγμα εμποδίζει τη φόρμα από το να γίνει εντελώς αόρατο:

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;
}
Απαντήθηκε 21/09/2008 στις 04:51
πηγή χρήστη

ψήφοι
57

Έχετε δύο προβλήματα. Πρώτον, Opacityαπαιτεί ένα διπλό, όχι μια δεκαδική τιμή. Ο συντάκτης σας λέει ότι ενώ υπάρχει μετατροπή μεταξύ δεκαδικό και το διπλό, είναι μια σαφής μετατροπής που πρέπει να καθορίσετε, προκειμένου αυτό να λειτουργήσει. Το δεύτερο είναι ότι TrackBar.Valueείναι ένας ακέραιος τιμή και διαιρώντας μια int από ένα int αποτελέσματα σε int δεν έχει σημασία τι είδος της μεταβλητής που να αναθέσετε. Σε αυτή την περίπτωση υπάρχει μια σιωπηρή καστ από int σε δεκαδική ή διπλό - επειδή δεν υπάρχει απώλεια της ακρίβειας, όταν κάνετε το απόρριμμα - έτσι ώστε ο compiler δεν διαμαρτύρονται, αλλά η τιμή που παίρνετε είναι πάντα 0, κατά πάσα πιθανότητα, δεδομένου ότι trackBar.Valueείναι πάντα λιγότερο από το 5000. Η λύση είναι να αλλάξετε τον κωδικό σας για να χρησιμοποιήσετε διπλό (η μητρική τύπου για Αδιαφάνεια) και μην κινητής υποδιαστολής αριθμητική κάνοντας ρητά τη συνεχή διπλή - η οποία θα έχει ως αποτέλεσμα την προώθηση της αριθμητικής - ή χύτευση trackBar.Valueνα διπλασιαστεί, γεγονός που θα κάνουμε το ίδιο πράγμα - ή και τα δύο. Ω, και δεν χρειάζεται την ενδιάμεση μεταβλητή, εκτός αν χρησιμοποιηθεί αλλού. Η εικασία μου είναι ο compiler θα το βελτιστοποιήσουν μακριά, έτσι κι αλλιώς.

trackBar.Opacity = (double)trackBar.Value / 5000.0;
Απαντήθηκε 27/02/2009 στις 12:45
πηγή χρήστη

ψήφοι
55

Κατά τη γνώμη μου, είναι επιθυμητό να είναι τόσο σαφείς όσο το δυνατόν. Αυτό προσθέτει σαφήνεια στον κώδικα και να βοηθά τους συναδέλφους προγραμματιστές σας που μπορεί τελικά να το διαβάσετε.

Εκτός (ή αντί) προσαρτώντας ένα .0στον αριθμό, που μπορείτε να χρησιμοποιήσετε decimal.ToDouble().

Ορίστε μερικά παραδείγματα:

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

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Απαντήθηκε 05/08/2008 στις 21:18
πηγή χρήστη

ψήφοι
53

Ακούγεται σαν this.Opacityείναι μια διπλή αξία, και ο compiler δεν του αρέσει που προσπαθούν να χώνω μια δεκαδική τιμή σε αυτό.

Απαντήθηκε 01/08/2008 στις 14:53
πηγή χρήστη

ψήφοι
45

Θα πρέπει να χρησιμοποιείτε 5000.0αντί του 5000.

Απαντήθηκε 20/11/2008 στις 15:36
πηγή χρήστη

ψήφοι
44

Η Αδιαφάνεια ακίνητο είναι διπλού τύπου:

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

ή απλώς:

this.Opacity = trackBar1.Value / 5000.0;

ή:

this.Opacity = trackBar1.Value / 5000d;

Παρατηρήστε ότι είμαι με τη χρήση 5000.05000d) για να αναγκάσει μια διπλή διαίρεση, επειδή trackBar1.Valueείναι ένας ακέραιος και θα εκτελέσει έναν ακέραιο τμήμα και το αποτέλεσμα θα είναι ένας ακέραιος.

Απαντήθηκε 31/08/2011 στις 20:08
πηγή χρήστη

ψήφοι
42

Υποθέτοντας ότι χρησιμοποιείτε WinForms, Form.Opacityείναι του τύπου double, έτσι θα πρέπει να χρησιμοποιήσετε:

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

Αν δεν χρειάζεστε την τιμή αλλού, είναι πιο απλό να γράψει:

this.Opacity = trackBar1.Value / 5000.0;

Ο λόγος που ο έλεγχος δεν λειτουργεί όταν αλλάξατε τον κωδικό σας να είναι απλά ένα διπλό ήταν επειδή είχες:

double trans = trackbar1.Value / 5000;

η οποία ερμήνευσε το 5000ως ακέραιος, οπότε σας transτην αξία ήταν πάντα μηδέν. Με ρητά κάνει την αριθμητική τιμή κινητής υποδιαστολής με την προσθήκη του .0ο compiler μπορεί τώρα να την ερμηνεύσει ως ένα διπλό και να εκτελέσει το σωστό υπολογισμό.

Απαντήθηκε 31/08/2011 στις 20:09
πηγή χρήστη

ψήφοι
38

Η καλύτερη λύση είναι η εξής:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
Απαντήθηκε 06/03/2012 στις 09:07
πηγή χρήστη

ψήφοι
37

Επειδή Opacityείναι μια διπλή αξία, θα ήθελα να χρησιμοποιήσει μόνο ένα διπλό από την αρχή και δεν ρίχνει καθόλου, αλλά να είστε βέβαιος να χρησιμοποιήσει ένα διπλό όταν διαίρεση, ώστε να μην χάσετε καμία ακρίβειας

Opacity = trackBar1.Value / 5000.0;
Απαντήθηκε 13/05/2012 στις 03:10
πηγή χρήστη

ψήφοι
31
this.Opacity = trackBar1.Value / 5000d;
Απαντήθηκε 11/04/2013 στις 16:08
πηγή χρήστη

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