cxmaskedit.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 2,607 行 · 第 1/5 页
PAS
2,607 行
I: Integer;
begin
CursorCorrection;
Result := True;
if FTail <> '' then
begin
for I := 1 to Length(FTail) do
begin
FRegExpr.Next(FTail[I]);
end;
FHead := FHead + FTail;
FTail := '';
end;
end;
function TcxMaskEditRegExprMode.PressHome: Boolean;
begin
CursorCorrection;
Result := True;
if FHead <> '' then
begin
FTail := FHead + FTail;
FHead := '';
FRegExpr.Reset;
end;
end;
function TcxMaskEditRegExprMode.GetEmptyString: string;
begin
Result := '';
end;
function TcxMaskEditRegExprMode.GetFormattedText(AText: string;
AMatchForBlanksAndLiterals: Boolean = True): string;
var
I: Integer;
begin
if not FRegExpr.IsCompiled then
begin
Result := '';
Exit;
end;
FRegExpr.Reset;
Result := '';
for I := 1 to Length(AText) do
begin
if FRegExpr.Next(AText[I]) then
Result := Result + AText[I];
end;
end;
procedure TcxMaskEditRegExprMode.GotoEnd;
var
I: Integer;
begin
CursorCorrection;
if FTail = '' then
Exit;
for I := 1 to Length(FTail) do
begin
FRegExpr.Next(FTail[I]);
end;
FHead := FHead + FTail;
FTail := '';
end;
function TcxMaskEditRegExprMode.IsCursorBegin: Boolean;
begin
Result := FEdit.SelStart = 0;
end;
function TcxMaskEditRegExprMode.IsCursorEnd: Boolean;
begin
Result := FEdit.SelStart = Length(FEdit.Text);
end;
function TcxMaskEditRegExprMode.IsFullValidText(AText: string): Boolean;
var
ARegExpr: TcxRegExpr;
I: Integer;
begin
Result := AText = '';
if not Result then
begin
ARegExpr := TcxRegExpr.Create;
ARegExpr.CaseInsensitive := Properties.CaseInsensitive;
Result := CompileRegExpr(ARegExpr);
if Result then
begin
for I := 1 to Length(AText) do
begin
if not ARegExpr.Next(AText[I]) then
begin
Result := False;
Break;
end;
end;
if Result then
if not Properties.IgnoreMaskBlank then
Result := ARegExpr.IsFinal;
end;
ARegExpr.Free;
end;
end;
procedure TcxMaskEditRegExprMode.LMouseDown;
begin
FMouseAction := True;
end;
procedure TcxMaskEditRegExprMode.PrePasteFromClipboard;
begin
end;
function TcxMaskEditRegExprMode.PressBackSpace: Boolean;
begin
CursorCorrection;
if FEdit.SelLength <= 0 then
begin
if FHead <> '' then
begin
FRegExpr.Prev;
if NextTail then
Delete(FHead, Length(FHead), 1)
else
ClearTail;
end;
Result := True;
end
else
begin
DeleteSelection;
if NextTail then
Result := True
else
begin
FEdit.SendMyKeyPress(#8);
ClearTail;
Result := False;
end;
end;
FSelect := '';
if not Result then
BeepOnError;
end;
function TcxMaskEditRegExprMode.PressLeft: Boolean;
var
I: Integer;
begin
CursorCorrection;
Result := True;
if FHead <> '' then
begin
if FEdit.SelLength > 0 then
begin
if (FEdit.CursorPos = FEdit.SelStart + FEdit.SelLength) and
not FEdit.FShiftOn then
begin
for I := 0 to FEdit.SelLength - 1 do
begin
FRegExpr.Prev;
FTail := FHead[Length(FHead)] + FTail;
Delete(FHead, Length(FHead), 1);
end;
Exit;
end
else if (FEdit.CursorPos = FEdit.SelStart) and not FEdit.FShiftOn then
Exit;
end;
FRegExpr.Prev;
FTail := FHead[Length(FHead)] + FTail;
Delete(FHead, Length(FHead), 1);
end;
end;
function TcxMaskEditRegExprMode.PressRight: Boolean;
procedure GetTailFirstChar;
begin
FRegExpr.Next(FTail[1]);
FHead := FHead + FTail[1];
Delete(FTail, 1, 1);
end;
var
I: Integer;
begin
CursorCorrection;
Result := True;
if FTail <> '' then
begin
if FEdit.SelLength > 0 then
begin
if (FEdit.CursorPos = FEdit.SelStart) and
not FEdit.FShiftOn then
begin
for I := 0 to FEdit.SelLength - 1 do
GetTailFirstChar;
Exit;
end
else if (FEdit.CursorPos = FEdit.SelStart + FEdit.SelLength) and
not FEdit.FShiftOn then
Exit;
end;
GetTailFirstChar;
end;
end;
function TcxMaskEditRegExprMode.PressSymbol(var ASymbol: Char): Boolean;
begin
CursorCorrection;
if FEdit.SelLength > 0 then
DeleteSelection;
if FRegExpr.Next(ASymbol) then
begin
FHead := FHead + ASymbol;
if not NextTail then
begin
if FSelect <> '' then
begin
FEdit.SendMyKeyDown(VK_DELETE, []);
FEdit.SendMyKeyPress(ASymbol);
Result := False;
end
else
Result := True;
ClearTail;
end
else
Result := True;
end
else
begin
RestoreSelection;
Result := False;
end;
FSelect := '';
if not Result then
BeepOnError;
end;
procedure TcxMaskEditRegExprMode.SetText(AText: string);
var
I: Integer;
begin
FRegExpr.Reset;
if (ClipboardTextLength > 0) and (Length(AText) > 0) then
begin
FRegExpr.Reset;
for I := 1 to FEdit.SelStart + ClipboardTextLength do
begin
FRegExpr.Next(AText[I]);
end;
FHead := Copy(AText, 1, FEdit.SelStart + ClipboardTextLength);
FTail := Copy(AText, FEdit.SelStart + ClipboardTextLength + 1, Length(AText));
ClipboardTextLength := 0;
end
else
begin
FHead := '';
FTail := AText;
end;
end;
procedure TcxMaskEditRegExprMode.SetRegExprCaseInsensitive;
begin
FRegExpr.CaseInsensitive := Properties.CaseInsensitive;
end;
procedure TcxMaskEditRegExprMode.UpdateEditValue;
begin
end;
function TcxMaskEditRegExprMode.GetUpdatedText(const AText: string;
AMatchForBlanksAndLiterals: Boolean = True): string;
begin
Result := AText;
end;
procedure TcxMaskEditRegExprMode.ClearTail;
var
AStr: string;
begin
AStr := FEdit.DataBinding.DisplayValue;
Delete(AStr, FEdit.SelStart + 1, Length(FTail));
FEdit.DataBinding.DisplayValue := AStr;
FEdit.DirectSetSelStart(Length(AStr));
FTail := '';
end;
function TcxMaskEditRegExprMode.CompileRegExpr(
ARegExpr: TcxRegExpr): Boolean;
begin
if FRegExpr.Stream = nil then
begin
Result := False;
Exit;
end;
Result := True;
try
ARegExpr.Compile(FRegExpr.Stream);
except
on EcxMaskEditError do
Result := False;
end;
end;
procedure TcxMaskEditRegExprMode.CursorCorrection;
var
I: Integer;
ASymbol: Char;
begin
if ((FHead = '') and (FTail = '') and (FEdit.Text <> '')) or FMouseAction then
begin
FMouseAction := False;
FRegExpr.Reset;
FTail := FEdit.Text;
FHead := '';
for I := 0 to FEdit.CursorPos - 1 do
begin
if Length(FEdit.Text) > I then
begin
ASymbol := Char(FEdit.Text[I + 1]);
FRegExpr.Next(ASymbol);
FHead := FHead + FTail[1];
Delete(FTail, 1, 1);
end;
end;
end;
end;
procedure TcxMaskEditRegExprMode.DeleteSelection;
var
I: Integer;
begin
if FEdit.SelStart = Length(FHead) then // Begin cursor
begin
FSelect := Copy(FTail, 1, FEdit.SelLength);
Delete(FTail, 1, FEdit.SelLength);
FBeginCursor := True;
end
else if (FEdit.SelStart + FEdit.SelLength) = Length(FHead) then // End cursor
begin
FSelect := Copy(FHead, FEdit.SelStart + 1, FEdit.SelLength);
Delete(FHead, FEdit.SelStart + 1, FEdit.SelLength);
for I := 1 to Length(FSelect) do
FRegExpr.Prev;
FBeginCursor := False;
end;
end;
function TcxMaskEditRegExprMode.GetMaskKind: TcxEditMaskKind;
begin
Result := emkRegExpr;
end;
function TcxMaskEditRegExprMode.NextTail: Boolean;
var
AIsCharValid: Boolean;
I, J, NextNumber: Integer;
begin
NextNumber := 0;
for I := 1 to Length(FTail) do
begin
AIsCharValid := FRegExpr.Next(FTail[I]);
if AIsCharValid then
Inc(NextNumber)
else
begin
for J := 0 to NextNumber - 1 do
FRegExpr.Prev;
Result := False;
Exit;
end;
end;
for I := 1 to Length(FTail) do
FRegExpr.Prev;
Result := True;
end;
procedure TcxMaskEditRegExprMode.RestoreSelection;
var
I: Integer;
begin
if FBeginCursor then
FTail := FSelect + FTail
else
begin
FHead := FHead + FSelect;
for I := 1 to Length(FSelect) do
begin
FRegExpr.Next(FSelect[I]);
end;
end;
end;
procedure TcxMaskEditRegExprMode.SynchronizeEditValue;
begin
inherited SynchronizeEditValue;
FEdit.SelStart := Length(FEdit.Text);
FHead := FEdit.Text;
FTail := '';
FRegExpr.Reset;
FRegExpr.NextEx(FHead);
end;
{ TcxMaskEditRegExprExMode }
constructor TcxMaskEditRegExprExMode.Create(AEdit: TcxCustomMaskEdit;
AProperties: TcxCustomMaskEditProperties);
begin
inherited Create(AEdit, AProperties);
FRegExpr.OnSymbolUpdate := SymbolUpdate;
FRegExpr.OnSymbolDelete := SymbolDelete;
FRegExpr.UpdateOn := True;
FNewCursorPos := -1;
Clear;
end;
destructor TcxMaskEditRegExprExMode.Destroy;
begin
inherited Destroy;
end;
procedure TcxMaskEditRegExprExMode.Clear;
begin
FUpdate := '';
FDeleteNumber := 0;
end;
procedure TcxMaskEditRegExprExMode.RestoreSelection;
begin
FRegExpr.UpdateOn := False;
inherited RestoreSelection;
FRegExpr.UpdateOn := True;
if FUpdate <> '' then
begin
FRegExpr.Prev;
Clear;
end;
end;
procedure TcxMaskEditRegExprExMode.SymbolDelete;
begin
Inc(FDeleteNumber);
end;
procedure TcxMaskEditRegExprExMode.SymbolUpdate(ASymbol: Char);
begin
FUpdate := FUpdate + ASymbol;
end;
procedure TcxMaskEditRegExprExMode.AfterPasteFromClipboard;
begin
if FNewCursorPos < 0 then
Exit;
FEdit.DirectSetSelStart(FNewCursorPos);
FNewCursorPos := -1;
end;
procedure TcxMaskEditRegExprExMode.Compile(AMask: string);
var
I: Integer;
AStream: TStringStream;
AStr: string;
begin
Clear;
FEditMask := AMask;
if Properties.EmptyMask(AMask) then
Exit;
AStream := TStringStream.Create(AMask);
try
try
FRegExpr.Compile(AStream);
except
on E: EcxRegExprError do
begin
AStr := cxGetResourceString(@scxMaskEditRegExprError);
for I := 0 to E.Errors.Count - 1 do
AStr := AStr + #13#10 + E.Errors[I].FullMessage;
raise EcxMaskEditError.Create(AStr);
end;
end;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?