快速提问我无法找到任何相关信息。
在我创建的一个组件上,我有一个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;
我是否需要提出一些我不知道的特殊内置异常?以上工作与我的消息框弹出,但焦点到对象检查器中的罪魁祸首属性丢失,我必须重新点击它以再次更改值。如果输入的值不好,我只想显示消息并返回焦点,这样我就可以快速输入新值。
PS,上面的代码是在Web浏览器中编写的,因此原始问题显示我没有将setter SetRangeVal用于属性RangeVal - 这只是一个输入错误。
答案 0 :(得分: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将处理异常并恢复到之前的值。)
procedure TMyComponent.SetRangeValue(const Value: TMyComponentRangeValue);
begin
if Value <> FRangeValue then
FRangeValue := Value;
end;
答案 1 :(得分:2)
问题由@KenWhite回答 如果无法处理的情况是定义自己的类型,您可能只是提出错误而不是显示消息框。
答案 2 :(得分:2)
这是您更正的代码(使用Setter方法)和Integer
类型。
您可以选择无声或异常Setter:
{$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;