6

簡単な質問です。情報が見つかりません。

私が作成しているコンポーネントの 1 つに、整数型の値があります。

オブジェクト インスペクタに入力された値のみが 0 ~ 10 の範囲内になるようにする必要があります。この範囲外の値はすべて、入力された値が適切でないというメッセージを表示し、フォーカスを Delphi オブジェクト インスペクタに戻します。 .

例:

TMyComponent = class(TComponent)
private
  FRangeVal: Integer;
  procedure SetRangeVal(const Value: Integer);
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property RangeVal: Integer read FRangeVal write SetRangeVal default 0;
end;

...

procedure SetRangeVal(const Value: Integer);
var
  OldValue: Integer;
begin
  OldValue := Value;
  if (Value < 0) or (Value > 10) then
  begin
    MessageDlg('Please enter a value between 0-10', mtError, [mbOK], 0);
    // FRangeVal := OldValue; ?? revert to the last value that worked
    // return focus back to property in Inspector ??
  end 
  else
  begin
    if Value <> FRangeVal then
    begin
      FRangeVal := Value;
    end;
  end;
end;

おそらく気付いていない特別な組み込み例外を発生させる必要がありますか? 上記はメッセージ ボックスのポップアップで動作しますが、オブジェクト インスペクタの犯人プロパティへのフォーカスが失われ、再度クリックして値を再度変更する必要があります。入力した値が正しくない場合は、メッセージを表示してフォーカスを戻したいので、新しい値をすばやく入力できます。

PS、上記のコードは Web ブラウザーで記述されているため、元の質問では、プロパティ RangeVal にセッター SetRangeVal を使用しなかったことが示されました。これは単なる入力ミスでした。

4

3 に答える 3

11

0まず、プロパティにとの間の値しか含めることができない場合は10、あいまいな整数プロパティとして定義しないでください。定義された値の範囲を持つサブタイプとして定義します。

type
  TMyComponentRangeValue = 0..10;

TMyComponent = class(TComponent)
private
  FRangeVal: TMyComponentRangeValue;
  procedure SetRangeVal(const Value: TMyComponentRangeValue);
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property RangeVal: TMyComponentRangeValue read FRangeVal 
    write SetRangeVal default 0;
end;

これで、コンパイラとIDEに、自分で何もせずに許容値のチェックを処理させることができます。(IDE wlllは例外を処理し、無効な値が入力された場合は前の値に戻ります。)

procedure TMyComponent.SetRangeValue(const Value: TMyComponentRangeValue);
begin
  if Value <> FRangeValue then
    FRangeValue := Value;
end;
于 2013-01-01T23:56:50.407 に答える
2

これは、(Setter メソッドを使用して) 修正されたコードとIntegerタイプです。

サイレント セッターまたは例外セッターのいずれかを選択できます。

{$DEFINE SILENT_SETTER}

TMyComponent = class(TComponent)
private
  FRangeVal: Integer;
  procedure SetRangeVal(const Value: Integer);
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property RangeVal: Integer read FRangeVal write SetRangeVal default 0;
end;

...

procedure SetRangeVal(const Value: Integer);
begin
  // Range Checking
  if (Value < 0) or (Value > 10) then
{$IFDEF SILENT_SETTER}
    Exit;
{$ELSEIF}
    raise Exception.Create('Value out of Range');
{$ENDIF}

  // Store if needed
  if Value <> FRangeVal then
    FRangeVal := Value;
end;
于 2013-01-02T09:03:57.227 に答える
2

質問は@KenWhiteによって回答されています。
独自の型を定義することで処理できない場合は、メッセージ ボックスを表示する代わりにエラーを発生させることができます。

于 2013-01-02T00:13:25.673 に答える