组件编写 - 如何正确处理错误输入的Object Inspector值?

6 delphi

快速问题我找不到任何信息.

在我创建的一个组件上,我有一个Integer类型的值.

我只需要允许在Object Inspector中输入的值在0-10之间,任何超出此范围的内容都应显示一条消息,说明输入的值不合适,然后将焦点返回给Delphi Object Inspector .

例:

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;
Run Code Online (Sandbox Code Playgroud)

我是否需要提出一些我不知道的特殊内置异常?以上工作与我的消息框弹出,但焦点到对象检查器中的罪魁祸首属性丢失,我必须重新点击它以再次更改值.如果输入的值不好,我只想显示消息并返回焦点,这样我就可以快速输入新值.

PS,上面的代码是在Web浏览器中编写的,因此原始问题显示我没有使用setter SetRangeVal作为属性RangeVal - 这只是一个输入错误.

Ken*_*ite 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;
Run Code Online (Sandbox Code Playgroud)

现在,您可以让编译器和IDE处理允许值的检查,而无需自己执行任何操作.(如果输入的值无效,IDE将处理异常并恢复为之前的值.)

procedure TMyComponent.SetRangeValue(const Value: TMyComponentRangeValue);
begin
  if Value <> FRangeValue then
    FRangeValue := Value;
end;
Run Code Online (Sandbox Code Playgroud)

  • 永远不会调用SetRangeVal,可以将其删除 (2认同)