cxtextedit.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,593 行 · 第 1/5 页

PAS
1,593
字号
    property OnEditing;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
  end;

  { TcxFilterTextEditHelper }

  TcxFilterTextEditHelper = class(TcxCustomFilterEditHelper)
  public
    class function GetFilterEditClass: TcxCustomEditClass; override;
    class procedure InitializeProperties(AProperties,
      AEditProperties: TcxCustomEditProperties; AHasButtons: Boolean); override;
    class procedure SetFilterValue(AEdit: TcxCustomEdit; AEditProperties: TcxCustomEditProperties;
      AValue: Variant); override;
  end;

procedure CheckCharsRegister(var AText: string; ACharCase: TEditCharCase);
function CheckTextEditState(ATextEdit: IcxInnerTextEdit; const APrevState:
  TcxCustomInnerTextEditPrevState): Boolean;
procedure DrawEditText(ACanvas: TcxCanvas; AViewInfo: TcxCustomTextEditViewInfo);
procedure DrawTextEdit(ACanvas: TcxCanvas; AViewInfo: TcxCustomTextEditViewInfo);
function GetTextEditContentSize(ACanvas: TcxCanvas; AViewData: TcxCustomEditViewData;
  const AText: string;  ADrawTextFlags: DWORD; const AEditSizeProperties: TcxEditSizeProperties;
  ALineCount: Integer = 0; ACorrectWidth: Boolean = True): TSize;
function GetTextEditDrawTextOffset(AViewData: TcxCustomEditViewData): TRect; overload;
function GetTextEditDrawTextOffset(AAlignment: TAlignment; AIsInplace: Boolean): TRect; overload; // deprecated
procedure InternalTextOut(ACanvas: TCanvas; AViewInfo: TcxCustomTextEditViewInfo;
  AText: PcxCaptionChar; var R: TRect; AFormat: TcxTextOutFormat; ASelStart,
  ASelLength: Integer; ASelBackgroundColor, ASelTextColor: TColor;
  AMaxLineCount: Integer = 0; ALeftIndent: Integer = 0; ARightIndent: Integer = 0);
procedure InsertThousandSeparator(var S: string);
function RemoveExponentialPart(var S: string): string;
procedure RemoveThousandSeparator(var S: string);
procedure SaveTextEditState(ATextEdit: IcxInnerTextEdit;
  ASaveText: Boolean;
  var APrevState: TcxCustomInnerTextEditPrevState);
procedure SeparateDigitGroups(AEdit: TcxCustomTextEdit);

implementation

uses
{$IFDEF DELPHI6}
  FMTBcd,
{$ENDIF}
  cxEditConsts, cxEditUtils, dxThemeConsts, dxThemeManager, cxDWMApi;

type
  TCanvasAccess = class(TCanvas);
  TControlAccess = class(TControl);
  TWinControlAccess = class(TWinControl);
  //TcxEditDataBindingAccess = class(TcxEditDataBinding)

const
  WM_REDRAWMISSPELLS: Cardinal = WM_DX + 100;

procedure CalculateTextEditViewInfo(ACanvas: TcxCanvas; AViewData: TcxCustomTextEditViewData;
  AViewInfo: TcxCustomTextEditViewInfo; AIsMouseEvent: Boolean);
begin
  with AViewInfo do
  begin
    TextRect := ClientRect;
    ExtendRect(TextRect, AViewData.GetDrawTextOffset);
    if not IsInplace and (TextRect.Bottom - TextRect.Top < ACanvas.TextHeight('Zg')) then
    begin
      TextRect.Bottom := ACanvas.TextHeight('Zg') + TextRect.Top;
      if TextRect.Bottom > ClientRect.Bottom then
        TextRect.Bottom := ClientRect.Bottom;
    end;
  end;
end;

procedure CheckCharsRegister(var AText: string; ACharCase: TEditCharCase);
begin
  if ACharCase = ecUpperCase then
    AText := AnsiUpperCase(AText)
  else
    if ACharCase = ecLowerCase then
      AText := AnsiLowerCase(AText);
end;

function CheckTextEditState(ATextEdit: IcxInnerTextEdit; const APrevState:
  TcxCustomInnerTextEditPrevState): Boolean;
begin
  if not ATextEdit.Control.HandleAllocated then
    Result := True
  else
    with APrevState do
      Result := (PrevSelStart <> ATextEdit.SelStart) or
        (PrevSelLength <> ATextEdit.SelLength) or
        IsPrevTextSaved and not InternalCompareString(PrevText, ATextEdit.EditValue, False);
