سؤال

أريد استخدام شريط المسار لتغيير عتامة النموذج.

هذا هو الكود الخاص بي:

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

عندما أقوم ببناء التطبيق يعطي الخطأ التالي:

لا يمكن تحويل النوع ضمنيًا 'decimal' ل 'double'.

حاولت استخدام trans و double ولكن بعد ذلك لا يعمل التحكم.كان هذا الرمز يعمل بشكل جيد في مشروع VB.NET سابق.

هل كانت مفيدة؟

المحلول

ليس من الضروري إجراء عملية مضاعفة صريحة مثل هذا:

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

تحديد الثابت كما 5000.0 (أو كما 5000d) كافي:

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

نصائح أخرى

إجابة أكثر عمومية للسؤال العام "Decimal vs Double؟": عدد عشري للحسابات النقدية للحفاظ على الدقة، مزدوج لحسابات علمية لا تتأثر بالاختلافات الصغيرة.نظرًا لأن Double هو نوع أصلي لوحدة المعالجة المركزية (يتم تخزين التمثيل الداخلي في القاعدة 2)، فإن الحسابات التي يتم إجراؤها باستخدام Double تؤدي أداءً أفضل من النظام العشري (الذي يتم تمثيله في القاعدة 10 داخليا).

عملت التعليمات البرمجية الخاصة بك بشكل جيد في VB.NET لأنها تقوم ضمنيًا بإجراء أي تحويلات، بينما تحتوي لغة C# على عمليات تحويل ضمنية وصريحة.

في C# يكون التحويل من الرقم العشري إلى المزدوج واضحًا حيث تفقد الدقة.على سبيل المثال، لا يمكن التعبير عن 1.1 بدقة على شكل رقم مزدوج، ولكن يمكن التعبير عنه على شكل عدد عشري (انظر "أرقام الفاصلة العائمة - غير دقيقة أكثر مما تعتقد"للسبب).

في VB تمت إضافة التحويل لك بواسطة المترجم:

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

الذي - التي (double) يجب أن يتم ذكر ذلك بشكل صريح في C#، ولكن يمكن أن يكون كذلك ضمني بواسطة مترجم VB الأكثر "تسامحًا".

لماذا تقسم على 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;
}

لديك مشكلتان.أولاً، Opacity يتطلب قيمة مزدوجة وليست عشرية.يخبرك المترجم أنه على الرغم من وجود تحويل بين النظام العشري والمزدوج، إلا أنه تحويل صريح تحتاج إلى تحديده حتى يعمل.والثاني هو ذلك TrackBar.Value هي قيمة عددية وتقسيم int على int يؤدي إلى int بغض النظر عن نوع المتغير الذي قمت بتعيينه له.في هذه الحالة، يوجد تحويل ضمني من int إلى العدد العشري أو المزدوج - لأنه لا يوجد فقدان للدقة عند إجراء التحويل - لذلك لا يشتكي المترجم، ولكن القيمة التي تحصل عليها دائمًا هي 0، على الأرجح، نظرًا لأن trackBar.Value دائما أقل من 5000الحل هو تغيير الكود الخاص بك لاستخدام double (النوع الأصلي لـ Opacity) وإجراء العمليات الحسابية للفاصلة العائمة عن طريق جعل الثابت مزدوجًا بشكل صريح - والذي سيكون له تأثير في تعزيز الحساب - أو الإرسال trackBar.Value لمضاعفة، والتي سوف تفعل الشيء نفسه - أو كليهما.أوه، ولا تحتاج إلى المتغير الوسيط إلا إذا تم استخدامه في مكان آخر.أعتقد أن المترجم سيعمل على تحسينه على أي حال.

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

في رأيي، من المستحسن أن تكون صريحا قدر الإمكان.وهذا يضيف وضوحًا للكود ويساعد زملائك المبرمجين الذين قد يقرأونه في النهاية.

بالإضافة إلى (أو بدلاً من) إلحاق أ .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);

هذا يبدو وكأنه this.Opacity هي قيمة مزدوجة، ولا يحب المترجم أن تحاول إدخال قيمة عشرية فيها.

يجب عليك استخدام 5000.0 بدلاً من 5000.

ال العتامة الملكية من النوع المزدوج:

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

أو ببساطة:

this.Opacity = trackBar1.Value / 5000.0;

أو:

this.Opacity = trackBar1.Value / 5000d;

لاحظ أنني أستخدم 5000.0 (أو 5000d) لفرض القسمة المزدوجة لأن trackBar1.Value هو عدد صحيح وسيؤدي إلى تقسيم عدد صحيح وستكون النتيجة عددًا صحيحًا.

على افتراض أنك تستخدم 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 كعدد صحيح، ولأن trackbar1.Value هو أيضا عدد صحيح الخاص بك trans وكانت القيمة دائما صفر.من خلال جعل الرقم الرقمي قيمة فاصلة عائمة بشكل صريح عن طريق إضافة .0 يمكن للمترجم الآن تفسيره على أنه مزدوج وإجراء الحساب الصحيح.

الحل الأفضل هو:

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

منذ Opacity هي قيمة مزدوجة، أود فقط استخدام قيمة مزدوجة منذ البداية وعدم الإدلاء بها على الإطلاق، ولكن تأكد من استخدام قيمة مزدوجة عند القسمة حتى لا تفقد أي دقة

Opacity = trackBar1.Value / 5000.0;
this.Opacity = trackBar1.Value / 5000d;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top