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