我在研究Delphi中组合控件的实作时,发现Samples面板上的TSpinEdit中有Bug,结果实验一下果然如此。请大家看看下面的VCL源码
procedure TSpinEdit.SetValue(NewValue:LongInt);
begin
Text := IntToStr(CheckValue(NewValue));
end;function CheckValue(NewValue:LongInt):LongInt
begin
Result := NewValue;
if (FMaxValue <> FMinValue) then
begin
if (NewValue < FMinValue) then
Result := FMinValue
else 
if (NewValue > FMaxValue) then
Result := FMaxValue;
end;
end;可以看出,当MaxValue和MinValuet的属性值相等时,NewValue便不会进行检验。此时的MinValue和MaxValue形同虚设。
所以我在Delphi中作了个Form,加入一个TSpinEdit组件,其MinValue=MaxValue=10,运行测试。果然Value值可以为-13,+100。另外,在TSpinEdit中的WMCut消息参数类型不合理,请看下面的源码。
procedure TSpinEdit.WMCut(var Message:TWMPaste);
begin
if(not FEditorEnabled or ReadOnly) then Exit;
inherited;
end;
请大家注意,Message:TWMPaste,WMCut消息的类型竟然是TWMPaste,而不是TWMCut。但却不会出错。这是为什么呢?
我查看了一下。原来在Messages单元中还有这样的定义:
  TWMCut = TWMNoParams;
  TWMPaste = TWMNoParams;
虽然如此,但总是不好。
这是我在Delphi5的VCL中发现的问题。不知各位有没有发现类似的问题。
或者Delphi6中已解决,望各位发表自己的看法。多多交流。