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

📄 easygrid.pas

📁 delphi制作表格的控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  TCopyMoveCellsEvent = procedure (Sender: TObject; SrcRect, DestRect: TRect) of object;
  TFillCellsEvent = procedure (Sender: TObject; SrcRect, DestRect: TRect) of object;


  // TInplaceEdit 是 EasyGrid 内嵌的编辑器,用于编辑单元格数据
  TInplaceEdit = class(TCustomMaskEdit)
  private
    FGrid: TCustomEasyGrid;
    FCell: PCellInfo;
    FClickTime: Longint;
    FTempText: String;
    function  CanAcceptKey(var S: string; var CharPos: Integer): Boolean;
    procedure InternalMove(const Loc: TRect; Redraw: Boolean);
    procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED;
    procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
    procedure WMPaste(var Message); message WM_PASTE;
    procedure WMCut(var Message); message WM_CUT;
    procedure WMClear(var Message); message WM_CLEAR;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure DblClick; override;
    function  DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
      MousePos: TPoint): Boolean; override;
    function  EditCanModify: 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 ValidateError; override;
    procedure BoundsChanged; virtual;
    procedure UpdateContents; virtual;
    procedure WndProc(var Message: TMessage); override;
  public
    constructor Create(AOwner: TComponent); override;
    procedure Deselect;
    procedure Hide;
    procedure Invalidate; reintroduce;
    procedure Move(const Loc: TRect);
    function PosEqual(const Rect: TRect): Boolean;
    procedure SetFocus; reintroduce;
    procedure UpdateLoc(const Loc: TRect);
    function Visible: Boolean;
    property ParentGrid: TCustomEasyGrid read FGrid write FGrid;
    property Grid: TCustomEasyGrid read FGrid;
    property Cell: PCellInfo read FCell write FCell;
  end;

  TPopupListbox = class(TCustomListbox)
  private
    FSearchText: String;
    FSearchTickCount: Longint;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure KeyPress(var Key: Char); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  end;

  TOnGetPickListItems = procedure(ACol, ARow: Integer; Items: TStrings) of Object;

  TInplaceEditList = class(TInPlaceEdit)
  private
    FButtonWidth: Integer;
    FPickList: TCustomListbox;
    FActiveList: TWinControl;
    FEditStyle: TEditStyle;
    FDropDownRows: Integer;
    FListVisible: Boolean;
    FTracking: Boolean;
    FPressed: Boolean;
    FPickListLoaded: Boolean;
    FOnGetPickListitems: TOnGetPickListItems;
    FOnEditButtonClick: TNotifyEvent;
    function GetPickList: TCustomListbox;
    procedure CMCancelMode(var Message: TCMCancelMode); message CM_CancelMode;
    procedure WMCancelMode(var Message: TMessage); message WM_CancelMode;
    procedure WMKillFocus(var Message: TMessage); message WM_KillFocus;
    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message wm_LButtonDblClk;
    procedure WMPaint(var Message: TWMPaint); message wm_Paint;
    procedure WMSetCursor(var Message: TWMSetCursor); message WM_SetCursor;
  protected
    procedure BoundsChanged; override;
    function ButtonRect: TRect;
    procedure CloseUp(Accept: Boolean); dynamic;
    procedure DblClick; override;
    procedure DoDropDownKeys(var Key: Word; Shift: TShiftState); virtual;
    procedure DoEditButtonClick; virtual;
    procedure DoGetPickListItems; dynamic;
    procedure DropDown; dynamic;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure ListMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    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;
    function OverButton(const P: TPoint): Boolean;
    procedure PaintWindow(DC: HDC); override;
    procedure StopTracking;
    procedure TrackButton(X,Y: Integer);
    procedure UpdateContents; override;
    procedure WndProc(var Message: TMessage); override;
  public
    constructor Create(Owner: TComponent); override;
    procedure RestoreContents;
    property ActiveList: TWinControl read FActiveList write FActiveList;
    property ButtonWidth: Integer read FButtonWidth write FButtonWidth;
    property DropDownRows: Integer read FDropDownRows write FDropDownRows;
    property EditStyle: TEditStyle read FEditStyle;
    property ListVisible: Boolean read FListVisible write FListVisible;
    property PickList: TCustomListbox read GetPickList;
    property PickListLoaded: Boolean read FPickListLoaded write FPickListLoaded;
    property Pressed: Boolean read FPressed;
    property OnEditButtonClick: TNotifyEvent read FOnEditButtonClick
      write FOnEditButtonClick;
    property OnGetPickListitems: TOnGetPickListItems read FOnGetPickListitems
      write FOnGetPickListitems;
  end;

  TInplaceDBEdit = class(TInplaceEditList)
  private
    FDataList: TDBLookupListBox;
    FUseDataList: Boolean;
    FLookupSource: TDatasource;
  protected
    procedure CloseUp(Accept: Boolean); override;
    procedure DoEditButtonClick; override;
    procedure DropDown; override;
    procedure UpdateContents; override;
  public
    constructor Create(Owner: TComponent); override;
    property    DataList: TDBLookupListBox read FDataList;
  end;

  TEasyGridDataLink = class(TDataLink)
  private
    FGrid: TCustomEasyGrid;
    FFieldCount: Integer;
    FFieldMap: array of Integer;
    FModified: Boolean;
    FDataChanged: Boolean;
    FInUpdateData: Boolean;
    FSparseMap: Boolean;
    function GetDefaultFields: Boolean;
    function GetFields(I: Integer): TField;
  protected
    procedure ActiveChanged; override;
    procedure DataEvent(Event: TDataEvent; Info: Longint);override;
    procedure BuildAggMap;
    procedure DataSetChanged; override;
    procedure DataSetScrolled(Distance: Integer); override;
    procedure FocusControl(Field: TFieldRef); override;
    procedure EditingChanged; override;
    function  IsAggRow(Value: Integer): Boolean; virtual;

    procedure RecordChanged(Field: TField); override;
    procedure UpdateData; override;
    function  GetMappedIndex(ColIndex: Integer): Integer;
  public
    constructor Create(AGrid: TCustomEasyGrid);
    destructor  Destroy; override;
    //function  AddMapping(const FieldName: string): Boolean;
    procedure ClearMapping;
    procedure Modified;
    procedure Reset;
    property  DefaultFields: Boolean read GetDefaultFields;
    property  FieldCount: Integer read FFieldCount;
    property  Fields[I: Integer]: TField read GetFields;
    property  SparseMap: Boolean read FSparseMap write FSparseMap;
    property  Grid: TCustomEasyGrid read FGrid;
  end;

  TRunMode = (rmDesignMode, rmLinkDataSet, rmPrint);

  //增加可以绑定构件的功能     2007.01.20
  TCtrlItem = class(TCollectionItem)
  private
    FControl: TControl;
    FCol, FRow: Integer;
    FPushed: Integer;
    function GetEasyGrid: TCustomEasyGrid;
    function GetPushed: Boolean;
    procedure SetCol(Value: Integer);
    procedure SetControl(Value: TControl);
    procedure SetRow(Value: Integer);
  protected
    procedure AssignTo(Dest: TPersistent); override;
    procedure InternalSetLocation(AColumn, ARow: Integer; APushed: Boolean; MoveExisting: Boolean);
    property EasyGrid: TCustomEasyGrid read GetEasyGrid;
    property Pushed: Boolean read GetPushed;
  public
    constructor Create(Collection: TCollection); override;
    destructor Destroy; override;
    procedure SetLocation(AColumn, ARow: Integer; APushed: Boolean = False);
  published
    property Col: Integer read FCol write SetCol;
    property Control: TControl read FControl write SetControl;
    property Row: Integer read FRow write SetRow;
  end;

  TCtrlCollection = class(TOwnedCollection)
  protected
    function GetControl(AColumn, ARow: Integer): TControl;
    function GetControlItem(AColumn, ARow: Integer): TCtrlItem;
    function GetItem(Index: Integer): TCtrlItem;
    procedure SetControl(AColumn, ARow: Integer; Value: TControl);
    procedure SetItem(Index: Integer; Value: TCtrlItem);
    procedure Update(Item: TCollectionItem); override;
  public
    constructor Create(AOwner: TPersistent);
    function Add: TCtrlItem;
    procedure AddControl(AControl: TControl; AColumn: Integer = -1; ARow: Integer = -1);
    procedure RemoveControl(AControl: TControl);
    function IndexOf(AControl: TControl): Integer;
    function Owner: TCustomEasyGrid;
    property Controls[AColumn, ARow: Integer]: TControl read GetControl write SetControl;
    property ControlItems[AColumn, ARow: Integer] : TCtrlItem read GetControlItem;
    property Items[Index: Integer]: TCtrlItem read GetItem write SetItem; default;
  end;

  TCustomEasyGrid = class(TCustomControl)
  private
    FCtrlCollection: TCtrlCollection;
    FRunMode:TRunMode;   //  add  by liuzhigang in 2004.07.29
    FDatalink:TEasyGridDataLink;
