📄 jvqvalidateedit.pas
字号:
NUMBERS = '0123456789';
var
OldFormat: TJvValidateEditDisplayFormat;
begin
if FDisplayFormat <> NewValue then
begin
OldFormat := FDisplayFormat;
FDisplayFormat := NewValue;
case FDisplayFormat of
dfAlphabetic:
begin
FCheckChars := ALPHABET;
if FAutoAlignment then
Alignment := taLeftJustify;
end;
dfAlphaNumeric:
begin
FCheckChars := ALPHABET + NUMBERS;
if FAutoAlignment then
Alignment := taLeftJustify;
end;
dfBinary:
begin
FCheckChars := '01';
if FAutoAlignment then
Alignment := taRightJustify;
end;
dfCheckChars, dfNonCheckChars:
Alignment := taLeftJustify;
dfCustom, dfNone:
begin
FCheckChars := '';
if FAutoAlignment then
Alignment := taLeftJustify;
end;
dfCurrency:
begin
FCheckChars := NUMBERS + DecimalSeparator;
if FAutoAlignment then
Alignment := taRightJustify;
if not (csLoading in ComponentState) then
if FDecimalPlaces = 0 then
FDecimalPlaces := CurrencyDecimals;
end;
dfFloat, dfPercent:
begin
FCheckChars := NUMBERS + DecimalSeparator;
if FAutoAlignment then
Alignment := taRightJustify;
end;
dfHex:
begin
FCheckChars := NUMBERS + 'ABCDEFabcdef';
if FAutoAlignment then
Alignment := taRightJustify;
end;
dfInteger:
begin
FCheckChars := NUMBERS;
if FAutoAlignment then
Alignment := taRightJustify;
end;
dfOctal:
begin
FCheckChars := '01234567';
if FAutoAlignment then
Alignment := taRightJustify;
end;
dfScientific:
begin
FCheckChars := NUMBERS + 'Ee' + DecimalSeparator;
if FAutoAlignment then
Alignment := taRightJustify;
end;
dfYear:
begin
FCheckChars := NUMBERS;
if FAutoAlignment then
Alignment := taRightJustify;
MaxLength := 4;
end;
end;
if OldFormat = dfYear then
MaxLength := 0;
// Convert non-base 10 numbers to base 10 and base-10 numbers to non-base 10
if (OldFormat = dfBinary) and
(NewValue in [dfCurrency, dfFloat, dfHex, dfInteger, dfOctal, dfPercent, dfScientific, dfYear]) then
SetAsInteger(BaseToInt(FEditText, 2))
else
if (OldFormat in [dfCurrency, dfFloat, dfPercent]) and
(NewValue in [dfBinary, dfHex, dfOctal]) then
SetAsFloat(StrToFloatDef(FEditText, 0))
else
if (OldFormat = dfHex) and
(NewValue in [dfBinary, dfCurrency, dfFloat, dfInteger, dfOctal, dfPercent, dfScientific, dfYear]) then
SetAsInteger(BaseToInt(FEditText, 16))
else
if (OldFormat in [dfInteger, dfYear]) and
(NewValue in [dfBinary, dfHex, dfOctal]) then
SetAsInteger(StrToIntDef(FEditText, 0))
else
if (OldFormat = dfOctal) and
(NewValue in [dfBinary, dfCurrency, dfFloat, dfHex, dfInteger, dfPercent, dfScientific, dfYear]) then
SetAsInteger(BaseToInt(FEditText, 8))
else
begin
// ...or just display the value
if not (csLoading in ComponentState) then
EditText := FEditText;
end;
end;
end;
procedure TJvCustomValidateEdit.SetZeroEmpty(NewValue: Boolean);
begin
if FZeroEmpty <> NewValue then
begin
FZeroEmpty := NewValue;
if not (csLoading in ComponentState) then
EditText := FEditText;
end;
end;
function TJvCustomValidateEdit.GetAsInteger: Integer;
begin
case FDisplayFormat of
dfBinary:
Result := BaseToInt(FEditText, 2);
dfHex:
Result := BaseToInt(FEditText, 16);
dfOctal:
Result := BaseToInt(FEditText, 8);
else
Result := StrToIntDef(FEditText, 0);
end;
end;
procedure TJvCustomValidateEdit.SetAsInteger(NewValue: Integer);
begin
case FDisplayFormat of
dfAlphabetic, dfAlphaNumeric, dfCheckChars, dfCustom,
dfNonCheckChars, dfNone:
EditText := IntToStr(NewValue);
dfBinary:
EditText := IntToBase(NewValue, 2);
dfHex:
EditText := IntToBase(NewValue, 16);
dfOctal:
EditText := IntToBase(NewValue, 8);
dfCurrency, dfFloat, dfInteger, dfPercent, dfScientific, dfYear:
EditText := IntToStr(IntRangeValue(NewValue));
end;
end;
function TJvCustomValidateEdit.GetAsCurrency: Currency;
begin
case FDisplayFormat of
dfBinary:
Result := BaseToInt(FEditText, 2);
dfHex:
Result := BaseToInt(FEditText, 16);
dfOctal:
Result := BaseToInt(FEditText, 8);
else
Result := StrToCurrDef(FEditText, 0);
end;
end;
procedure TJvCustomValidateEdit.SetAsCurrency(NewValue: Currency);
begin
case FDisplayFormat of
dfAlphabetic, dfAlphaNumeric, dfCheckChars, dfCustom,
dfNonCheckChars, dfNone:
EditText := CurrToStr(NewValue);
dfBinary:
EditText := IntToBase(Trunc(NewValue), 2);
dfHex:
EditText := IntToBase(Trunc(NewValue), 16);
dfOctal:
EditText := IntToBase(Trunc(NewValue), 8);
dfCurrency, dfFloat, dfInteger, dfPercent, dfScientific, dfYear:
EditText := CurrToStr(CurrRangeValue(NewValue));
end;
end;
function TJvCustomValidateEdit.GetAsFloat: Double;
begin
case FDisplayFormat of
dfBinary:
Result := BaseToInt(FEditText, 2);
dfHex:
Result := BaseToInt(FEditText, 16);
dfOctal:
Result := BaseToInt(FEditText, 8);
dfScientific:
Result := ScientificStrToFloat(FEditText);
else
Result := StrToFloatDef(FEditText, 0);
end;
end;
procedure TJvCustomValidateEdit.SetAsFloat(NewValue: Double);
begin
case FDisplayFormat of
dfAlphabetic, dfAlphaNumeric, dfCheckChars, dfCustom,
dfNonCheckChars, dfNone:
EditText := FloatToStr(NewValue);
dfBinary:
EditText := IntToBase(Trunc(NewValue), 2);
dfHex:
EditText := IntToBase(Trunc(NewValue), 16);
dfOctal: EditText := IntToBase(Trunc(NewValue), 8);
dfInteger, dfYear:
EditText := IntToStr(IntRangeValue(Trunc(NewValue)));
dfCurrency, dfFloat, dfPercent:
EditText := FloatToStr(FloatRangeValue(NewValue));
dfScientific:
EditText := Format('%e', [FloatRangeValue(NewValue)]);
end;
end;
function TJvCustomValidateEdit.GetValue: Variant;
begin
case FDisplayFormat of
dfCurrency:
Result := StrToCurrDef(FEditText, 0);
dfFloat, dfPercent, dfScientific:
Result := StrToFloatDef(FEditText, 0);
dfInteger, dfYear:
Result := StrToIntDef(FEditText, 0);
else
Result := inherited Text;
end;
end;
procedure TJvCustomValidateEdit.SetValue(NewValue: Variant);
begin
case FDisplayFormat of
dfAlphabetic, dfAlphaNumeric, dfCheckChars, dfNonCheckChars, dfNone, dfCustom:
EditText := NewValue;
dfBinary, dfHex, dfInteger, dfOctal, dfYear:
SetAsInteger(NewValue);
dfCurrency, dfFloat, dfPercent, dfScientific:
SetAsFloat(NewValue);
end;
end;
procedure TJvCustomValidateEdit.SetCheckChars(const NewValue: string);
begin
if (FDisplayFormat in [dfNone, dfCheckChars, dfNonCheckChars]) and
(FCheckChars <> NewValue) then
begin
FCheckChars := NewValue;
EditText := MakeValid(FEditText);
end;
end;
procedure TJvCustomValidateEdit.KeyPress(var Key: Char);
begin
if not IsValidChar(Text, Key, SelStart) and (Key >= #32) then
Key := #0;
inherited KeyPress(Key);
end;
procedure TJvCustomValidateEdit.WMPaste(var Mesg: TMessage);
begin
inherited;
EditText := MakeValid(inherited Text);
end;
function TJvCustomValidateEdit.MakeValid(ParseString: string): string;
var
S: string;
I: Integer;
begin
S := '';
for I := 1 to Length(ParseString) do
if IsValidChar(Copy(ParseString, 1, I - 1), ParseString[I], I) then
S := S + ParseString[I];
Result := S;
end;
function TJvCustomValidateEdit.IsValidChar(const S: string;
Key: Char; Posn: Integer): Boolean;
var
iPosE: Integer;
begin
case FDisplayFormat of
dfBinary, dfCheckChars, dfHex, dfOctal, dfYear:
Result := Pos(Key, FCheckChars) > 0;
dfAlphabetic:
Result := IsCharAlpha(Key);
dfAlphaNumeric:
Result := IsCharAlphaNumeric(Key);
dfCustom:
Result := DoValidate(Key, S, Posn);
dfInteger:
Result := (Pos(Key, FCheckChars) > 0) or
((Key = '+') and (Pos('+', S) = 0)) or
((Key = '-') and (Pos('-', S) = 0));
dfFloat, dfCurrency, dfPercent:
Result := (Pos(Key, FCheckChars) > 0) or
((Key = DecimalSeparator) and (Pos(DecimalSeparator, S) = 0)) or
((Key = '+') and (Pos('+', S) = 0)) or
((Key = '-') and (Pos('-', S) = 0));
dfNonCheckChars:
Result := Pos(Key, FCheckChars) = 0;
dfNone:
Result := True;
dfScientific:
begin
Result := (Pos(Key, FCheckChars) > 0) or (Key in ['+', '-']);
if Result then
begin
iPosE := Pos('e', LowerCase(S));
if Key = DecimalSeparator then
begin
if iPosE = 0 then
Result := (Pos(DecimalSeparator, S) = 0)
else
Result := ((Posn < iPosE) and (Pos(DecimalSeparator, Copy(S, 1, iPosE - 1)) = 0)) or
((Posn > iPosE) and (Pos(DecimalSeparator, Copy(S, iPosE + 1, 99)) = 0));
end
else
if Key in ['E', 'e'] then
Result := (iPosE = 0) and (Posn > 1)
else
if Key = '+' then
Result := (Posn = 0) or (Posn = iPosE)
else
if Key = '-' then
Result := (Posn = 0) or (Posn = iPosE);
end;
end;
else
Result := False;
end;
end;
function TJvCustomValidateEdit.DoValidate(const Key: Char;
const AText: string; const Posn: Integer): Boolean;
begin
Result := True;
if Assigned(FOnCustomValidate) then
FOnCustomValidate(Self, Key, AText, Posn, Result);
end;
procedure TJvCustomValidateEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
// if Key = VK_DELETE then EditText := MakeValid(inherited Text);
if Key = VK_ESCAPE then
begin
Key := 0;
EditText := EnterText;
SelStart := 0;
SelLength := Length(FEditText);
end;
inherited KeyDown(Key, Shift);
end;
function TJvCustomValidateEdit.CurrRangeValue(CheckValue: Currency): Currency;
begin
Result := CheckValue;
if FHasMaxValue and (CheckValue > FMaxValue) then
Result := FMaxValue
else
if FHasMinValue and (CheckValue < FMinValue) then
Result := FMinValue;
end;
function TJvCustomValidateEdit.FloatRangeValue(CheckValue: Double): Double;
begin
Result := CheckValue;
if FHasMaxValue and (CheckValue > FMaxValue) then
Result := FMaxValue
else
if FHasMinValue and (CheckValue < FMinValue) then
Result := FMinValue;
end;
function TJvCustomValidateEdit.IntRangeValue(CheckValue: Integer): Integer;
begin
Result := CheckValue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -