如何阻止用户输入超过TSpinEdit.MaxValue的值?

时间:2013-07-15 13:49:06

标签: delphi

我将TSpinEdit的MaxValue设置为100000,但是当我运行程序时,如果我手动输入(而不是使用旋转),我可以输入超过100000的值。 有没有办法在不编写代码的情况下将值限制为MaxValue?否则MaxValue属性是100%无用的。

问题是,当用户输入一个巨大的值时,会产生一个RageCheckError,因为BigFileThreshis Cardinal。

procedure TFrmMain.spnMaxFileSizeChange(Sender: TObject);
begin
 PlaylistCtrl.BigFileThresh:= spnMaxFileSize.Value * KB;
end;

TSpinEdit 的这种新行为会导致Delphi程序在很多地方崩溃。我更喜欢Delphi 7中的那个。

THE CURRENT情况很容易添加如下行:

 if spnMaxFileSize.Value> spnMaxFileSize.MaxValue  
 then spnMaxFileSize.Value:= spnMaxFileSize.MaxValue;

但是从现在开始添加这一行还是打开我的所有程序并添加这一行?这太疯狂了!

3 个答案:

答案 0 :(得分:2)

正如您所发现的,即使当前输入的数字超出范围,也会调用SpinEdit的“onChange”事件。当您将焦点更改为其他控件时,该值将获得 限制正确。

你可以尝试制作一个新的(派生的)TSpinEdit版本,它不能以这种方式工作,或者你可以将所需的检查添加到你的OnChange事件处理程序。

答案 1 :(得分:1)

由于调用唯一的值checkvalue是CM_Exit的消息处理程序,您可以使用

procedure TFrmMain.spnMaxFileSizeChange(Sender: TObject);
begin
 SendMessage(TSpinEdit(Sender).Handle,CM_EXIT,0,0);
 PlaylistCtrl.BigFileThresh:= spnMaxFileSize.Value * KB;
end;

收到理想的行为。

调查.. \ source \ Win32 \ Samples \ Source。

答案 2 :(得分:0)

像这样的东西

TYPE
 TMySpinEdit = class(TSpinEdit)   { Fixes the OnChange MinValue/MaxValue issue. Details here: http://stackoverflow.com/questions/17655854/how-do-i-prevent-users-from-entering-values-that-exceed-tspinedit-maxvalue/17656652#17656652 }
  private
   Timer: TTimer;
   FOnChanged: TNotifyEvent;
   procedure TimesUp(Sender: TObject);
  public
   constructor Create (AOwner: TComponent);override;
   destructor Destroy;override;
   procedure Change; override;
  published
   property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
 end;



constructor TMySpinEdit.Create(AOwner: TComponent);
begin
 inherited;
 Timer:= TTimer.Create(Self);
 Timer.OnTimer:= TimesUp;
 Timer.Interval:= 2500; { allow user 2.5 seconds to enter a new correct value }
end;

destructor TMySpinEdit.Destroy;
begin
 FreeAndNil(Timer);
 inherited;
end;

procedure TMySpinEdit.Change;
begin
 Timer.Enabled:= FALSE;
 Timer.Enabled:= TRUE;
end;

procedure TMySpinEdit.TimesUp;
begin
 Timer.Enabled:= FALSE;

 if (MaxValue<> 0) AND (Value> MaxValue)
 then Value:= MaxValue;

 if (MinValue<> 0) AND (Value< MinValue)
 then Value:= MinValue;

 if Assigned(FOnChanged)
 then FOnChanged(Self);
end;

代码尚未测试(待编译)。

<强>问题:
我不得不使用自己的OnChanged事件。将所有这些东西放在OnChange事件中会很不错。知道怎么做吗?这样,在所有项目(PAS和DFM)上应用批量替换会更容易。

(来吧Embarcadero;它并不那么难)