⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qcomboedits.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{-----------------------------------------------------------------------------
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 + -