سواء كنت تريد أن تصدق ذلك أم لا، هناك خطأ لا يمكن تجاهله في المكونات التي تأتي مع دلفي.
في البداية لم أكن أعتقد أن هناك خللًا في سيطرة دلفي. لقد كان الأمر محبطًا للغاية لدرجة أنني قمت بتصحيحه عدة مرات، ولم أكتشفه إلا بعد التتبع.
هل ترى عنصر التحكم TSpinEdit في صفحة العينات؟ يحتوي على خصائص MaxValue (القيمة القصوى) وMinValue (القيمة الدنيا).
Bug1: قم أولاً بتعيين القيمة على 7، ثم قم بتعيين MaxValue على 5، وMinValue على 0، لكن القيمة لن تتغير تلقائيًا! ! !
Bug2: قمت بتعيين MaxValue إلى -7 وMinValue إلى 7. هل رأيت ذلك؟ يمكن أن تكون القيمة القصوى أصغر من القيمة الدنيا.
الخطأ 3: عندما تكون القيمة القصوى والحد الأدنى متساويين، يمكن تعيين القيمة بشكل عرضي...
لا أفهم كيف صمم المؤلف الكثير من الأخطاء في ذلك الوقت، ولا أفهم لماذا تبنى بورلاند هذا التحكم. ربما حارس بوابة بورلاند هو GG، وهذا المطور هو MM، لذا...
دعنا نعود إلى النقطة ونفتح دليل تثبيت دلفي /Source/Samples/Spin.Pas
ابحث عن PROperty MaxValue: LongInt read FMaxValue، write FMaxValue؛
الخاصية MinValue: LongInt قراءة FMinValue كتابة FMinValue؛
تم العثور على الخطأ 1 والخطأ 2 في نفس الوقت! لا يوجد حكم، يتم تعيين قيم FMaxValue وFMinValue مباشرة، أي أن القيم القصوى والدنيا غير مقيدة ويمكن ضبطها حسب الرغبة. بعد تعيين الحد الأقصى والحد الأدنى للقيم، لا يتم تحديث القيمة، مما يؤدي إلى حدوث Bug1.
التغيير إلى:
خاصية MaxValue: LongInt قراءة FMaxValue كتابة SetMaxValue؛
الخاصية MinValue: LongInt قراءة FMinValue كتابة SetMinValue؛
إضافة إجراءين في القطاع الخاص:
الإجراء SetMaxValue(Value: LongInt);
الإجراء SetMinValue(Value: LongInt);
المحتوى هو كما يلي:
الإجراء TSpinEdit.SetMaxValue(Value: LongInt);
يبدأ
إذا كانت القيمة >= FMinValue إذن
FMaxValue := القيمة؛
SetValue(Self.Value);
نهاية؛
الإجراء TSpinEdit.SetMinValue(Value: LongInt);
يبدأ
إذا كانت القيمة <= FMaxValue ثم
FMinValue := القيمة؛
SetValue(Self.Value);
نهاية؛
من الواضح أن هناك وظيفة CheckValue في القطاع الخاص، واسمحوا لي أن ألقي نظرة.
وظيفة TSpinEdit.CheckValue (NewValue: LongInt): LongInt؛
يبدأ
النتيجة := NewValue;
إذا (FMaxValue <> FMinValue) إذن
يبدأ
إذا NewValue <FMinValue ثم
النتيجة := FMinValue
وإلا إذا كان NewValue> FMaxValue بعد ذلك
النتيجة := FMaxValue;
نهاية؛
تم العثور على سبب الخطأ 3. لم يحدد مؤلف عنصر التحكم هذا ما إذا كانت FMaxValue وFMinValue متساويتين.
التغيير إلى:
وظيفة TSpinEdit.CheckValue (NewValue: LongInt): LongInt؛
يبدأ
النتيجة := NewValue;
إذا (FMaxValue <> FMinValue) إذن
يبدأ
إذا NewValue <FMinValue ثم
النتيجة := FMinValue
وإلا إذا كان NewValue> FMaxValue بعد ذلك
النتيجة := FMaxValue;
نهاية
آخر
يبدأ
النتيجة:=FMaxValue;
نهاية؛
نهاية؛