home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1996 August / VPR9608A.BIN / del20try / install / data.z / DATAEDIT.PAS < prev    next >
Pascal/Delphi Source File  |  1996-05-08  |  4KB  |  149 lines

  1. unit DataEdit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   Grids, Calendar, DB, DBTables;
  8.  
  9. type
  10.   TDBRWCalendar = class(TCalendar)
  11.   private
  12.     FDataLink: TFieldDataLink;  { field for data link }
  13.     procedure DataChange(Sender: TObject); { called when data changes }
  14.     function GetDataField: string;
  15.     function GetDataSource: TDataSource;
  16.     procedure SetDataField(const Value: string);
  17.     procedure SetDataSource(Value: TDataSource);
  18.     procedure UpdateData(Sender: TObject); { called when control changes }
  19.     procedure CMExit(var Message: TCMExit); message CM_EXIT; { called to update data }
  20.   protected
  21.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  22.       X, Y: Integer); override;
  23.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  24.     procedure Change; override;
  25.   public
  26.     constructor Create(AOwner: TComponent); override;
  27.     destructor Destroy; override;
  28.   published
  29.     property DataField: string  read GetDataField write SetDataField;
  30.     property DataSource: TDataSource  read GetDataSource write SetDataSource;
  31.   end;
  32.  
  33. procedure Register;
  34.  
  35. implementation
  36.  
  37. procedure Register;
  38. begin
  39.   RegisterComponents('Samples', [TDBRWCalendar]);
  40. end;
  41.  
  42. constructor TDBRWCalendar.Create(AOwner: TComponent);
  43. begin
  44.   inherited Create(AOwner); { Always call the inherited constructor }
  45.   FDataLink := TFieldDataLink.Create; { construct data-link object }
  46.   FDataLink.OnDataChange := DataChange; { attach method to event }
  47.   FDataLink.OnUpdateData := UpdateData; { attach method to event }
  48. end;
  49.  
  50. destructor TDBRWCalendar.Destroy;
  51. begin
  52.   FDataLink.Free; { dispose of data-link object }
  53.   inherited Destroy; { then call inherited destructor }
  54. end;
  55.  
  56. procedure TDBRWCalendar.DataChange(Sender: TObject);
  57. begin
  58.   if FDataLink.Field = nil then { if there is no field assigned... }
  59.     CalendarDate := 0 { ...set to invalid date }
  60.   else CalendarDate := FDataLink.Field.AsDateTime; { otherwise, set to new data }
  61. end;
  62.  
  63. function TDBRWCalendar.GetDataField: string;
  64. begin
  65.   Result := FDataLink.FieldName; { pass through field name from data link }
  66. end;
  67.  
  68. function TDBRWCalendar.GetDataSource: TDataSource;
  69. begin
  70.   Result := FDataLink.DataSource; { pass through data source from data link }
  71. end;
  72.  
  73. procedure TDBRWCalendar.SetDataField(const Value: string);
  74. begin
  75.   FDataLink.FieldName := Value; { pass through field name to data link }
  76. end;
  77.  
  78. procedure TDBRWCalendar.SetDataSource(Value: TDataSource);
  79. begin
  80.   FDataLink.DataSource := Value; { pass through data source to data link }
  81. end;
  82.  
  83. { UpdateData
  84.  
  85.   UpdateData is only called after calls to both FDataLink.Modified and
  86.   FDataLink.UpdateRecord. }
  87.  
  88. procedure TDBRWCalendar.UpdateData(Sender: TObject);
  89. begin
  90.   FDataLink.Field.AsDateTime := CalendarDate; { set field data to calendar date }
  91. end;
  92.  
  93. { MouseDown
  94.  
  95.   Only process the mouse-down if the data link can edit the data. Otherwise,
  96.   just call the event handler to let the user handle the mouse-down event. }
  97.  
  98. procedure TDBRWCalendar.MouseDown(Button: TMouseButton; Shift: TShiftState;
  99.   X, Y: Integer);
  100. var
  101.   MyMouseDown: TMouseEvent;
  102. begin
  103.   if not ReadOnly and FDataLink.Edit then
  104.     inherited MouseDown(Button, Shift, X, Y)
  105.   else
  106.   begin
  107.     MyMouseDown := OnMouseDown;
  108.     if Assigned(MyMouseDown) then MyMouseDown(Self, Button, Shift, X, Y);
  109.   end;
  110. end;
  111.  
  112. { KeyDown
  113.  
  114.   Only process the key-down if the data link can edit the data. Otherwise,
  115.   just call the event handler to let the user handle the key-down event. }
  116.  
  117. procedure TDBRWCalendar.KeyDown(var Key: Word; Shift: TShiftState);
  118. var
  119.   MyKeyDown: TKeyEvent;
  120. begin
  121.   if not ReadOnly and (Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_END,
  122.     VK_HOME, VK_PRIOR, VK_NEXT]) and FDataLink.Edit then
  123.     inherited KeyDown(Key, Shift)
  124.   else
  125.   begin
  126.     MyKeyDown := OnKeyDown;
  127.     if Assigned(MyKeyDown) then MyKeyDown(Self, Key, Shift);
  128.   end;
  129. end;
  130.  
  131. procedure TDBRWCalendar.Change;
  132. begin
  133.   FDataLink.Modified; { tell data link that data changed }
  134.   inherited Change; { and call inherited, which calls event handler }
  135. end;
  136.  
  137. procedure TDBRWCalendar.CMExit(var Message: TCMExit);
  138. begin
  139.   try
  140.     FDataLink.UpdateRecord; { tell data link to update database }
  141.   except
  142.     SetFocus; { if it failed, don't let focus leave }
  143.     raise;
  144.   end;
  145.   inherited;
  146. end;
  147.  
  148. end.
  149.