//---------------------------------------------------
    FAnchor: TGridCoord;            // 鼠标释放坐标
    FSelStart, FSelEnd: TGridCoord; // 选择区域起止坐标
    FBorderStyle: TBorderStyle;     // 边框风格
    FCanEditModify: Boolean;
    FColCount: Longint;
    FColWidths: Pointer;
    FTabStops: Pointer;
    FColCanSizes: Pointer;
    FRowCanSizes: Pointer;
    FCurrent: TGridCoord;            // 当前网格坐标
    FDefaultColWidth: Integer;
    FDefaultRowHeight: Integer;
    FFixedCols: Integer;
    FFixedRows: Integer;
    FFixedLineColor: TColor;         // 固定区线条颜色
    FClientLineColor: TColor;        // 活动区线条颜色
    FGridLineWidth: Integer;
    FOptions: TEasyGridOptions;
    FRowCount: Longint;
    FRowHeights: Pointer;
    FScrollBars: TScrollStyle;
    FTopLeft: TGridCoord;             // 当前左上角网格坐标
    FSizingIndex: Longint;            // 被 Sizing 的行(列)号
    FSizingPos, FSizingOfs: Integer;  // Sizing前鼠标位置与偏移量
    FHitTest: TPoint;                 // 鼠标点击位置
    FInplaceEdit: TInplaceEdit;
