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 + -
显示快捷键?