📄 qcomboedits.pas
字号:
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: QComboEdits.pas, released on 2004-01-19
The Initial Developer of the Original Code is Andreas Hausladen
[Andreas dott Hausladen att gmx dott de]
Copyright (C) 2004 Andreas Hausladen
All Rights Reserved.
Contributor(s):
The TCustomComboEdit and TCustomComboMaskEdit controls allow the usage of an
edit rect and other client controls.
Usage:
If you want to add a client control set the client control's parent to the
ClientArea property.
Known Issues:
----------------------------------------------------------------------------}
// $Id: QComboEdits.pas,v 1.5 2005/02/13 15:10:51 ahuser Exp $
unit QComboEdits;
interface
uses
SysUtils, Classes,
QGraphics, QControls, QStdCtrls, QExtCtrls, QForms, QMask,
Qt, QWindows;
const
EM_GETRECT = $00B2; { 178 }
EM_SETRECT = $00B3; { 179 }
type
TComboEditBorder = class(TPanel)
private
FEdit: TCustomEdit;
protected
procedure BoundsChanged; override;
procedure AdjustClientRect(var Rect: TRect); override;
procedure Paint; override;
end;
TComboEditClientArea = class(TWidgetControl)
private
FEdit: TCustomEdit;
protected
procedure Click; override;
end;
IComboEditHelper = interface
['{1E70ED8C-5F1F-4693-BE86-EFEA7386332E}']
function GetEditorRect: TRect;
procedure SetEditorRect(Value: PRect);
function GetClientArea: TComboEditClientArea;
function GetFlat: Boolean;
end;
TCustomComboEdit = class(TCustomEdit, IComboEditHelper)
private
FBorder: TComboEditBorder;
FClientArea: TComboEditClientArea;
FUseEditRect: Boolean;
FEditRect: TRect;
FEditClientColor: Boolean;
FFlat: Boolean;
function GetBorderStyle: TControlBorderStyle;
procedure SetBorderStyle(Value: TControlBorderStyle);
function GetBevelInner: TPanelBevel;
function GetBevelOuter: TPanelBevel;
function GetBevelWidth: TBevelWidth;
function GetBorderHandle: QWidgetH;
procedure SetBevelInner(const Value: TPanelBevel);
procedure SetBevelOuter(const Value: TPanelBevel);
procedure SetBevelWidth(const Value: TBevelWidth);
function GetClientColor: TColor;
procedure SetClientColor(const Value: TColor);
procedure SetEditClientColor(const Value: Boolean);
function GetClientArea: TComboEditClientArea;
function GetFlat: Boolean;
procedure SetFlat(const Value: Boolean);
procedure EMGetRect(var Mesg: TMessage); message EM_GETRECT;
procedure EMSetRect(var Mesg: TMessage); message EM_SETRECT;
protected
procedure DoFlatChanged; virtual;
procedure CreateWidget; override;
procedure ChangeBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
procedure AdjustClientRect(var Rect: TRect); override;
function GetClientRect: TRect; override;
procedure SetParent(const Value: TWidgetControl); override;
procedure SetZOrder(TopMost: Boolean); override;
procedure EnabledChanged; override;
procedure CursorChanged; override;
procedure VisibleChanged; override;
procedure ColorChanged; override;
procedure RequestAlign; override;
procedure AdjustClientArea; virtual;
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; override;
property ClientColor: TColor read GetClientColor write SetClientColor;
property EditClientColor: Boolean read FEditClientColor write SetEditClientColor;
property BevelInner: TPanelBevel read GetBevelInner write SetBevelInner default bvNone;
property BevelOuter: TPanelBevel read GetBevelOuter write SetBevelOuter default bvRaised;
property BevelWidth: TBevelWidth read GetBevelWidth write SetBevelWidth default 1;
property BorderStyle: TControlBorderStyle read GetBorderStyle write SetBorderStyle stored False default bsSingle;
property Flat: Boolean read GetFlat write SetFlat;
property BorderHandle: QWidgetH read GetBorderHandle;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetEditorRect: TRect; virtual;
procedure SetEditorRect(Value: PRect); virtual;
// SetEditorRect sets the rectangle for the editor relative to the Client
// widget.
property ClientArea: TComboEditClientArea read GetClientArea;
end;
TComboEdit = class(TCustomComboEdit)
published
property Flat default False;
property BevelInner;
property BevelOuter;
property BevelWidth;
property ClientColor default clBase;
property EditClientColor default True;
public
property CursorPos;
published
property Anchors;
property AutoSelect;
property AutoSize;
property Alignment;
property BorderStyle;
property CharCase;
property Color;
property Constraints;
property DragMode;
property EchoMode;
property Enabled;
property Font;
property HideSelection;
property MaxLength;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnChange;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyString;
property OnKeyUp;
property OnMouseDown;
property OnMouseEnter;
property OnMouseLeave;
property OnMouseMove;
property OnMouseUp;
property OnReturnPressed;
property OnStartDrag;
end;
TCustomComboMaskEdit = class(TCustomMaskEdit, IComboEditHelper)
private
FBorder: TComboEditBorder;
FClientArea: TComboEditClientArea;
FUseEditRect: Boolean;
FEditRect: TRect;
FEditClientColor: Boolean;
FFlat: Boolean;
function GetBorderStyle: TControlBorderStyle;
procedure SetBorderStyle(Value: TControlBorderStyle);
function GetBevelInner: TPanelBevel;
function GetBevelOuter: TPanelBevel;
function GetBevelWidth: TBevelWidth;
function GetBorderHandle: QWidgetH;
procedure SetBevelInner(const Value: TPanelBevel);
procedure SetBevelOuter(const Value: TPanelBevel);
procedure SetBevelWidth(const Value: TBevelWidth);
function GetClientColor: TColor;
procedure SetClientColor(const Value: TColor);
procedure SetEditClientColor(const Value: Boolean);
function GetClientArea: TComboEditClientArea;
function GetFlat: Boolean;
procedure SetFlat(const Value: Boolean);
procedure EMGetRect(var Mesg: TMessage); message EM_GETRECT;
procedure EMSetRect(var Mesg: TMessage); message EM_SETRECT;
protected
procedure AdjustClientArea; virtual;
procedure DoFlatChanged; virtual;
procedure CreateWidget; override;
procedure ChangeBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
procedure AdjustClientRect(var Rect: TRect); override;
function GetClientRect: TRect; override;
procedure SetParent(const Value: TWidgetControl); override;
procedure SetZOrder(TopMost: Boolean); override;
procedure EnabledChanged; override;
procedure CursorChanged; override;
procedure VisibleChanged; override;
procedure ColorChanged; override;
procedure RequestAlign; override;
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; override;
property ClientColor: TColor read GetClientColor write SetClientColor;
property EditClientColor: Boolean read FEditClientColor write SetEditClientColor;
property BevelInner: TPanelBevel read GetBevelInner write SetBevelInner default bvNone;
property BevelOuter: TPanelBevel read GetBevelOuter write SetBevelOuter default bvRaised;
property BevelWidth: TBevelWidth read GetBevelWidth write SetBevelWidth default 1;
property BorderStyle: TControlBorderStyle read GetBorderStyle write SetBorderStyle stored False default bsSingle;
property Flat: Boolean read GetFlat write SetFlat;
property BorderHandle: QWidgetH read GetBorderHandle;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetEditorRect: TRect; virtual;
procedure SetEditorRect(Value: PRect); virtual;
// SetEditorRect sets the rectangle for the editor relative to the Client
// widget.
property ClientArea: TComboEditClientArea read GetClientArea;
end;
TComboMaskEdit = class(TCustomComboMaskEdit)
published
property Flat default False;
property BevelInner;
property BevelOuter;
property BevelWidth;
property ClientColor default clBase;
property EditClientColor default True;
published
property Anchors;
property AutoSelect;
property AutoSize;
property BeepOnError;
property BorderStyle;
property CharCase;
property Color;
property Constraints;
property DragMode;
property Enabled;
property EditMask;
property Font;
property MaxLength;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnChange;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyString;
property OnKeyUp;
property OnMouseDown;
property OnMouseEnter;
property OnMouseLeave;
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
end;
implementation
type
TEMRect = packed record
Msg: LongInt;
Unused: LongInt;
Rect: PRect;
Handled: LongBool;
end;
{ TCustomComboEdit }
constructor TCustomComboEdit.Create(AOwner: TComponent);
begin
FBorder := TComboEditBorder.Create(nil);
FBorder.FEdit := Self;
FClientArea := TComboEditClientArea.Create(nil);
FClientArea.FEdit := Self;
inherited Create(AOwner); // needs FBorder and FClientArea
FWidth := 101;
FHeight := 21;
FBorder.Color := Color;
FClientArea.Color := Color;
FEditClientColor := True;
BorderStyle := bsSingle;
SetEditorRect(nil);
end;
destructor TCustomComboEdit.Destroy;
begin
SetParent(nil); // prevent the release of needed controls
inherited Destroy;
// some methods in inherited Destroy may access the client area and border
if not (csDestroying in FClientArea.ComponentState) then
FClientArea.Free;
if not (csDestroying in FBorder.ComponentState) then
FBorder.Free;
end;
procedure TCustomComboEdit.CursorChanged;
begin
inherited CursorChanged;
FBorder.Cursor := Cursor;
FClientArea.Cursor := Cursor;
end;
procedure TCustomComboEdit.EnabledChanged;
begin
inherited EnabledChanged;
FBorder.Enabled := Enabled;
FClientArea.Enabled := Enabled;
end;
procedure TCustomComboEdit.VisibleChanged;
begin
inherited VisibleChanged;
FBorder.Visible := Visible;
FClientArea.Visible := Visible;
end;
procedure TCustomComboEdit.ColorChanged;
begin
inherited ColorChanged;
if FEditClientColor then
FClientArea.Color := Color;
end;
function TCustomComboEdit.GetClientColor: TColor;
begin
Result := FClientArea.Color;
end;
procedure TCustomComboEdit.SetClientColor(const Value: TColor);
begin
if Value <> ClientColor then
begin
FEditClientColor := False;
FClientArea.Color := Value;
end;
end;
procedure TCustomComboEdit.SetEditClientColor(const Value: Boolean);
begin
FEditClientColor := Value;
if FEditClientColor then
ColorChanged;
end;
function TCustomComboEdit.GetBevelInner: TPanelBevel;
begin
Result := FBorder.BevelInner;
end;
function TCustomComboEdit.GetBevelOuter: TPanelBevel;
begin
Result := FBorder.BevelOuter;
end;
function TCustomComboEdit.GetBevelWidth: TBevelWidth;
begin
Result := FBorder.BevelWidth;
end;
function TCustomComboEdit.GetBorderHandle: QWidgetH;
begin
Result := FBorder.Handle;
end;
function TCustomComboEdit.GetBorderStyle: TControlBorderStyle;
begin
Result := bsSingle;
if FBorder.BevelInner = FBorder.BevelOuter then
begin
if FBorder.BevelInner = bvLowered then
Result := bsSingle
else if FBorder.BevelInner = bvNone then
Result := bsNone;
end;
if FBorder.BorderWidth < 2 then
Result := bsNone;
end;
procedure TCustomComboEdit.SetBevelInner(const Value: TPanelBevel);
begin
FBorder.BevelInner := Value;
AdjustClientArea;
end;
procedure TCustomComboEdit.SetBevelOuter(const Value: TPanelBevel);
begin
FBorder.BevelOuter := Value;
AdjustClientArea;
end;
procedure TCustomComboEdit.SetBevelWidth(const Value: TBevelWidth);
begin
FBorder.BevelWidth := Value;
AdjustClientArea;
end;
procedure TCustomComboEdit.SetBorderStyle(Value: TControlBorderStyle);
begin
FBorder.BorderStyle := Value;
if Value = bsNone then
FBorder.BorderWidth := 0
else
if FFlat then
FBorder.BorderWidth := 1
else
FBorder.BorderWidth := 2;
AdjustClientArea;
end;
function TCustomComboEdit.GetFlat: Boolean;
begin
Result := FFlat;
end;
procedure TCustomComboEdit.SetFlat(const Value: Boolean);
begin
if Value <> FFlat then
begin
FFlat := Value;
if FBorder.BorderStyle = bsSingle then
begin
if FFlat then
FBorder.BorderWidth := 1
else
FBorder.BorderWidth := 2;
end;
FBorder.Invalidate;
DoFlatChanged;
end;
end;
function TCustomComboEdit.GetClientArea: TComboEditClientArea;
begin
Result := FClientArea;
end;
function TCustomComboEdit.GetEditorRect: TRect;
begin
Result := FEditRect;
end;
procedure TCustomComboEdit.SetEditorRect(Value: PRect);
begin
FUseEditRect := Value <> nil;
if FUseEditRect then
FEditRect := Value^;
AdjustClientArea;
end;
procedure TCustomComboEdit.EMGetRect(var Mesg: TMessage);
begin
with TEMRect(Mesg) do
begin
Rect^ := GetEditorRect;
Handled := True;
end;
end;
procedure TCustomComboEdit.EMSetRect(var Mesg: TMessage);
begin
with TEMRect(Mesg) do
begin
Self.SetEditorRect(Rect);
Handled := True;
end;
end;
procedure TCustomComboEdit.AdjustClientArea;
var
R: TRect;
begin
if Parent <> nil then
begin
FClientArea.Align := alClient;
if not FUseEditRect then
FEditRect := FClientArea.ClientRect;
R := FEditRect;
with R do
begin
// Qt will move the Top value if the Height is too high.
if Bottom > Top + ClientHeight then
Dec(Top, Bottom - ClientHeight);
QWidget_setGeometry(Handle, Left, Top, Right - Left, Bottom - Top);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -