Избегайте дублирования для проверки - PullRequest
0 голосов
/ 18 февраля 2019

Я немного застрял.Моя цель - проверять и проверять мое поле валюты всегда, когда его значение изменилось, не обращая внимания на встроенный код или пользовательский интерфейс.Есть ли шаблон проверки или образец для него?Я хочу дважды позвонить в мою процедуру проверки.

Буду очень признателен за любую помощь или совет.

Вот мой пример:

type
TMyForm = class(TForm)   
  ceMyCurrencyEdit: TcxCurrencyEdit;
  procedure FormShow(Sender: TObject);
private
{ Private declarations }
  procedure SetupMyForm;
public
{ Public declarations }
  procedure ValidateMyCurrencyValue;
  function IsValidCurrency: Boolean;
end; 

procedure TMyForm.ValidateMyCurrencyField;
begin
  if not IsValidCurrency then
  begin
    WarningDlg(
       Format(
           'InValid value in field: [%s..%s]',
           [Formatfloat(ceMyCurrencyEditDisplayFormat, ceMyCurrencyEdit.MinValue),
           Formatfloat(ceMyCurrencyEdit.DisplayFormat, ceMyCurrencyEdit.MaxValue)]
        )
    );
    ceMyCurrencyEdit.Value := ceMyCurrencyEdit.MinValue; 
  end;   
end;

function TMyForm.IsValidCurrency: Boolean;
begin
  Result := (ceMyCurrencyEdit.Value >= ceMyCurrencyEdit.MinValue) and (ceMyCurrencyEdit.Value <= ceMyCurrencyEdit.MaxValue);  
end;

procedure TMyForm.SetupMyForm;
begin
  //MaxValue is 100
  ceMyCurrencyEdit.Value := 102;
  //At this point I need to call ValidateMyCurrencyField to get warning msg and refuse its value
  ValidateMyCurrencyField;
end;

procedure TMyForm.FormShow(Sender: TObject);
begin
  SetupMyForm;
end;

procedure TMyForm.ceMyCurrencyEditPropertiesEditValueChanged(Sender: TObject);
begin
  ValidateMyCurrencyField;
end;

То, что я хочу...

Спасибо за ответы!

1 Ответ

0 голосов
/ 18 февраля 2019

Я не уверен, почему вы казались немного пренебрежительным предложением 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;
...