📄 jvqtooledit.pas
字号:
var
GDateImageIndex: TImageIndex = -1;
GDefaultComboEditImagesList: TImageList = nil;
GDirImageIndex: TImageIndex = -1;
GFileImageIndex: TImageIndex = -1;
//=== Local procedures =======================================================
function ClipFilename(const FileName: string): string;
var
Params: string;
begin
if FileExists(FileName) then
Result := FileName
else
if DirectoryExists(FileName) then
Result := IncludeTrailingPathDelimiter(FileName)
else
SplitCommandLine(FileName, Result, Params);
end;
function ExtFilename(const FileName: string): string;
begin
if (Pos(' ', FileName) > 0) and (FileName[1] <> '"') then
Result := Format('"%s"', [FileName])
else
Result := FileName;
end;
function NvlDate(DateValue, DefaultValue: TDateTime): TDateTime;
begin
if DateValue = NullDate then
Result := DefaultValue
else
Result := DateValue;
end;
procedure DrawSelectedText(Canvas: TCanvas; const R: TRect; X, Y: Integer;
const Text: WideString; SelStart, SelLength: Integer;
HighlightColor, HighlightTextColor: TColor);
var
W, H, Width: Integer;
S: WideString;
SelectionRect: TRect;
Brush: TBrushRecall;
PenMode: TPenMode;
FontColor: TColor;
begin
W := R.Right - R.Left;
H := R.Bottom - R.Top;
if (W <= 0) or (H <= 0) then
Exit;
S := Copy(Text, 1, SelStart);
if S <> '' then
begin
Canvas.TextRect(R, X, Y, S);
Inc(X, Canvas.TextWidth(S));
end;
S := Copy(Text, SelStart + 1, SelLength);
if S <> '' then
begin
Width := Canvas.TextWidth(S);
Brush := TBrushRecall.Create(Canvas.Brush);
PenMode := Canvas.Pen.Mode;
try
SelectionRect := Rect(Max(X, R.Left), R.Top,
Min(X + Width, R.Right), R.Bottom);
Canvas.Pen.Mode := pmCopy;
Canvas.Brush.Color := HighlightColor;
Canvas.FillRect(SelectionRect);
FontColor := Canvas.Font.Color;
Canvas.Font.Color := HighlightTextColor;
Canvas.TextRect(R, X, Y, S);
Canvas.Font.Color := FontColor;
finally
Canvas.Pen.Mode := PenMode;
Brush.Free;
end;
Inc(X, Width);
end;
S := Copy(Text, SelStart + SelLength + 1, MaxInt);
if S <> '' then
Canvas.TextRect(R, X, Y, S);
end;
function ParentFormVisible(AControl: TControl): Boolean;
var
Form: TCustomForm;
begin
Form := GetParentForm(AControl);
Result := Assigned(Form) and Form.Visible;
end;
//=== Global procedures ======================================================
procedure DateFormatChanged;
var
I: Integer;
procedure IterateControls(AControl: TWinControl);
var
I: Integer;
begin
with AControl do
for I := 0 to ControlCount - 1 do
begin
if Controls[I] is TJvCustomDateEdit then
TJvCustomDateEdit(Controls[I]).UpdateMask
else
if Controls[I] is TWinControl then
IterateControls(TWinControl(Controls[I]));
end;
end;
begin
if Screen <> nil then
for I := 0 to Screen.FormCount - 1 do
IterateControls(Screen.Forms[I]);
end;
function EditorTextMargins(Editor: TCustomEdit): TPoint;
var
I: Integer;
ed: TCustomEditAccessProtected;
begin
ed := TCustomEditAccessProtected(Editor);
if ed.BorderStyle = bsNone then
I := 0
else
if Supports(Editor, IComboEditHelper) then
begin
if (Editor as IComboEditHelper).GetFlat then
I := 1
else
I := 2;
end
else
I := 2;
{if GetWindowLong(ed.Handle, GWL_STYLE) and ES_MULTILINE = 0 then
Result.X := (SendMessage(ed.Handle, EM_GETMARGINS, 0, 0) and $0000FFFF) + I
else}
Result.X := I;
Result.Y := I;
end;
function IsInWordArray(Value: Word; const A: array of Word): Boolean;
var
I: Integer;
begin
Result := True;
for I := 0 to High(A) do
if A[I] = Value then
Exit;
Result := False;
end;
function LoadDefaultBitmap(Bmp: TBitmap; Item: Integer): Boolean;
begin
Result := True;
case Item of
OBM_COMBO:
begin
Bmp.Width := QStyle_sliderLength(Application.Style.Handle);
Bmp.Height := Bmp.Width;
Bmp.Canvas.Start;
DrawFrameControl(Bmp.Canvas.Handle, Rect(0, 0, Bmp.Width, Bmp.Height),
DFC_SCROLL, DFCS_SCROLLDOWN or DFCS_FLAT);
Bmp.Canvas.Stop;
end;
else
Bmp.Width := 0;
Bmp.Height := 0;
Result := False;
end;
end;
function PaintComboEdit(Editor: TJvCustomComboEdit; const AText: string;
AAlignment: TAlignment; StandardPaint: Boolean; Flat: Boolean;
ACanvas: TCanvas): Boolean;
begin
if not (csDestroying in Editor.ComponentState) then
begin
Result := PaintEdit(Editor, AText, AAlignment, Editor.PopupVisible,
Editor.FDisabledTextColor, StandardPaint, Flat, ACanvas);
end
else
Result := True;
end;
{ PaintEdit (CLX) needs an implemented EM_GETRECT message handler. If no
EM_GETTEXT handler exists or the edit control does not implement
IComboEditHelper, it uses the ClientRect of the edit control. }
function PaintEdit(Editor: TCustomEdit; const AText: WideString;
AAlignment: TAlignment; PopupVisible: Boolean;
DisabledTextColor: TColor; StandardPaint: Boolean; Flat: Boolean;
ACanvas: TCanvas): Boolean;
var
LTextWidth, X: Integer;
EditRect: TRect;
S: WideString;
ed: TCustomEditAccessProtected;
SavedFont: TFontRecall;
SavedBrush: TBrushRecall;
Offset: Integer;
R: TRect;
EditHelperIntf: IComboEditHelper;
begin
Result := True;
if csDestroying in Editor.ComponentState then
Exit;
ed := TCustomEditAccessProtected(Editor);
if StandardPaint and not (csPaintCopy in ed.ControlState) then
begin
Result := False;
{ return false if we need to use standard paint handler }
Exit;
end;
SavedFont := TFontRecall.Create(ACanvas.Font);
SavedBrush := TBrushRecall.Create(ACanvas.Brush);
try
ACanvas.Font := ed.Font;
// paint Border
R := ed.ClientRect;
Offset := 0;
if (ed.BorderStyle = bsSingle) then
begin
ACanvas.Start;
QStyle_drawPanel(QWidget_style(Editor.Handle), ACanvas.Handle,
R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top, QWidget_colorGroup(Editor.Handle),
True, 2, nil);
ACanvas.Stop;
//QGraphics.DrawEdge(ACanvas, R, esLowered, esLowered, ebRect)
end
else
begin
if Flat then
QGraphics.DrawEdge(ACanvas, R, esNone, esLowered, ebRect);
Offset := 2;
end;
with ACanvas do
begin
if Supports(Editor, IComboEditHelper, EditHelperIntf) then
begin
EditRect := EditHelperIntf.GetEditorRect;
EditHelperIntf := nil;
end
else
begin
EditRect := Rect(0, 0, 0, 0);
SendMessage(Editor.Handle, EM_GETRECT, 0, Integer(@EditRect));
end;
if IsRectEmpty(EditRect) then
begin
EditRect := ed.ClientRect;
if ed.BorderStyle = bsSingle then
InflateRect(EditRect, -2, -2);
end
else
InflateRect(EditRect, -Offset, -Offset);
if Flat and (ed.BorderStyle = bsSingle) then
begin
Brush.Color := clWindowFrame;
FrameRect(ACanvas, ed.ClientRect);
end;
S := AText;
LTextWidth := TextWidth(S);
if PopupVisible then
X := EditRect.Left
else
begin
case AAlignment of
taLeftJustify:
X := EditRect.Left;
taRightJustify:
X := EditRect.Right - LTextWidth;
else
X := (EditRect.Right + EditRect.Left - LTextWidth) div 2;
end;
end;
if not ed.Enabled then
begin
(*
if Supports(ed, IJvWinControlEvents) then
(ed as IJvWinControlEvents).DoPaintBackGround(ACanvas, 0);
*)
ACanvas.Brush.Style := bsClear;
ACanvas.Font.Color := DisabledTextColor;
ACanvas.TextRect(EditRect, X, EditRect.Top + 1, S);
end
else
begin
Brush.Color := ed.Color;
DrawSelectedText(ACanvas, EditRect, X, EditRect.Top + 1, S,
ed.SelStart, ed.SelLength,
clHighlight, clHighlightText);
end;
end;
finally
SavedFont.Free;
SavedBrush.Free;
end;
end;
//=== { TJvCustomComboEdit } =================================================
constructor TJvCustomComboEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csCaptureMouse];
// AutoSize := False; // Polaris
Height := 21;
FDirectInput := True;
FClickKey := scAltDown;
FPopupAlign := epaRight;
FBtnControl := TWinControl.Create(Self);
with FBtnControl do
ControlStyle := ControlStyle + [csReplicatable];
FBtnControl.Width := DefEditBtnWidth;
FBtnControl.Height := 17;
FBtnControl.Visible := True;
FBtnControl.Parent := Self.ClientArea;
FBtnControl.Left := Self.ClientArea.Width - DefEditBtnWidth;
FBtnControl.Anchors := [akRight, akTop, akBottom];
FButton := TJvEditButton.Create(Self);
FButton.SetBounds(0, 0, FBtnControl.Width, FBtnControl.Height);
FButton.Visible := True;
FButton.Parent := FBtnControl;
FButton.Align := alClient;
TJvEditButton(FButton).OnClick := EditButtonClick;
FAlwaysEnableButton := False;
(* ++ RDB ++ *)
FDisabledColor := clWindow;
FDisabledTextColor := clGrayText;
FGroupIndex := -1;
FStreamedButtonWidth := -1;
FImageKind := ikCustom;
FImageIndex := -1;
FNumGlyphs := 1;
inherited OnKeyDown := LocalKeyDown;
(* -- RDB -- *)
end;
destructor TJvCustomComboEdit.Destroy;
begin
PopupCloseUp(Self, False);
FButton.OnClick := nil;
inherited Destroy;
end;
function TJvCustomComboEdit.AcceptPopup(var Value: Variant): Boolean;
begin
Result := True;
end;
procedure TJvCustomComboEdit.AcceptValue(const Value: Variant);
begin
if Text <> VarToStr(Value) then
begin
Text := Value;
Modified := True;
UpdatePopupVisible;
DoChange;
end;
end;
procedure TJvCustomComboEdit.ActionChange(Sender: TObject;
CheckDefaults: Boolean);
begin
if Sender is TCustomAction then
with TCustomAction(Sender) do
begin
if not CheckDefaults or not Assigned(Self.Images) then
Self.Images := ActionList.Images;
if not CheckDefaults or Self.Enabled then
Self.Enabled := Enabled;
if not CheckDefaults or (Self.HelpContext = 0) then
Self.HelpContext := HelpContext;
if not CheckDefaults or (Self.Hint = '') then
Self.ButtonHint := Hint;
if not CheckDefaults or (Self.ImageIndex = -1) then
Self.ImageIndex := ImageIndex;
if not CheckDefaults or (Self.ClickKey = scNone) then
Self.ClickKey := ShortCut;
if not CheckDefaults or Self.Visible then
Self.Visible := Visible;
if not CheckDefaults or not Assigned(Self.OnButtonClick) then
Self.OnButtonClick := OnExecute;
end;
end;
procedure TJvCustomComboEdit.AdjustHeight;
var
DC: HDC;
SaveFont: HFONT;
I: Integer;
SysMetrics, Metrics: TTextMetric;
begin
DC := GetDC(0);
GetTextMetrics(DC, SysMetrics);
SaveFont := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);
if NewStyleControls then
begin
if not Flat then
I := 8
else
I := 6;
I := GetSystemMetrics(SM_CYBORDER) * I;
end
else
begin
I := SysMetrics.tmHeight;
if I > Metrics.tmHeight then
I := Metrics.tmHeight;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -