1

我将 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;

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

4

3 回答 3

2

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

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

于 2013-07-15T14:06:58.773 回答
1

由于唯一调用校验值的地方是 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。

于 2013-07-15T14:08:27.623 回答
0

两种可能的解决方案:

TYPE
 TMySpinEdit = class(TSpinEdit)   { Fixes the OnChange MinValue/MaxValue issue }
  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;

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


另一个解决方案是:

TYPE
 TMySpinEdit = class(TSpinEdit)
  public
   procedure Change; override;
 end;

IMPLEMENTATION

procedure TMySpinEdit .Change;
begin
 if (Value > MaxValue) OR (Value < MinValue) then
  begin
    Color:= clRed;
    EXIT;  { Out of range value. Don't trigger the OnChange event. }
  end;

 Color:= clWindow;
 inherited;
end;
于 2013-07-15T14:28:14.523 回答