Я не уверен, почему вы казались немного пренебрежительным предложением os @ Nil, но ниже приведен пример проекта, который показывает использование средства проверки cxCurrencyEdit и использование промежуточного класса TcxCurrencyEdit для записи результатов процесса проверки в его ValidationState
property.
Очевидно, что вы можете использовать свойство ValidationState, чтобы избежать повторения процесса проверки или вообще делать это, если государство говорит, что оно допустимо.Однако с точки зрения производительности, я очень сомневаюсь, что вы спасете себя что-нибудь.
Очевидно, что смысл класса interposer - записать состояние проверки элемента управления, чтобы вы могли избежать его проверки.второй раз.Используете ли вы его в сочетании с событием cxCurrencyEdit1PropertiesValidate
, зависит только от вас.
Я оставляю вас, чтобы связать это с вашим существующим кодом.
Кстати, элемент управления TEdit как раз здесьчтобы позволить смещению фокуса с cxCurrencyEdit вызвать его событие cxCurrencyEdit1PropertiesValidate
.
Обновить Вы спросили в комментарии о проверке значения, установленного в коде.С помощью класса Interposer легко добавить Getter и Setter для свойства Value и выполнить проверку в Setter - см. `SetValue ниже,
type
TCurrencyValidation = (cvNotDone, cvOK, cvInvalid);
TcxCurrencyEdit = class(cxCurrencyEdit.TcxCurrencyEdit)
private
FValidationState : TCurrencyValidation;
function GetValue: Double;
procedure SetValue(const AValue: Double);
protected
property ValidationState : TCurrencyValidation read FValidationState write FValidationState;
published
property Value : Double read GetValue write SetValue;
end;
TForm1 = class(TForm)
cxCurrencyEdit1: TcxCurrencyEdit;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure cxCurrencyEdit1PropertiesChange(Sender: TObject);
procedure cxCurrencyEdit1PropertiesValidate(Sender: TObject;
var DisplayValue: Variant; var ErrorText: TCaption;
var Error: Boolean);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
cxCurrencyEdit1.Properties.MinValue := 5;
cxCurrencyEdit1.Properties.MaxValue := 10;
cxCurrencyEdit1.Value := 8;
end;
procedure TForm1.cxCurrencyEdit1PropertiesChange(Sender: TObject);
begin
TcxCurrencyEdit(Sender).ValidationState := cvNotDone;
end;
procedure TForm1.cxCurrencyEdit1PropertiesValidate(Sender: TObject;
var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
var
Min,
Max : Double;
begin
Min := TcxCurrencyEdit(Sender).Properties.MinValue;
Max := TcxCurrencyEdit(Sender).Properties.MaxValue;
if (DisplayValue >= Min) and (DisplayValue <= Max) then
TcxCurrencyEdit(Sender).ValidationState := cvOK
else
TcxCurrencyEdit(Sender).ValidationState := cvInvalid;
Error := not (TcxCurrencyEdit(Sender).ValidationState = cvOK);
if Error then
ErrorText := 'InvalidValue';
end;
function TcxCurrencyEdit.GetValue: Double;
begin
Result := inherited Value;
end;
procedure TcxCurrencyEdit.SetValue(const AValue: Double);
begin
// insert code to validate AValue here
inherited Value := AValue;
end;