end;

procedure DrawEditText(ACanvas: TcxCanvas; AViewInfo: TcxCustomTextEditViewInfo);
var
  AText: PcxCaptionChar;
  ATextColor: TColor;
  R: TRect;
begin
  with AViewInfo do
  begin
    AText := PcxCaptionChar(Text);
{$IFNDEF NOFLICKER}
    if StrLen(AText) = 0 then
      Exit;
{$ENDIF}

    R := TextRect;
    if DrawSelectionBar then
      ATextColor := clHighlightText
    else
      ATextColor := TextColor;
    ACanvas.Font := Font;
    ACanvas.Font.Color := ATextColor;
    PrepareCanvasFont(ACanvas.Canvas);
    InternalTextOut(ACanvas.Canvas, AViewInfo, AText, R, DrawTextFlags,
      SelStart, SelLength, SelBackgroundColor, SelTextColor, MaxLineCount);
  end;
end;

procedure DrawTextEdit(ACanvas: TcxCanvas; AViewInfo: TcxCustomTextEditViewInfo);

  function GetBackgroundPaintingStyle: TcxEditBackgroundPaintingStyle;
  begin
    with AViewInfo do
      if ComboBoxStyle then
        if EditingStyle in [esFixedList, esNoEdit] then
          Result := bpsComboListEdit
        else
          Result := bpsComboEdit
      else
        Result := bpsSolid;
  end;

  procedure InternalDrawFocusRect(R: TRect);
  begin
    with AViewInfo, ACanvas do
      if not IsEditClass and Focused and not IsInplace and not HasPopupWindow then
      begin
        if DrawSelectionBar then
        begin
          Canvas.Font.Color := clHighlightText;
          Canvas.Brush.Color := clHighlight;
        end else
        begin
          Canvas.Font.Color := clBtnText;
          Canvas.Brush.Color := AViewInfo.BackgroundColor;
        end;
        TCanvasAccess(Canvas).RequiredState([csFontValid]);
        Canvas.DrawFocusRect(R);
      end;
  end;

var
  ARealTransparent: Boolean;
  R: TRect;
begin
  with AViewInfo, ACanvas do
  begin
    ARealTransparent := Transparent or DrawSelectionBar;
    DrawCustomEdit(ACanvas, AViewInfo, not ARealTransparent, GetBackgroundPaintingStyle);
    R := ClientRect;
    if not IsInplace then
    begin
      if ((NativeState = TC_NONE) or DrawSelectionBar) and not Transparent and
        (AViewInfo.EditingStyle <> esNoEdit) then
          FrameRect(R, BackgroundColor);
      InflateRect(R, -1, -1);
    end;
    if IsOwnerDrawing then
      CustomDrawHandler(ACanvas, R)
    else
    begin
      if DrawSelectionBar then
      begin
        Brush.Color := clHighlight;
        FillRect(R);
      end;
      if IsDBEditPaintCopyDrawing or not HasInnerEdit or not IsEditClass then
        AViewInfo.DrawText(ACanvas);
    end;
    InternalDrawFocusRect(R);
  end;
end;

