MdRView.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit MdRView;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   Grids, DB, StdCtrls;
  6. type
  7.   TMdRecordView = class(TCustomGrid)
  8.   private
  9.     // data-aware support
  10.     FDataLink: TDataLink;
  11.     function GetDataSource: TDataSource;
  12.     procedure SetDataSource (Value: TDataSource);
  13.   protected
  14.     // redefined TCustomGrid methods
  15.     procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
  16.       AState: TGridDrawState); override;
  17.     procedure ColWidthsChanged; override;
  18.     procedure RowHeightsChanged; override;
  19.   public
  20.     constructor Create (AOwner: TComponent); override;
  21.     destructor Destroy; override;
  22.     procedure SetBounds (ALeft, ATop, AWidth,
  23.       AHeight: Integer); override;
  24.     // parent properties
  25.     property Canvas;
  26.     property Col;
  27.     property ColWidths;
  28.     property EditorMode;
  29.     property GridHeight;
  30.     property GridWidth;
  31.     property LeftCol;
  32.     property Selection;
  33.     property Row;
  34.     property RowHeights;
  35.     property TabStops;
  36.     property TopRow;
  37.   published
  38.     // data-aware properties
  39.     property DataSource: TDataSource
  40.       read GetDataSource write SetDataSource;
  41.     // parent properties
  42.     property Align;
  43.     property BorderStyle;
  44.     property Color;
  45.     property Ctl3D;
  46.     property DefaultColWidth;
  47.     property DefaultRowHeight;
  48.     property DragCursor;
  49.     property DragMode;
  50.     property Enabled;
  51.     property FixedColor;
  52.     property Font;
  53.     property GridLineWidth;
  54.     property ParentColor;
  55.     property ParentCtl3D;
  56.     property ParentFont;
  57.     property ParentShowHint;
  58.     property PopupMenu;
  59.     property ShowHint;
  60.     property TabOrder;
  61.     property TabStop;
  62.     property Visible;
  63.     property VisibleColCount;
  64.     property VisibleRowCount;
  65.     property OnClick;
  66.     property OnDblClick;
  67.     property OnDragDrop;
  68.     property OnDragOver;
  69.     property OnEndDrag;
  70.     property OnEnter;
  71.     property OnExit;
  72.     property OnKeyDown;
  73.     property OnKeyPress;
  74.     property OnKeyUp;
  75.     property OnMouseDown;
  76.     property OnMouseMove;
  77.     property OnMouseUp;
  78.     property OnStartDrag;
  79.   end;
  80. procedure Register;
  81. implementation
  82. ////// Custom DataLink //////
  83. type
  84.   TMdRecordLink = class (TDataLink)
  85.   private
  86.     RView: TMdRecordView;
  87.   public
  88.     constructor Create (View: TMdRecordView);
  89.     procedure ActiveChanged; override;
  90.     procedure RecordChanged(Field: TField); override;
  91.   end;
  92. constructor TMdRecordLink.Create (View: TMdRecordView);
  93. begin
  94.   inherited Create;
  95.   RView := View;
  96. end;
  97. procedure TMdRecordLink.ActiveChanged;
  98. var
  99.   I: Integer;
  100. begin
  101.   // set number of rows
  102.   if Assigned (DataSet) then
  103.   begin
  104.     RView.RowCount := DataSet.FieldCount;
  105.     // double the height of memo and graphics
  106.     for I := 0 to DataSet.FieldCount - 1 do
  107.       if DataSet.Fields [I] is TBlobField then
  108.         RView.RowHeights [I] := RView.DefaultRowHeight * 2;
  109.     // repaint all...
  110.     RView.Invalidate;
  111.   end;
  112. end;
  113. procedure TMdRecordLink.RecordChanged;
  114. begin
  115.   inherited;
  116.   // repaint all...
  117.   RView.Invalidate;
  118. end;
  119. ////// data-aware component //////
  120. constructor TMdRecordView.Create (AOwner: TComponent);
  121. begin
  122.   FDataLink := TMdRecordLink.Create (self);
  123.   inherited Create (AOwner);
  124.   // set numbers of cells and fixed cells
  125.   RowCount := 2; // default
  126.   ColCount := 2;
  127.   FixedCols := 1;
  128.   FixedRows := 0;
  129.   {grid options -- choose among:
  130.     goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
  131.     goRangeSelect, goDrawFocusSelected, goRowSizing, goColSizing,
  132.     goRowMoving, goColMoving, goEditing, goTabs, goRowSelect,
  133.     goAlwaysShowEditor, goThumbTracking}
  134.   Options := [goFixedVertLine, goFixedHorzLine,
  135.     goVertLine, goHorzLine, goRowSizing, goColSizing];
  136.   DefaultDrawing := False;
  137.   ScrollBars := ssVertical;
  138.   // FSaveCellExtents := False;
  139. end;
  140. destructor TMdRecordView.Destroy;
  141. begin
  142.   FDataLink.Free;
  143.   FDataLink := nil;
  144.   inherited Destroy;
  145. end;
  146. procedure TMdRecordView.SetBounds (ALeft, ATop,
  147.   AWidth, AHeight: Integer);
  148. begin
  149.   inherited;
  150.   ColWidths [1] := Width - ColWidths [0] -
  151.     GridLineWidth * 3 -
  152.     GetSystemMetrics (sm_CXVScroll)
  153.     - 2; // border
  154. end;
  155. procedure TMdRecordView.ColWidthsChanged;
  156. begin
  157.   ColWidths [1] := Width - ColWidths [0] -
  158.     GridLineWidth * 3 -
  159.     GetSystemMetrics (sm_CXVScroll)
  160.     - 2; // border
  161. end;
  162. // grid drawing
  163. procedure TMdRecordView.DrawCell(ACol, ARow: Longint;
  164.   ARect: TRect; AState: TGridDrawState);
  165. var
  166.   Text: string;
  167.   CurrField: TField;
  168.   Bmp: TBitmap;
  169. begin
  170.   CurrField := nil;
  171.   Text := '[]'; // default
  172.   // paint background
  173.   if (ACol = 0) then
  174.     Canvas.Brush.Color := FixedColor
  175.   else
  176.     Canvas.Brush.Color := Color;
  177.   Canvas.FillRect (ARect);
  178.   // leave small border
  179.   InflateRect (ARect, -2, -2);
  180.   if (FDataLink.DataSource <> nil) and
  181.     FDataLink.Active then
  182.   begin
  183.     CurrField := FDataLink.DataSet.Fields[ARow];
  184.     if ACol = 0 then
  185.       Text := CurrField.DisplayName
  186.     else if CurrField is TMemoField then
  187.       Text := TMemoField (CurrField).AsString
  188.     else
  189.       Text := CurrField.DisplayText;
  190.   end;
  191.   if (ACol = 1) and (CurrField is TGraphicField) then
  192.   begin
  193.     Bmp := TBitmap.Create;
  194.     try
  195.       Bmp.Assign (CurrField);
  196.       Canvas.StretchDraw (ARect, Bmp);
  197.     finally
  198.       Bmp.Free;
  199.     end;
  200.   end
  201.   else if (ACol = 1) and (CurrField is TMemoField) then
  202.   begin
  203.     DrawText (Canvas.Handle,
  204.       PChar (Text), Length (Text),
  205.       ARect, dt_WordBreak or dt_NoPrefix)
  206.   end
  207.   else // draw single line vertically centered
  208.     DrawText (Canvas.Handle,
  209.       PChar (Text), Length (Text), ARect,
  210.       dt_vcenter or dt_SingleLine or dt_NoPrefix);
  211.   if gdFocused in AState then
  212.     Canvas.DrawFocusRect (ARect);
  213. end;
  214. // data-aware support
  215. function TMdRecordView.GetDataSource: TDataSource;
  216. begin
  217.   Result := FDataLink.DataSource;
  218. end;
  219. procedure TMdRecordView.SetDataSource (Value: TDataSource);
  220. begin
  221.   FDataLink.DataSource := Value;
  222. end;
  223. procedure Register;
  224. begin
  225.   RegisterComponents('Md', [TMdRecordView]);
  226. end;
  227. procedure TMdRecordView.RowHeightsChanged;
  228. begin
  229.   inherited;
  230.   // refresh actual values
  231.   (FDataLink as TMdRecordLink).ActiveChanged;
  232. end;
  233. end.