2016-12-01 58 views
5

Mam obiekt typu TValueListEditor, który zawiera pewne parametry funkcji w kolumnie Key, oraz dane wejściowe dla odpowiedniej kolumny wartości do przetestowania funkcji. Dodałem maskę edycji do wartości wejściowej, w zależności od typu danych, które powinien mieć parametr. Na przykład parametr Num1 jest typu int, więc dane wejściowe muszą być tylko liczbami, ale ponieważ nie znam dokładnej liczby cyfr z góry, czy istnieje sposób określenia maski edycji bez stałej długości znaków?Zestaw Delphi Maska bez stałej długości znaków

Jeśli przyjrzeć się poniższemu kodowi, jeśli potrzebuję wartości typu float, muszę mieć punkt, ale nie chcę, aby punkt był wstępnie zdefiniowany na tej dokładnej pozycji.

if parser.sParams.Values[parser.sParams.Names[i]]='float' then 
    begin 
    lstValParamValues.ItemProps[parser.sParams.Names[i]].EditMask:='#########.#'; 
    end 

Może powinienem zaimplementować coś jak regex na EditMask? Czy istnieje inny sposób na wdrożenie sprawdzania poprawności wprowadzanych wartości?

+0

użytku OnGetEditMask aby zmienić editmask na podstawie rodzaju dziedzinie to: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html /delphivclwin32/ValEdit_TValueListEditor_OnGetEditMask.html –

Odpowiedz

5

Per na TItemProp.EditMask documentation:

walidacji za pomocą właściwości EditMask odbywa się na zasadzieznak po znaku.

Można więc używać tylko masek o stałej szerokości. Co oznacza, że ​​musisz określić miejsce, w którym ma się pojawić przecinek dziesiętny oraz ile wyprzedzających i końcowych cyfr zaakceptować.

Rozważmy używając zdarzenie TValueListEditor.OnValidate zamiast:

Występuje, gdy ostrość przesuwa się z dala od komórki w edytorze listy wartości.

Napisz procedurę obsługi zdarzeń OnValidate, aby sprawdzić wszystkie zmiany wprowadzane przez użytkownika w komórce, zanim fokus ją opuści. Opcja OnValidate daje aplikacjom możliwość zapewnienia większego sprawdzenia poprawności niż właściwość EditMask odpowiedniego obiektu TItemProp może dostarczyć.

Wartość OnValidate występuje tylko wtedy, gdy użytkownik edytował wartość komórki, która ma stracić ostrość. Moduł obsługi zdarzeń OnValidate może zweryfikować wartość dostarczoną przez użytkownika, a jeśli nie jest akceptowalny, zgłosić wyjątek.

Na przykład:

uses 
    SysConsts; 

procedure TMyForm.lstValParamValuesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName: String; const KeyValue: String); 
var 
    ValueType: string; 
    sIgnored: Single; 
    dIgnored: Double; 
begin 
    if KeyValue = '' then Exit; 

    ValueType := parser.sParams.Values[KeyName]; 

    if ValueType = 'int' then 
    StrToInt(KeyValue) 

    else if ValueType = 'float' then 
    begin 
    if not TryStrToFloat(KeyValue, sIgnored) then 
     raise EConvertError.CreateFmt(SInvalidFloat, [KeyValue]); 
    end 

    else if ValueType = 'double' then 
    begin 
    if not TryStrToFloat(KeyValue, dIgnored) then 
     raise EConvertError.CreateFmt(SInvalidFloat, [KeyValue]); 
    end 

    // etc... 
end;