믿거나 말거나, 델파이에 포함된 컴포넌트에는 무시할 수 없는 버그가 있습니다.
처음에는 델파이 자체 제어에 버그가 있다고 생각하지 못했습니다. 너무 답답해서 여러 번 디버깅을 했는데, 추적 후에야 발견했습니다.
샘플 페이지의 TSpinEdit 컨트롤이 보이시나요? MaxValue(최대값)와 MinValue(최소값)의 속성을 가집니다.
Bug1: 먼저 Value를 7로 설정한 다음 MaxValue를 5로, MinValue를 0으로 설정하지만 Value는 자동으로 변경되지 않습니다. ! !
버그2: MaxValue를 -7로, MinValue를 7로 설정했습니다. 그거 봤어? 최대값은 최소값보다 작을 수 있습니다.
Bug3: 최대값과 최소값이 같은 경우 값을 임의로 설정할 수 있습니다...
저자가 당시 어떻게 그렇게 많은 버그를 설계했는지 이해가 되지 않으며, 볼랜드가 왜 이 컨트롤을 채택했는지 이해가 되지 않습니다. 아마도 볼랜드의 게이트키퍼는 GG이고, 이 개발자는 MM이니까...
다시 본론으로 돌아가 델파이 설치 디렉터리인 /Source/Samples/Spin.Pas를 열어보겠습니다.
PRoperty 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(자체.값);
끝;
Private에는 분명히 CheckValue 함수가 있습니다. 한 번 살펴보겠습니다.
함수 TSpinEdit.CheckValue(NewValue: LongInt): LongInt;
시작하다
결과 := NewValue;
if (FMaxValue <> FMinValue) 그러면
시작하다
NewValue < FMinValue이면
결과 := FMinValue
그렇지 않으면 NewValue > FMaxValue이면
결과 := FMaxValue;
끝;
버그 3의 원인을 찾았습니다. 이 컨트롤의 작성자는 FMaxValue와 FMinValue가 동일한지 여부를 판단하지 않았습니다.
다음으로 변경:
함수 TSpinEdit.CheckValue(NewValue: LongInt): LongInt;
시작하다
결과 := NewValue;
if (FMaxValue <> FMinValue) 그러면
시작하다
NewValue < FMinValue이면
결과 := FMinValue
그렇지 않으면 NewValue > FMaxValue이면
결과 := FMaxValue;
끝
또 다른
시작하다
결과:=FMaxValue;
끝;
끝;