function GetTextEditContentSize(ACanvas: TcxCanvas; AViewData: TcxCustomEditViewData;
  const AText: string; ADrawTextFlags: DWORD; const AEditSizeProperties: TcxEditSizeProperties;
  ALineCount: Integer = 0; ACorrectWidth: Boolean = True): TSize;

  function GetAutoHeightSize: TSize;
  var
    AAlignment: TcxEditAlignment;
    AFlags: DWORD;
    ARowCount: Integer;
    ATextParams: TcxTextParams;
    ATextRows: TcxTextRows;
    ASizeCorrection: TSize;
    AWidth: Integer;
    R: TRect;
  begin
    AAlignment := nil;
    if not AViewData.IsInplace and (AViewData is TcxCustomTextEditViewData) then
      with TcxCustomTextEditProperties(AViewData.Properties) do
        if (EditingStyle in [esFixedList, esNoEdit]) and
          not (not AViewData.IsInplace and TcxCustomTextEditViewData(AViewData).IsComboBoxStyle and
            AreVisualStylesMustBeUsed(AViewData.Style.LookAndFeel.NativeStyle, totEdit)) then
              AAlignment := Alignment;
    ACanvas.Font := AViewData.Style.GetVisibleFont;
    AFlags := ADrawTextFlags;
    ASizeCorrection := AViewData.GetEditContentSizeCorrection;
    AWidth := AEditSizeProperties.Width;

    if ALineCount > 0 then
    begin
      Result.cy := ACanvas.TextHeight('Zg') * ALineCount;
      Result.cx := AEditSizeProperties.Width;
    end
    else
    begin
      if AViewData.IsInplace then
        Dec(AWidth, 2);
      if AAlignment <> nil then
        Dec(AWidth);
      if AWidth <= 0 then
      begin
        Result.cx := 0;
        if (epoAllowZeroHeight in AViewData.PaintOptions) and (Length(AText) = 0) then
          Result.cy := 0
        else
          Result.cy := ACanvas.TextHeight('Zg');
      end
      else
      begin
        Result.cx := AEditSizeProperties.Width;
        if Length(AText) = 0 then
          if epoAllowZeroHeight in AViewData.PaintOptions then
            Result.cy := 0
          else
            Result.cy := ACanvas.TextHeight('Zg')
        else
        begin
          AFlags := AFlags or CXTO_CALCROWCOUNT;
          if AFlags and CXTO_SINGLELINE <> 0 then
            AFlags := AFlags and not CXTO_SINGLELINE or CXTO_WORDBREAK or
              CXTO_EDITCONTROL;
          AFlags := AFlags and not(CXTO_CENTER_VERTICALLY or CXTO_BOTTOM) or CXTO_TOP;
          R := Rect(0, 0, AWidth, MaxInt);
          ATextParams := cxCalcTextParams(ACanvas.Canvas, AFlags);
          ATextRows := nil;
          cxMakeTextRows(ACanvas.Canvas, PcxCaptionChar(AText), R, ATextParams, ATextRows, ARowCount, AEditSizeProperties.MaxLineCount);
          if (AEditSizeProperties.MaxLineCount > 0) and (ARowCount > AEditSizeProperties.MaxLineCount) then
            ARowCount := AEditSizeProperties.MaxLineCount;
          Result.cy := ARowCount * ACanvas.TextHeight('Zg');
          ATextRows := nil;
        end;
      end;
    end;
    if Result.cy > 0 then
      Result.cy := Result.cy + ASizeCorrection.cy;
  end;

  function GetBestFitSize: TSize;
  var
    AAlignment: TcxEditAlignment;
    AFlags: DWORD;
    ARowCount: Integer;
    ATextParams: TcxTextParams;
    ATextRows: TcxTextRows;
    ATextFlags: Integer;
    ASizeCorrection: TSize;
    R: TRect;
  begin
    AAlignment := nil;
    if not AViewData.IsInplace and (AViewData is TcxCustomTextEditViewData) then
      with TcxCustomTextEditProperties(AViewData.Properties) do
        if (EditingStyle in [esFixedList, esNoEdit]) and
          not (not AViewData.IsInplace and TcxCustomTextEditViewData(AViewData).IsComboBoxStyle and
            AreVisualStylesMustBeUsed(AViewData.Style.LookAndFeel.NativeStyle, totEdit)) then
              AAlignment := Alignment;
    ACanvas.Font := AViewData.Style.GetVisibleFont;
    AFlags := ADrawTextFlags;
    ASizeCorrection := AViewData.GetEditContentSizeCorrection;

    if (AFlags and CXTO_SINGLELINE <> 0) and not ((epoAutoHeight in AViewData.PaintOptions) and
      (esoAutoHeight in AViewData.Properties.GetSupportedOperations)) then
    begin
      ATextFlags := cxTextOutFlagsToDrawTextFlags(AFlags);
      Result.cy := ACanvas.TextHeight('Zg');
      R := Rect(0, 0, MaxInt, 0);
      if Length(AText) = 0 then
        Result.cx := 0
      else
      begin
        ACanvas.TextExtent(AText, R, ATextFlags);
        Result.cx := R.Right - R.Left;
      end;
    end
    else
    begin
      if AFlags and CXTO_SINGLELINE <> 0 then
        AFlags := AFlags and not CXTO_SINGLELINE or
          CXTO_WORDBREAK or CXTO_EDITCONTROL;
      AFlags := AFlags or CXTO_CALCRECT;
      R := Rect(0, 0, MaxInt, MaxInt);

      ATextParams := cxCalcTextParams(ACanvas.Canvas, AFlags);
      ATextRows := nil;
      cxMakeTextRows(ACanvas.Canvas, PcxCaptionChar(AText), R, ATextParams, ATextRows, ARowCount);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?