//----------------------------------------------------
    FInplaceCol, FInplaceRow: Longint;// InplaceEditor 所在行列( -1 隐藏)
    FColOffset: Integer;              // 只有一个活动列时,该列左边被隐藏部分的宽度
    FDefaultDrawing: Boolean;
    FEditorMode: Boolean;             // InplaceEditor 是否可见
    FEditText:String;

    //User Define
    FCells: TCells;                   // TList(TList1,TList2,...)
    FShowColTitle: Boolean;           // 是否显示行列标题
    FShowRowTitle: Boolean;
    FTitleColor: TColor;              // 标题栏颜色
    FHighLightColor: TColor;          // 高亮度背景颜色
    FHighLightTextColor: TColor;      // 高亮度文本颜色
    FFocusedTitleColor: TColor;       // 当前标题栏文本颜色

    FDataStyle : TDataStyle;
    FAlignMode : TAlignMode;
    FShowForeText : Boolean;
    FReadOnly : Boolean;
    FCellLock : Boolean;
    FAutoWordBreak : Boolean;
    FCellLineWidth : Integer;
    FCellPenStyle : TPenStyle;
    FAllowNegative : Boolean;
    FTrailingZero : Boolean;
    FZeroNull : Boolean;
    FThousandSep : Boolean;
    FMaxLength : Integer;
    FIntLength : Integer;
    FDecLength : Integer;
    FColor : TColor;

    FFontName  : string;
    FFontSize  : Integer;
    FFontColor : TColor;
    FFontStyle : TFontStyles;

    FEditUpdate: Integer;
    FAlwaysDrawFocus: Boolean;        // 是否总是显示粗焦点框
    FClientSizeable: Boolean;         // 活动区域能否 Size

⌨️ 快捷键说明

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