home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / DBGRIDS.INT < prev    next >
Text File  |  1997-02-28  |  12KB  |  310 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Delphi Visual Component Library                 }
  5. {                                                       }
  6. {       Copyright (c) 1995,96 Borland International     }
  7. {                                                       }
  8. {*******************************************************}
  9.  
  10. unit DBGrids;
  11.  
  12. {$R-}
  13.  
  14. interface
  15.  
  16. uses Windows, SysUtils, Messages, Classes, Controls, Forms,
  17.   stdctrls,
  18.   Graphics, DB, DBTables, Grids, DBCtrls;
  19.  
  20. type
  21.   TColumnValue = (cvColor, cvWidth, cvFont, cvAlignment, cvReadOnly, cvTitleColor,
  22.     cvTitleCaption, cvTitleAlignment, cvTitleFont);
  23.   TColumnValues = set of TColumnValue;
  24.  
  25. const
  26.   ColumnTitleValues = [cvTitleColor..cvTitleFont];
  27.   cm_DeferLayout = WM_USER + 100;
  28.  
  29. { TColumn defines internal storage for column attributes.  Values assigned
  30.   to properties are stored in this object, the grid- or field-based default
  31.   sources are not modified.  Values read from properties are the previously
  32.   assigned value, if any, or the grid- or field-based default values if
  33.   nothing has been assigned to that property. This class also publishes the
  34.   column attribute properties for persistent storage.  }
  35. type
  36.   TColumn = class;
  37.   TCustomDBGrid = class;
  38.  
  39.   TColumnTitle = class(TPersistent)
  40.   protected
  41.     procedure RefreshDefaultFont;
  42.   public
  43.     constructor Create(Column: TColumn);
  44.     destructor Destroy; override;
  45.     procedure Assign(Source: TPersistent); override;
  46.     function DefaultAlignment: TAlignment;
  47.     function DefaultColor: TColor;
  48.     function DefaultFont: TFont;
  49.     function DefaultCaption: string;
  50.     procedure RestoreDefaults; virtual;
  51.   published
  52.     property Alignment: TAlignment;
  53.     property Caption: string;
  54.     property Color: TColor;
  55.     property Font: TFont;
  56.   end;
  57.  
  58.   TColumnButtonStyle = (cbsAuto, cbsEllipsis, cbsNone);
  59.  
  60.   TColumn = class(TCollectionItem)
  61.   protected
  62.     function  CreateTitle: TColumnTitle; virtual;
  63.     function  GetGrid: TCustomDBGrid;
  64.     procedure RefreshDefaultFont;
  65.   public
  66.     constructor Create(Collection: TCollection); override;
  67.     destructor Destroy; override;
  68.     procedure Assign(Source: TPersistent); override;
  69.     function  DefaultAlignment: TAlignment;
  70.     function  DefaultColor: TColor;
  71.     function  DefaultFont: TFont;
  72.     function  DefaultReadOnly: Boolean;
  73.     function  DefaultWidth: Integer;
  74.     procedure RestoreDefaults; virtual;
  75.     property  AssignedValues: TColumnValues;
  76.     property  Field: TField;
  77.   published
  78.     property  Alignment: TAlignment;
  79.     property  ButtonStyle: TColumnButtonStyle default cbsAuto;
  80.     property  Color: TColor;
  81.     property  DropDownRows: Integer default 7;
  82.     property  FieldName: String;
  83.     property  Font: TFont;
  84.     property  PickList: TStrings;
  85.     property  ReadOnly: Boolean;
  86.     property  Title: TColumnTitle;
  87.     property  Width: Integer;
  88.   end;
  89.  
  90.   TColumnClass = class of TColumn;
  91.  
  92.   TDBGridColumnsState = (csDefault, csCustomized);
  93.  
  94.   TDBGridColumns = class(TCollection)
  95.   protected
  96.     procedure Update(Item: TCollectionItem); override;
  97.   public
  98.     constructor Create(Grid: TCustomDBGrid; ColumnClass: TColumnClass);
  99.     function  Add: TColumn;
  100.     procedure RestoreDefaults;
  101.     procedure RebuildColumns;
  102.     property State: TDBGridColumnsState;
  103.     property Grid: TCustomDBGrid;
  104.     property Items[Index: Integer]: TColumn; default;
  105.   end;
  106.  
  107.   TGridDataLink = class(TDataLink)
  108.   protected
  109.     procedure ActiveChanged; override;
  110.     procedure DataSetChanged; override;
  111.     procedure DataSetScrolled(Distance: Integer); override;
  112.     procedure FocusControl(Field: TFieldRef); override;
  113.     procedure EditingChanged; override;
  114.     procedure LayoutChanged; override;
  115.     procedure RecordChanged(Field: TField); override;
  116.     procedure UpdateData; override;
  117.     function  GetMappedIndex(ColIndex: Integer): Integer;
  118.   public
  119.     constructor Create(AGrid: TCustomDBGrid);
  120.     destructor Destroy; override;
  121.     function AddMapping(const FieldName: string): Boolean;
  122.     procedure ClearMapping;
  123.     procedure Modified;
  124.     procedure Reset;
  125.     property DefaultFields: Boolean;
  126.     property FieldCount: Integer;
  127.     property Fields[I: Integer]: TField;
  128.     property SparseMap: Boolean;
  129.   end;
  130.  
  131.   TBookmarkList = class
  132.   protected
  133.     function CurrentRow: TBookmarkStr;  // shortcut to grid.datasource...
  134.     function Compare(const Item1, Item2: TBookmarkStr): Integer;
  135.     procedure LinkActive(Value: Boolean);
  136.   public
  137.     constructor Create(AGrid: TCustomDBGrid);
  138.     destructor Destroy; override;
  139.     procedure Clear;           // free all bookmarks
  140.     procedure Delete;          // delete all selected rows from dataset
  141.     function  Find(const Item: TBookmarkStr; var Index: Integer): Boolean;
  142.     function  IndexOf(const Item: TBookmarkStr): Integer;
  143.     function  Refresh: Boolean;// drop orphaned bookmarks; True = orphans found
  144.     property Count: Integer;
  145.     property CurrentRowSelected: Boolean;
  146.     property Items[Index: Integer]: TBookmarkStr; default;
  147.   end;
  148.  
  149.   TDBGridOption = (dgEditing, dgAlwaysShowEditor, dgTitles, dgIndicator,
  150.     dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect,
  151.     dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit, dgMultiSelect);
  152.   TDBGridOptions = set of TDBGridOption;
  153.  
  154.   { The DBGrid's DrawDataCell virtual method and OnDrawDataCell event are only
  155.     called when the grid's Columns.State is csDefault.  This is for compatibility
  156.     with existing code. These routines don't provide sufficient information to
  157.     determine which column is being drawn, so the column attributes aren't
  158.     easily accessible in these routines.  Column attributes also introduce the
  159.     possibility that a column's field may be nil, which would break existing
  160.     DrawDataCell code.   DrawDataCell, OnDrawDataCell, and DefaultDrawDataCell
  161.     are obsolete, retained for compatibility purposes. }
  162.   TDrawDataCellEvent = procedure (Sender: TObject; const Rect: TRect; Field: TField;
  163.     State: TGridDrawState) of object;
  164.  
  165.   { The DBGrid's DrawColumnCell virtual method and OnDrawColumnCell event are
  166.     always called, when the grid has defined column attributes as well as when
  167.     it is in default mode.  These new routines provide the additional
  168.     information needed to access the column attributes for the cell being
  169.     drawn, and must support nil fields.  }
  170.  
  171.   TDrawColumnCellEvent = procedure (Sender: TObject; const Rect: TRect;
  172.     DataCol: Integer; Column: TColumn; State: TGridDrawState) of object;
  173.  
  174.   TCustomDBGrid = class(TCustomGrid)
  175.   protected
  176.     FUpdateFields: Boolean;
  177.     FAcquireFocus: Boolean;
  178.     function  RawToDataColumn(ACol: Integer): Integer;
  179.     function  DataToRawColumn(ACol: Integer): Integer;
  180.     function  AcquireLayoutLock: Boolean;
  181.     procedure BeginLayout;
  182.     procedure BeginUpdate;
  183.     procedure CancelLayout;
  184.     function  CanEditAcceptKey(Key: Char): Boolean; override;
  185.     function  CanEditModify: Boolean; override;
  186.     function  CanEditShow: Boolean; override;
  187.     procedure ColumnMoved(FromIndex, ToIndex: Longint); override;
  188.     procedure ColEnter; dynamic;
  189.     procedure ColExit; dynamic;
  190.     procedure ColWidthsChanged; override;
  191.     function  CreateColumns: TDBGridColumns; dynamic;
  192.     function  CreateEditor: TInplaceEdit; override;
  193.     procedure CreateWnd; override;
  194.     procedure DeferLayout;
  195.     procedure DefineFieldMap; virtual;
  196.     procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
  197.     procedure DrawDataCell(const Rect: TRect; Field: TField;
  198.       State: TGridDrawState); dynamic; { obsolete }
  199.     procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
  200.       Column: TColumn; State: TGridDrawState); dynamic;
  201.     procedure EditButtonClick; dynamic;
  202.     procedure EndLayout;
  203.     procedure EndUpdate;
  204.     function  GetColField(DataCol: Integer): TField;
  205.     function  GetEditLimit: Integer; override;
  206.     function  GetEditMask(ACol, ARow: Longint): string; override;
  207.     function  GetEditText(ACol, ARow: Longint): string; override;
  208.     function  GetFieldValue(ACol: Integer): string;
  209.     function  HighlightCell(DataCol, DataRow: Integer; const Value: string;
  210.       AState: TGridDrawState): Boolean; virtual;
  211.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  212.     procedure KeyPress(var Key: Char); override;
  213.     procedure LayoutChanged; virtual;
  214.     procedure LinkActive(Value: Boolean); virtual;
  215.     procedure Loaded; override;
  216.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  217.       X, Y: Integer); override;
  218.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  219.     procedure Scroll(Distance: Integer); virtual;
  220.     procedure SetColumnAttributes; virtual;
  221.     procedure SetEditText(ACol, ARow: Longint; const Value: string); override;
  222.     function  StoreColumns: Boolean;
  223.     procedure TimedScroll(Direction: TGridScrollDirection); override;
  224.     property Columns: TDBGridColumns;
  225.     property DefaultDrawing: Boolean default True;
  226.     property DataSource: TDataSource;
  227.     property DataLink: TGridDataLink;
  228.     property IndicatorOffset: Byte;
  229.     property LayoutLock: Byte;
  230.     property Options: TDBGridOptions default [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit];
  231.     property ParentColor default False;
  232.     property ReadOnly: Boolean default False;
  233.     property SelectedRows: TBookmarkList;
  234.     property TitleFont: TFont;
  235.     property UpdateLock: Byte;
  236.     property OnColEnter: TNotifyEvent;
  237.     property OnColExit: TNotifyEvent;
  238.     property OnDrawDataCell: TDrawDataCellEvent; { obsolete }
  239.     property OnDrawColumnCell: TDrawColumnCellEvent;
  240.     property OnEditButtonClick: TNotifyEvent;
  241.     property OnColumnMoved: TMovedEvent;
  242.   public
  243.     constructor Create(AOwner: TComponent); override;
  244.     destructor Destroy; override;
  245.     procedure DefaultDrawDataCell(const Rect: TRect; Field: TField;
  246.       State: TGridDrawState); { obsolete }
  247.     procedure DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer;
  248.       Column: TColumn; State: TGridDrawState);
  249.     function ValidFieldIndex(FieldIndex: Integer): Boolean;
  250.     property EditorMode;
  251.     property FieldCount: Integer;
  252.     property Fields[FieldIndex: Integer]: TField;
  253.     property SelectedField: TField;
  254.     property SelectedIndex: Integer;
  255.   end;
  256.  
  257.   TDBGrid = class(TCustomDBGrid)
  258.   public
  259.     property Canvas;
  260.     property SelectedRows;
  261.   published
  262.     property Align;
  263.     property BorderStyle;
  264.     property Color;
  265.     property Columns stored StoreColumns;
  266.     property Ctl3D;
  267.     property DataSource;
  268.     property DefaultDrawing;
  269.     property DragCursor;
  270.     property DragMode;
  271.     property Enabled;
  272.     property FixedColor;
  273.     property Font;
  274.     property ImeMode;
  275.     property ImeName;
  276.     property Options;
  277.     property ParentColor;
  278.     property ParentCtl3D;
  279.     property ParentFont;
  280.     property ParentShowHint;
  281.     property PopupMenu;
  282.     property ReadOnly;
  283.     property ShowHint;
  284.     property TabOrder;
  285.     property TabStop;
  286.     property TitleFont;
  287.     property Visible;
  288.     property OnColEnter;
  289.     property OnColExit;
  290.     property OnColumnMoved;
  291.     property OnDrawDataCell;  { obsolete }
  292.     property OnDrawColumnCell;
  293.     property OnDblClick;
  294.     property OnDragDrop;
  295.     property OnDragOver;
  296.     property OnEditButtonClick;
  297.     property OnEndDrag;
  298.     property OnEnter;
  299.     property OnExit;
  300.     property OnKeyDown;
  301.     property OnKeyPress;
  302.     property OnKeyUp;
  303.     property OnStartDrag;
  304.   end;
  305.  
  306. const
  307.   IndicatorWidth = 11;
  308.  
  309. implementation
  310.