cxlistview.pas

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

PAS
2,127
字号

{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressCommonLibrary                                         }
{                                                                    }
{       Copyright (c) 1998-2008 Developer Express Inc.               }
{       ALL RIGHTS RESERVED                                          }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSCOMMONLIBRARY AND ALL          }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}

{$DEFINE USETCXSCROLLBAR}

unit cxListView;

{$I cxVer.inc}

interface

uses
  Windows, Forms, Classes, ComCtrls, CommCtrl, Controls, ImgList, Menus,
  Messages, StdCtrls, SysUtils, cxClasses, cxContainer, cxControls, cxCustomData,
  cxExtEditConsts, cxGraphics, cxLookAndFeels, cxScrollBar, cxHeader;

type
  TcxCustomListView = class;

  { TcxIconOptions }

  TcxIconOptions = class(TPersistent)
  private
    FArrangement: TIconArrangement;
    FAutoArrange: Boolean;
    FWrapText: Boolean;
    FArrangementChange: TNotifyEvent;
    FAutoArrangeChange: TNotifyEvent;
    FWrapTextChange: TNotifyEvent;
    procedure SetArrangement(Value: TIconArrangement);
    procedure SetAutoArrange(Value: Boolean);
    procedure SetWrapText(Value: Boolean);
  public
    constructor Create(AOwner: TPersistent);
  published
    property Arrangement: TIconArrangement read FArrangement write SetArrangement default iaTop;
    property AutoArrange: Boolean read FAutoArrange write SetAutoArrange default False;
    property WrapText: Boolean read FWrapText write SetWrapText default True;
  end;

  { TcxCustomInnerListView }

  TcxCustomInnerListView = class(TListView, IUnknown,
    IcxContainerInnerControl)
  private
    FCanvas: TcxCanvas;
    FDefHeaderProc: Pointer;
    FHeaderHandle: HWND;
    FHeaderInstance: Pointer;
    FOldHint: string;
    FOldItem: TListItem;
    FPressedHeaderItemIndex: Integer;

    function GetHeaderHotItemIndex: Integer;
    function GetHeaderItemRect(AItemIndex: Integer): TRect;
    function GetHeaderPressedItemIndex: Integer;
    function HeaderItemIndex(AHeaderItem: Integer): Integer;
    procedure HeaderWndProc(var Message: TMessage);

    procedure HScrollHandler(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure VScrollHandler(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
    procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
    procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
    procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
    procedure LVMGetHeaderItemInfo(var Message: TCMHeaderItemInfo); message CM_GETHEADERITEMINFO;

    function GetContainer: TcxCustomListView;
    function GetControl: TWinControl;
    function GetControlContainer: TcxContainer;
  protected
    FContainer: TcxCustomListView;
    procedure Click; override;
    procedure DblClick; override;
    procedure Loaded; override;
    function CanEdit(Item: TListItem): Boolean; override;
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
      MousePos: TPoint): Boolean; override;
    procedure DoStartDock(var DragObject: TDragObject); override;
    procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
      var Accept: Boolean); override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyPress(var Key: Char); override;
    procedure KeyUp(var Key: Word; Shift: TShiftState); override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure WndProc(var Message: TMessage); override;
    procedure DoCancelEdit; virtual;
    procedure LookAndFeelChanged(Sender: TcxLookAndFeel;
      AChangedValues: TcxLookAndFeelValues); virtual;
    procedure MouseEnter(AControl: TControl); dynamic;
    procedure MouseLeave(AControl: TControl); dynamic;

    procedure DrawHeader; virtual;

    property Container: TcxCustomListView read GetContainer;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure DefaultHandler(var Message); override;
    procedure DragDrop(Source: TObject; X, Y: Integer); override;
    property Canvas: TcxCanvas read FCanvas;
    function CanFocus: Boolean; override;
  {$IFDEF DELPHI6}
    procedure DeleteSelected; override;
  {$ENDIF}
  end;

  TcxCustomInnerListViewClass = class of TcxCustomInnerListView;

  { TcxCustomListView }

  TcxCustomListView = class(TcxContainer)
  private
    FInnerListView: TcxCustomInnerListView;
    FIconOptions: TcxIconOptions;
    FOnCancelEdit: TNotifyEvent;
    FOwnerDraw: Boolean;
    function GetReadOnly: Boolean;
    function GetListItems: TListItems;
    function GetListColumns: TListColumns;
    function GetListViewCanvas: TcxCanvas;
    function GetColumnClick: Boolean;
    function GetHideSelection: Boolean;
    function GetIconOptions: TcxIconOptions;
    function GetAllocBy: Integer;
    function GetHoverTime: Integer;
    function GetLargeImages: TCustomImageList;
    function GetMultiSelect: Boolean;
    function GetOwnerData: Boolean;
    function GetOwnerDraw: Boolean;
    function GetOnAdvancedCustomDraw: TLVAdvancedCustomDrawEvent;
    function GetOnAdvancedCustomDrawItem: TLVAdvancedCustomDrawItemEvent;
    function GetOnAdvancedCustomDrawSubItem: TLVAdvancedCustomDrawSubItemEvent;
    function GetOnChange: TLVChangeEvent;
    function GetOnChanging: TLVChangingEvent;
    function GetOnColumnClick: TLVColumnClickEvent;
    function GetOnColumnDragged: TNotifyEvent;
    function GetOnColumnRightClick: TLVColumnRClickEvent;
    function GetOnCompare: TLVCompareEvent;
    function GetOnCustomDraw: TLVCustomDrawEvent;
    function GetOnCustomDrawItem: TLVCustomDrawItemEvent;
    function GetOnCustomDrawSubItem: TLVCustomDrawSubItemEvent;
    function GetOnData: TLVOwnerDataEvent;
    function GetOnDataFind: TLVOwnerDataFindEvent;
    function GetOnDataHint: TLVOwnerDataHintEvent;
    function GetOnDataStateChange: TLVOwnerDataStateChangeEvent;
    function GetOnDeletion: TLVDeletedEvent;
    function GetOnDrawItem: TLVDrawItemEvent;
    function GetOnEdited: TLVEditedEvent;
    function GetOnEditing: TLVEditingEvent;
    function GetOnInfoTip: TLVInfoTipEvent;
    function GetOnInsert: TLVDeletedEvent;
    function GetOnGetImageIndex: TLVNotifyEvent;
    function GetOnGetSubItemImage: TLVSubItemImageEvent;
    function GetShowWorkAreas: Boolean;
    function GetOnSelectItem: TLVSelectItemEvent;
    function GetShowColumnHeaders: Boolean;
    function GetSmallImages: TCustomImageList;
    function GetSortType: TSortType;
    function GetStateImages: TCustomImageList;
    function GetViewStyle: TViewStyle;
  {$IFDEF DELPHI6}
    function GetOnCreateItemClass: TLVCreateItemClassEvent;
  {$ENDIF}
    procedure SetReadOnly(Value: Boolean);
    procedure SetListItems(Value: TListItems);
    procedure SetListColumns(Value: TListColumns);
    procedure SetColumnClick(Value: Boolean);
    procedure SetHideSelection(Value: Boolean);
    procedure SetIconOptions(Value: TcxIconOptions);
    procedure SetAllocBy(Value: Integer);
    procedure SetHoverTime(Value: Integer);
    procedure SetLargeImages(Value: TCustomImageList);
    procedure SetMultiSelect(Value: Boolean);
    procedure SetOwnerData(Value: Boolean);
    procedure SetOwnerDraw(Value: Boolean);
    procedure SetOnAdvancedCustomDraw(Value: TLVAdvancedCustomDrawEvent);
    procedure SetOnAdvancedCustomDrawItem(Value: TLVAdvancedCustomDrawItemEvent);
    procedure SetOnAdvancedCustomDrawSubItem(Value: TLVAdvancedCustomDrawSubItemEvent);
    procedure SetOnChange(Value: TLVChangeEvent);
    procedure SetOnChanging(Value: TLVChangingEvent);
    procedure SetOnColumnClick(Value: TLVColumnClickEvent);
    procedure SetOnColumnDragged(Value: TNotifyEvent);
    procedure SetOnColumnRightClick(Value: TLVColumnRClickEvent);
    procedure SetOnCompare(Value: TLVCompareEvent);
    procedure SetOnCustomDraw(Value: TLVCustomDrawEvent);
    procedure SetOnCustomDrawItem(Value: TLVCustomDrawItemEvent);
    procedure SetOnCustomDrawSubItem(Value: TLVCustomDrawSubItemEvent);
    procedure SetOnData(Value: TLVOwnerDataEvent);
    procedure SetOnDataFind(Value: TLVOwnerDataFindEvent);
    procedure SetOnDataHint(Value: TLVOwnerDataHintEvent);
    procedure SetOnDataStateChange(Value: TLVOwnerDataStateChangeEvent);
    procedure SetOnDeletion(Value: TLVDeletedEvent);
    procedure SetOnDrawItem(Value: TLVDrawItemEvent);
    procedure SetOnEdited(Value: TLVEditedEvent);
    procedure SetOnEditing(Value: TLVEditingEvent);
    procedure SetOnInfoTip(Value: TLVInfoTipEvent);
    procedure SetOnInsert(Value: TLVDeletedEvent);
    procedure SetOnGetImageIndex(Value: TLVNotifyEvent);
    procedure SetOnGetSubItemImage(Value: TLVSubItemImageEvent);
    procedure SetShowWorkAreas(Value: Boolean);
    procedure SetOnSelectItem(Value: TLVSelectItemEvent);
    procedure SetShowColumnHeaders(Value: Boolean);
    procedure SetSmallImages(Value: TCustomImageList);
    procedure SetSortType(Value: TSortType);
    procedure SetStateImages(Value: TCustomImageList);
  {$IFDEF DELPHI6}
    procedure SetOnCreateItemClass(Value: TLVCreateItemClassEvent);
  {$ENDIF}
    function GetCheckBoxes: Boolean;
    function GetColumnFromIndex(Index: Integer): TListColumn;
    function GetDropTarget: TListItem;
    function GetFullDrag: Boolean;
    function GetGridLines: Boolean;
    function GetHotTrack: Boolean;
    function GetHotTrackStyles: TListHotTrackStyles;
    function GetItemFocused: TListItem;
    function GetRowSelect: Boolean;
    function GetSelCount: Integer;
    function GetSelected: TListItem;
    function GetTopItem: TListItem;
    function GetViewOrigin: TPoint;
    function GetVisibleRowCount: Integer;
    function GetBoundingRect: TRect;
    function GetWorkAreas: TWorkAreas;
    procedure SetCheckboxes(Value: Boolean);
    procedure SetDropTarget(Value: TListItem);
    procedure SetFullDrag(Value: Boolean);
    procedure SetGridLines(Value: Boolean);
    procedure SetHotTrack(Value: Boolean);
    procedure SetHotTrackStyles(Value: TListHotTrackStyles);
    procedure SetItemFocused(Value: TListItem);
    procedure SetRowSelect(Value: Boolean);
    procedure SetSelected(Value: TListItem);
    procedure ArrangementChangeHandler(Sender: TObject);
    procedure AutoArrangeChangeHandler(Sender: TObject);
    procedure WrapTextChangeHandler(Sender: TObject);
    procedure UpdateIconOptions;
  protected
    procedure DoExit; override;
    procedure FontChanged; override;
    function IsReadOnly: Boolean; override;
    procedure Loaded; override;
    procedure LookAndFeelChanged(Sender: TcxLookAndFeel;
      AChangedValues: TcxLookAndFeelValues); override;
    function NeedsScrollBars: Boolean; override;
    procedure Scroll(AScrollBarKind: TScrollBarKind; AScrollCode: TScrollCode;
      var AScrollPos: Integer); override;
    procedure WriteState(Writer: TWriter); override;

    class function GetListViewClass: TcxCustomInnerListViewClass; virtual;

    function CanChange(Item: TListItem; Change: Integer): Boolean;
    function CanEdit(Item: TListItem): Boolean;
    procedure ChangeScale(M, D: Integer); override;
    function ColumnsShowing: Boolean;
    function GetCount: Integer;
  {$IFDEF DELPHI6}
    function GetItemIndex: Integer; overload;
    function GetListViewItemIndex: Integer;
    procedure SetItemIndex(Value: Integer);
  {$ENDIF}
    function GetItemIndex(Value: TListItem): Integer; overload;
    procedure SetViewStyle(Value: TViewStyle); virtual;
    procedure UpdateColumn(AnIndex: Integer);
    procedure UpdateColumns;
    
    property Columns: TListColumns read GetListColumns write SetListColumns;
    property ColumnClick: Boolean read GetColumnClick write SetColumnClick default True;
    property HideSelection: Boolean read GetHideSelection write SetHideSelection default True;
    property IconOptions: TcxIconOptions read GetIconOptions write SetIconOptions;
    property Items: TListItems read GetListItems write SetListItems;
    property AllocBy: Integer read GetAllocBy write SetAllocBy default 0;
    property HoverTime: Integer read GetHoverTime write SetHoverTime default -1;
    property ListViewCanvas: TcxCanvas read GetListViewCanvas;
    property LargeImages: TCustomImageList read GetLargeImages write SetLargeImages;
    property MultiSelect: Boolean read GetMultiSelect write SetMultiSelect default False;
    property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
    property OwnerData: Boolean read GetOwnerData write SetOwnerData default False;
    property OwnerDraw: Boolean read GetOwnerDraw write SetOwnerDraw default False;
    property RowSelect: Boolean read GetRowSelect write SetRowSelect default False;
    property ShowColumnHeaders: Boolean read GetShowColumnHeaders
      write SetShowColumnHeaders default True;
    property ShowWorkAreas: Boolean read GetShowWorkAreas write SetShowWorkAreas default False;
    property SmallImages: TCustomImageList read GetSmallImages write SetSmallImages;
    property SortType: TSortType read GetSortType write SetSortType default stNone;
    property StateImages: TCustomImageList read GetStateImages write SetStateImages;
    property ViewStyle: TViewStyle read GetViewStyle write SetViewStyle default vsIcon;
    property OnAdvancedCustomDraw: TLVAdvancedCustomDrawEvent read GetOnAdvancedCustomDraw
      write SetOnAdvancedCustomDraw;
    property OnAdvancedCustomDrawItem: TLVAdvancedCustomDrawItemEvent
      read GetOnAdvancedCustomDrawItem write SetOnAdvancedCustomDrawItem;
    property OnAdvancedCustomDrawSubItem: TLVAdvancedCustomDrawSubItemEvent
      read GetOnAdvancedCustomDrawSubItem write SetOnAdvancedCustomDrawSubItem;
    property OnCancelEdit: TNotifyEvent read FOnCancelEdit write FOnCancelEdit;
    property OnChange: TLVChangeEvent read GetOnChange write SetOnChange;
    property OnChanging: TLVChangingEvent read GetOnChanging write SetOnChanging;
    property OnColumnClick: TLVColumnClickEvent read GetOnColumnClick write SetOnColumnClick;
    property OnColumnDragged: TNotifyEvent read GetOnColumnDragged write SetOnColumnDragged;
    property OnColumnRightClick: TLVColumnRClickEvent read GetOnColumnRightClick
      write SetOnColumnRightClick;
    property OnCompare: TLVCompareEvent read GetOnCompare write SetOnCompare;
    property OnCustomDraw: TLVCustomDrawEvent read GetOnCustomDraw write SetOnCustomDraw;
    property OnCustomDrawItem: TLVCustomDrawItemEvent read GetOnCustomDrawItem
      write SetOnCustomDrawItem;
    property OnCustomDrawSubItem: TLVCustomDrawSubItemEvent read GetOnCustomDrawSubItem
      write SetOnCustomDrawSubItem;
    property OnData: TLVOwnerDataEvent read GetOnData write SetOnData;
    property OnDataFind: TLVOwnerDataFindEvent read GetOnDataFind write SetOnDataFind;
    property OnDataHint: TLVOwnerDataHintEvent read GetOnDataHint write SetOnDataHint;
    property OnDataStateChange: TLVOwnerDataStateChangeEvent read GetOnDataStateChange
      write SetOnDataStateChange;
    property OnDeletion: TLVDeletedEvent read GetOnDeletion write SetOnDeletion;
    property OnDrawItem: TLVDrawItemEvent read GetOnDrawItem write SetOnDrawItem;
    property OnEdited: TLVEditedEvent read GetOnEdited write SetOnEdited;
    property OnEditing: TLVEditingEvent read GetOnEditing write SetOnEditing;
    property OnInfoTip: TLVInfoTipEvent read GetOnInfoTip write SetOnInfoTip;
    property OnInsert: TLVDeletedEvent read GetOnInsert write SetOnInsert;
    property OnGetImageIndex: TLVNotifyEvent read GetOnGetImageIndex write SetOnGetImageIndex;
    property OnGetSubItemImage: TLVSubItemImageEvent read GetOnGetSubItemImage
      write SetOnGetSubItemImage;
    property OnSelectItem: TLVSelectItemEvent read GetOnSelectItem write SetOnSelectItem;
  {$IFDEF DELPHI6}
    property OnCreateItemClass: TLVCreateItemClassEvent read GetOnCreateItemClass
      write SetOnCreateItemClass;
  {$ENDIF}
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property InnerListView: TcxCustomInnerListView read FInnerListView;
    function AlphaSort: Boolean;
    procedure Arrange(Code: TListArrangement);
    procedure Clear;
  {$IFDEF DELPHI6}
    procedure ClearSelection;
    procedure AddItem(Item: string; AObject: TObject);
    procedure CopySelection(Destination: TCustomListControl);
    procedure DeleteSelected;
    procedure SelectAll;
  {$ENDIF}
    function FindCaption(StartIndex: Integer; Value: string;
      Partial, Inclusive, Wrap: Boolean): TListItem;
    function FindData(StartIndex: Integer; Value: Pointer;
      Inclusive, Wrap: Boolean): TListItem;
    function GetHitTestInfoAt(X, Y: Integer): THitTests;
    function GetItemAt(X, Y: Integer): TListItem;
    function GetNearestItem(Point: TPoint;
      Direction: TSearchDirection): TListItem;
    function GetNextItem(StartItem: TListItem;
      Direction: TSearchDirection; States: TItemStates): TListItem;
    function GetSearchString: string;
    function IsEditing: Boolean;
    function CustomSort(SortProc: TLVCompare; lParam: Longint): Boolean;
    function StringWidth(S: string): Integer;
    procedure UpdateItems(FirstIndex, LastIndex: Integer);

    property Checkboxes: Boolean read GetCheckBoxes write SetCheckboxes default False;
    property Column[Index: Integer]: TListColumn read GetColumnFromIndex;
    property DropTarget: TListItem read GetDropTarget write SetDropTarget;
    property FullDrag: Boolean read GetFullDrag write SetFullDrag default False;
    property GridLines: Boolean read GetGridLines write SetGridLines default False;
    property HotTrack: Boolean read GetHotTrack write SetHotTrack default False;
    property HotTrackStyles: TListHotTrackStyles read GetHotTrackStyles write SetHotTrackStyles default [];
    property ItemFocused: TListItem read GetItemFocused write SetItemFocused;
  {$IFDEF DELPHI6}
    property ItemIndex: Integer read GetListViewItemIndex write SetItemIndex
      default -1;
  {$ENDIF}
    property SelCount: Integer read GetSelCount;
    property Selected: TListItem read GetSelected write SetSelected;
    property TopItem: TListItem read GetTopItem;
    property ViewOrigin: TPoint read GetViewOrigin;
    property VisibleRowCount: Integer read GetVisibleRowCount;
    property BoundingRect: TRect read GetBoundingRect;
    property WorkAreas: TWorkAreas read GetWorkAreas;
  end;

  { TcxListView }

⌨️ 快捷键说明

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