1

TSpinEdit の MaxValue を 100000 に設定しましたが、プログラムを実行すると、(スピンを使用する代わりに) 手動で入力すると 100000 を超える値を入力できます。コードを書かずに値を MaxValue に制限する方法はありますか? それ以外の場合、MaxValue プロパティは 100% 役に立ちません。

問題は、ユーザーが巨大な値を入力すると、BigFileThreshis Cardinal.

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

TSpinEdit のこの新しい動作により、Delphi プログラムが多くの場所でクラッシュする可能性があります。私は Delphi 7 のものの方が好きでした。

現在の状況では、次のような行を追加するのは簡単です。

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

しかし、これからこの行を追加するには、またはすべてのプログラムを開いてこの行を追加するには? 狂ってる!

4

3 に答える 3

2

ご覧のとおり、現在入力されている数値が範囲外であっても、SpinEdit の「onChange」イベントが呼び出されます。フォーカスを別のコントロールに変更すると、値が正しく制限されます。

この方法では機能しない TSpinEdit の新しい (派生した) バージョンを作成してみるか、OnChange イベント ハンドラに必要なチェックを追加するだけです。

于 2013-07-15T14:06:58.773 に答える
0

2 つの可能な解決策:

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 に答える