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

Delphi控件源码

开发平台:

Delphi

  1. unit MdRepPr;   
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Controls, Forms,
  5.   ComCtrls, DB, DBCtrls;
  6. type
  7.   TMdDbRepProgress = class(TProgressBar)
  8.   private
  9.     FDataLink: TFieldDataLink;
  10.     FPaintControl: TPaintControl;
  11.     function GetDataField: string;
  12.     procedure SetDataField (Value: string);
  13.     function GetDataSource: TDataSource;
  14.     procedure SetDataSource (Value: TDataSource);
  15.     function GetField: TField;
  16.     // DbCtrlGrid support
  17.     procedure CmGetDataLink (var Msg: TMessage);
  18.       message cm_GetDataLink;
  19.     procedure WmPaint (var Msg: TWmPaint);
  20.       message wm_Paint;
  21.     function GetPos: Integer;
  22.   protected
  23.     procedure WndProc(var Message: TMessage); override;
  24.     // data link event handler
  25.     procedure DataChange (Sender: TObject);
  26.   public
  27.     constructor Create (AOwner: TComponent); override;
  28.     destructor Destroy; override;
  29.     property Field: TField read GetField;
  30.   published
  31.     property DataField: string
  32.       read GetDataField write SetDataField;
  33.     property DataSource: TDataSource
  34.       read GetDataSource write SetDataSource;
  35.   end;
  36. procedure Register;
  37. implementation
  38. uses
  39.   Dialogs, CommCtrl, DbCGrids;
  40. constructor TMdDbRepProgress.Create (AOwner: TComponent);
  41. begin
  42.   inherited Create (AOwner);
  43.   FDataLink := TFieldDataLink.Create;
  44.   FDataLink.Control := self;
  45.   FDataLink.OnDataChange := DataChange;
  46.   // enable use in DBCtrlGrid
  47.   ControlStyle := ControlStyle + [csReplicatable];
  48.   FPaintControl := TPaintControl.Create(
  49.     self, PROGRESS_CLASS);
  50. end;
  51. destructor TMdDbRepProgress.Destroy;
  52. begin
  53.   FDataLink.Free;
  54.   FDataLink := nil;
  55.   FPaintControl.Free;
  56.   inherited Destroy;
  57. end;
  58. function TMdDbRepProgress.GetDataField: string;
  59. begin
  60.   Result := FDataLink.FieldName;
  61. end;
  62. procedure TMdDbRepProgress.SetDataField (Value: string);
  63. begin
  64.   FDataLink.FieldName := Value;
  65. end;
  66. function TMdDbRepProgress.GetDataSource: TDataSource;
  67. begin
  68.   Result := FDataLink.DataSource;
  69. end;
  70. procedure TMdDbRepProgress.SetDataSource (Value: TDataSource);
  71. begin
  72.   FDataLink.DataSource := Value;
  73. end;
  74. function TMdDbRepProgress.GetField: TField;
  75. begin
  76.   Result := FDataLink.Field;
  77. end;
  78. // data link event handler
  79. procedure TMdDbRepProgress.DataChange (Sender: TObject);
  80. begin
  81.   SendMessage(Handle, Wm_SetRedraw, 0, 0);
  82.   Position := GetPos;
  83.   SendMessage(Handle, Wm_SetRedraw, 1, 0);
  84.   if HandleAllocated then
  85.     RedrawWindow (Handle, nil, 0,
  86.       RDW_INVALIDATE or RDW_ERASE or RDW_FRAME);
  87. end;
  88. function TMdDbRepProgress.GetPos;
  89. begin
  90.   if (FDataLink.Field <> nil) and
  91.       (FDataLink.Field is TNumericField) then
  92.     Result := FDataLink.Field.AsInteger
  93.   else
  94.     Result := Min;
  95. end;
  96. // DBCtrlGrid support methods
  97. procedure TMdDbRepProgress.CmGetDataLink (var Msg: TMessage);
  98. begin
  99.   Msg.Result := Integer (fDataLink);
  100. end;
  101. procedure TMdDbRepProgress.WmPaint (var Msg: TWmPaint);
  102. begin
  103.   if not (csPaintCopy in ControlState) then
  104.     inherited
  105.   else
  106.   begin
  107.     SendMessage(FPaintControl.Handle, Wm_SetRedraw, 0, 0);
  108.     SendMessage(FPaintControl.Handle, PBM_SETRANGE32, Min, Max);
  109.     SendMessage(FPaintControl.Handle, PBM_SETPOS, GetPos, 0);
  110.     SendMessage(FPaintControl.Handle, PBM_SETSTEP, Step, 0);
  111.     SendMessage(FPaintControl.Handle, Wm_SetRedraw, 1, 0);   
  112.     SendMessage(FPaintControl.Handle,
  113.       wm_Paint, Msg.DC, 0);
  114.   end;
  115. end;
  116. procedure TMdDbRepProgress.WndProc(var Message: TMessage);
  117. begin
  118.   with Message do
  119.     if (Msg = WM_CREATE) or
  120.         (Msg = WM_WINDOWPOSCHANGED) then
  121.       FPaintControl.DestroyHandle;
  122.   inherited;
  123. end;
  124. procedure Register;
  125. begin
  126.   RegisterComponents('Md', [TMdDbRepProgress]);
  127. end;
  128. end.