我将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;
但是从现在开始添加这一行还是打开我的所有程序并添加这一行?这太疯狂了!
答案 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;它并不那么难)