Percaya atau tidak, ada bug yang tidak bisa diabaikan pada komponen yang disertakan dengan Delphi.
Awalnya saya tidak mengira ada bug di kontrol Delphi sendiri. Sangat membuat frustrasi sehingga saya melakukan debug berkali-kali, dan baru menemukannya setelah menelusuri.
Lihat kontrol TSpinEdit di halaman Sampel? Ia memiliki properti MaxValue (nilai maksimum) dan MinValue (nilai minimum).
Bug1: Pertama setel Nilai ke 7, lalu setel MaxValue ke 5, dan MinValue ke 0, tetapi Nilai tidak akan berubah secara otomatis! ! !
Bug2: Anda menyetel MaxValue ke -7 dan MinValue ke 7. Apakah kamu melihatnya? Nilai maksimumnya bisa lebih kecil dari nilai minimumnya.
Bug3: Ketika nilai maksimum dan nilai minimum sama, Nilai dapat diatur dengan santai...
Saya tidak mengerti bagaimana penulis merancang begitu banyak bug pada saat itu, dan saya tidak mengerti mengapa Borland mengadopsi kontrol ini. Mungkin penjaga gerbang Borland adalah GG, dan pengembang ini adalah MM, jadi...
Mari kembali ke pokok permasalahan dan buka direktori instalasi Delphi /Source/Samples/Spin.Pas
Temukan PROperty MaxValue: LongInt baca FMaxValue tulis FMaxValue;
properti MinValue: LongInt baca FMinValue tulis FMinValue;
Bug1 dan Bug2 ditemukan secara bersamaan! Tidak ada penilaian, nilai FMaxValue dan FMinValue langsung ditetapkan, yaitu nilai maksimum dan minimum tidak dibatasi dan dapat diatur sesuka hati. Setelah mengatur nilai maksimum dan minimum, Nilai tidak di-refresh, yang menyebabkan terjadinya Bug1.
Ubah menjadi:
properti MaxValue: LongInt baca FMaxValue tulis SetMaxValue;
properti MinValue: LongInt baca FMinValue tulis SetMinValue;
Tambahkan dua prosedur dalam Pribadi:
prosedur SetMaxValue(Nilai: LongInt);
prosedur SetMinValue(Nilai: LongInt);
Isinya adalah sebagai berikut:
prosedur TSpinEdit.SetMaxValue(Nilai: LongInt);
mulai
jika Nilai >= FMinValue maka
Nilai FMax := Nilai;
SetValue(Self.Value);
akhir;
prosedur TSpinEdit.SetMinValue(Nilai: LongInt);
mulai
jika Nilai <= FMaxValue maka
Nilai FMin := Nilai;
SetValue(Self.Value);
akhir;
Jelas ada fungsi CheckValue di Private, coba saya lihat.
fungsi TSpinEdit.CheckValue (Nilai Baru: LongInt): LongInt;
mulai
Hasil := Nilai Baru;
jika (FMaxValue <> FMinValue) maka
mulai
jika NewValue < FMinValue maka
Hasil := Nilai FMin
lain jika NewValue > FMaxValue lalu
Hasil := FMaxValue;
akhir;
Menemukan alasan Bug 3. Penulis kontrol ini tidak menilai apakah FMaxValue dan FMinValue sama.
Ubah menjadi:
fungsi TSpinEdit.CheckValue (Nilai Baru: LongInt): LongInt;
mulai
Hasil := Nilai Baru;
jika (FMaxValue <> FMinValue) maka
mulai
jika NewValue < FMinValue maka
Hasil := Nilai FMin
lain jika NewValue > FMaxValue lalu
Hasil := FMaxValue;
akhir
kalau tidak
mulai
Hasil:=FMaxValue;
akhir;
akhir;