ไม่ว่าคุณจะอยากจะเชื่อหรือไม่ก็ตาม มีข้อบกพร่องที่ไม่สามารถละเลยได้ในส่วนประกอบที่มาพร้อมกับ Delphi
ตอนแรกฉันไม่คิดว่าจะมีข้อบกพร่องในการควบคุมของ Delphi มันน่าหงุดหงิดมากที่ฉันแก้ไขมันหลายครั้ง และค้นพบมันหลังจากการติดตามเท่านั้น
ดูการควบคุม TSpinEdit บนหน้าตัวอย่างหรือไม่ มีคุณสมบัติ MaxValue (ค่าสูงสุด) และ MinValue (ค่าต่ำสุด)
Bug1: ขั้นแรกให้ตั้งค่าเป็น 7 จากนั้นตั้งค่า MaxValue เป็น 5 และ MinValue เป็น 0 แต่ Value จะไม่เปลี่ยนโดยอัตโนมัติ! - -
Bug2: คุณตั้งค่า MaxValue เป็น -7 และ MinValue เป็น 7 คุณเห็นสิ่งนั้นไหม? ค่าสูงสุดสามารถน้อยกว่าค่าต่ำสุดได้
Bug3: เมื่อค่าสูงสุดและค่าต่ำสุดเท่ากัน สามารถตั้งค่าได้โดยไม่ตั้งใจ...
ฉันไม่เข้าใจว่าผู้เขียนออกแบบข้อบกพร่องมากมายในขณะนั้นอย่างไร และฉันไม่เข้าใจว่าเหตุใด Borland จึงนำการควบคุมนี้ไปใช้ บางทีผู้รักษาประตูของ Borland อาจเป็น GG และนักพัฒนารายนี้อาจเป็น MM ดังนั้น...
กลับไปที่จุดนั้นแล้วเปิดไดเร็กทอรีการติดตั้ง Delphi /Source/Samples/Spin.Pas
ค้นหาคุณสมบัติ MaxValue: LongInt อ่าน FMaxValue เขียน FMaxValue;
คุณสมบัติ MinValue: LongInt อ่าน FMinValue เขียน FMinValue;
พบ Bug1 และ Bug2 พร้อมกัน! ไม่มีการตัดสิน ค่าของ FMaxValue และ FMinValue ถูกตั้งค่าโดยตรง กล่าวคือ ไม่มีการจำกัดค่าสูงสุดและค่าต่ำสุดและสามารถตั้งค่าได้ตามต้องการ หลังจากตั้งค่าสูงสุดและต่ำสุดแล้ว ค่าจะไม่รีเฟรช ซึ่งนำไปสู่การเกิด Bug1
เปลี่ยนเป็น:
คุณสมบัติ MaxValue: LongInt อ่าน FMaxValue เขียน SetMaxValue;
คุณสมบัติ MinValue: LongInt อ่าน FMinValue เขียน SetMinValue;
เพิ่มสองขั้นตอนใน Private:
ขั้นตอน SetMaxValue (ค่า: LongInt);
ขั้นตอน SetMinValue (ค่า: LongInt);
เนื้อหามีดังนี้:
ขั้นตอน TSpinEdit.SetMaxValue (ค่า: LongInt);
เริ่ม
ถ้าค่า >= FMinValue แล้ว
FMaxValue := ค่า;
SetValue(ค่าตนเอง);
จบ;
ขั้นตอน TSpinEdit.SetMinValue (ค่า: LongInt);
เริ่ม
ถ้าค่า <= FMaxValue แล้ว
FMinValue := ค่า;
SetValue(ค่าตนเอง);
จบ;
มีฟังก์ชัน CheckValue ชัดเจนใน Private ให้ฉันดู
ฟังก์ชัน TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
เริ่ม
ผลลัพธ์ := ค่าใหม่;
ถ้า (FMaxValue <> FMinValue) แล้ว
เริ่ม
ถ้า NewValue < FMinValue แล้ว
ผลลัพธ์ := FMinValue
อย่างอื่นถ้า NewValue > FMaxValue แล้ว
ผลลัพธ์ := FMaxValue;
จบ;
พบสาเหตุของ Bug 3 ผู้เขียนการควบคุมนี้ไม่ได้ตัดสินว่า FMaxValue และ FMinValue เท่ากันหรือไม่
เปลี่ยนเป็น:
ฟังก์ชัน TSpinEdit.CheckValue (NewValue: LongInt): LongInt;
เริ่ม
ผลลัพธ์ := ค่าใหม่;
ถ้า (FMaxValue <> FMinValue) แล้ว
เริ่ม
ถ้า NewValue < FMinValue แล้ว
ผลลัพธ์ := FMinValue
อย่างอื่นถ้า NewValue > FMaxValue แล้ว
ผลลัพธ์ := FMaxValue;
จบ
อื่น
เริ่ม
ผลลัพธ์:=FMaxValue;
จบ;
จบ;