2016-12-01 17 views
5

Tôi có đối tượng kiểu TValueListEditor chứa các tham số nhất định của hàm trong cột Khóa và đầu vào cho cột giá trị thích hợp để kiểm tra hàm. Tôi đã thêm một mặt nạ chỉnh sửa vào đầu vào giá trị tùy thuộc vào loại dữ liệu mà tham số phải là. Ví dụ tham số Num1 là kiểu int, vì vậy đầu vào sẽ chỉ là số, nhưng vì tôi không biết chính xác số chữ số trước, có cách nào để chỉ định EditMask không có độ dài cố định của các ký tự không?Delphi đặt Chỉnh sửa Mặt nạ không có độ dài cố định của các ký tự

Nếu bạn nhìn vào mã bên dưới, nếu tôi cần giá trị kiểu float, tôi phải có một điểm, nhưng tôi không muốn điểm được xác định trước tại vị trí chính xác đó.

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

Có lẽ tôi nên triển khai một cái gì đó như regex trên EditMask? Hoặc là có một cách khác để thực hiện xác nhận giá trị đầu vào?

+0

sử dụng OnGetEditMask để thay đổi editmask dựa vào loại lĩnh vực see: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html /delphivclwin32/ValEdit_TValueListEditor_OnGetEditMask.html –

Trả lời

5

mỗi sự TItemProp.EditMask documentation:

Validation sử dụng tài sản EditMask được thực hiện trên cơ sởký tự bằng ký tự.

Vì vậy, bạn chỉ có thể sử dụng mặt nạ cố định chiều rộng. Điều này có nghĩa là bạn phải xác định vị trí điểm thập phân và số lượng chữ số đầu và cuối để chấp nhận.

Xem xét sử dụng các sự kiện TValueListEditor.OnValidate thay vì:

Xảy ra khi tập trung chuyển đi từ một tế bào trong trình soạn thảo danh sách giá trị.

Viết trình xử lý sự kiện OnValidate để xác thực mọi chỉnh sửa mà người dùng nhập vào ô trước khi tiêu điểm rời khỏi ô đó. OnValidate cung cấp cho các ứng dụng một cơ hội để cung cấp xác nhận hợp lệ hơn thuộc tính EditMask của đối tượng TItemProp tương ứng có thể cung cấp.

OnValidate chỉ xảy ra nếu người dùng đã chỉnh sửa giá trị của ô sắp mất tiêu điểm. Trình xử lý sự kiện OnValidate có thể xác minh giá trị mà người dùng đã cung cấp và nếu nó không được chấp nhận, hãy tăng một ngoại lệ.

Ví dụ:

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; 
Các vấn đề liên quan