home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d56 / RMCTL.ZIP / rmEditGrid.pas < prev    next >
Pascal/Delphi Source File  |  2001-06-22  |  10KB  |  372 lines

  1. {================================================================================
  2. Copyright (C) 1997-2001 Mills Enterprise
  3.  
  4. Unit     : rmEditGrid
  5. Purpose  : Standard Grids (String/Draw) with enhanced inplace editing capabilities.
  6. Date     : 10-05-2000
  7. Author   : Ryan J. Mills
  8. Version  : 1.80
  9. ================================================================================}
  10.  
  11. unit rmEditGrid;
  12.  
  13. interface
  14.  
  15. {$I CompilerDefines.INC}
  16.  
  17. uses
  18.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, grids, buttons,
  19.   StdCtrls, ExtCtrls;
  20.  
  21. type
  22.   TrmEditGridEditEvent = procedure(Sender: TObject; aCol, aRow, popx, popy: integer) of Object;
  23.   TrmEditGridBeforeSelectCellEvent = procedure(Sender: TObject; aCol, aRow : integer; var ShowButton, ButtonEnabled: boolean) of object;
  24.  
  25.   TrmEditDrawGrid = class(TDrawGrid)
  26.   private
  27.     FButton: TSpeedButton;
  28.     fOnDoCellEdit: TrmEditGridEditEvent;
  29.     fOnBeforeCellSelect: TrmEditGridBeforeSelectCellEvent;
  30.     procedure ClickCell(X, Y: integer; LeftButton: Boolean);
  31.     procedure ButtonClick(Sender: TObject);
  32.   protected
  33.     procedure WndProc(var Message: TMessage); override;
  34.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  35.     function SelectCell(ACol, ARow: integer): boolean; override;
  36.     procedure TopLeftChanged; override;
  37.     procedure ColumnMoved(FromIndex, ToIndex: Longint); override;
  38.     procedure ColWidthsChanged; Override;
  39.     procedure DoExit; override;
  40.   public
  41.     constructor Create(AOwner: TComponent); override;
  42.     destructor Destroy; override;
  43.   published
  44.     property OnDoCellEdit: TrmEditGridEditEvent read fOnDoCellEdit write fOnDoCellEdit;
  45.     property OnBeforeCellSelect: TrmEditGridBeforeSelectCellEvent read fOnBeforeCellSelect write fOnBeforeCellSelect;
  46.   end;
  47.  
  48.   TrmEditGrid = class(TStringGrid)
  49.   private
  50.     FButton: TSpeedButton;
  51.     fOnDoCellEdit: TrmEditGridEditEvent;
  52.     fOnBeforeCellSelect: TrmEditGridBeforeSelectCellEvent;
  53.     procedure ClickCell(X, Y: integer; LeftButton: Boolean);
  54.     procedure ButtonClick(Sender: TObject);
  55.   protected
  56.     procedure WndProc(var Message: TMessage); override;
  57.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  58.     function SelectCell(ACol, ARow: integer): boolean; override;
  59.     procedure TopLeftChanged; override;
  60.     procedure ColumnMoved(FromIndex, ToIndex: Longint); override;
  61.     procedure ColWidthsChanged; Override;
  62.     procedure DoExit; override;
  63.   public
  64.     constructor Create(AOwner: TComponent); override;
  65.     destructor Destroy; override;
  66.   published
  67.     property OnDoCellEdit: TrmEditGridEditEvent read fOnDoCellEdit write fOnDoCellEdit;
  68.     property OnBeforeCellSelect: TrmEditGridBeforeSelectCellEvent read fOnBeforeCellSelect write fOnBeforeCellSelect;
  69.   end;
  70.  
  71. implementation
  72.  
  73. { TrmEditGrid }
  74.  
  75. procedure TrmEditGrid.ButtonClick(Sender: TObject);
  76. begin
  77.   FButton.Down := True;
  78.   try
  79.      ClickCell(TSpeedButton(Sender).Left, TSpeedButton(Sender).Top, True);
  80.   finally
  81.      FButton.Down := False;
  82.   end;
  83. end;
  84.  
  85. procedure TrmEditGrid.ClickCell(X, Y: integer; LeftButton: Boolean);
  86. var
  87.   P: TPoint;
  88.   mCol,
  89.     mRow: integer;
  90. begin
  91.   if not assigned(fOnDoCellEdit) then
  92.     exit;
  93.  
  94.   MouseToCell(X, Y, mCol, mRow);
  95.   if (mCol < 0) or (mRow < 0) then
  96.     Exit;
  97.  
  98.   if LeftButton then
  99.   begin
  100.     P.X := X;
  101.     P.Y := Y + 16;
  102.   end
  103.   else
  104.   begin
  105.     P.X := X;
  106.     P.Y := Y;
  107.   end;
  108.   P := ClientToScreen(P);
  109.   if ((mCol > 0) and (mCol < ColCount)) and ((mRow >= 0) and (mRow < RowCount)) and LeftButton then
  110.      fOnDoCellEdit(self, mcol, mrow, p.x, p.y);
  111. end;
  112.  
  113. procedure TrmEditGrid.ColumnMoved(FromIndex, ToIndex: Integer);
  114. begin
  115.   // Now let the control do the move ....
  116.   inherited ColumnMoved(FromIndex, ToIndex);
  117.   if FButton.Visible = True then
  118.   begin
  119.     FButton.Visible := False;
  120.     FButton.OnClick := nil;
  121.     SelectCell(Col, Row);
  122.   end;
  123. end;
  124.  
  125. procedure TrmEditGrid.ColWidthsChanged;
  126. begin
  127.   inherited ColWidthsChanged;
  128.   if FButton.Visible = True then
  129.   begin
  130.     FButton.Visible := False;
  131.     FButton.OnClick := nil;
  132.     SelectCell(Col, Row);
  133.   end;
  134. end;
  135.  
  136. constructor TrmEditGrid.Create(AOwner: TComponent);
  137. begin
  138.   inherited Create(AOwner);
  139.  
  140.   //creating the magic portion of our editor...
  141.   FButton := TSpeedButton.Create(nil);
  142.   FButton.GroupIndex := 1;
  143.   FButton.AllowAllUp := True;
  144.   FButton.Parent := Self;
  145.   FButton.Visible := False;
  146.   FButton.Caption := '...';
  147. end;
  148.  
  149. destructor TrmEditGrid.Destroy;
  150. begin
  151.   FButton.Free;
  152.   inherited;
  153. end;
  154.  
  155. procedure TrmEditGrid.DoExit;
  156. begin
  157.   FButton.Visible := False;
  158.   FButton.OnClick := nil;
  159.   inherited;
  160. end;
  161.  
  162. procedure TrmEditGrid.KeyDown(var Key: Word; Shift: TShiftState);
  163. begin
  164.   //Keyboard triggers for the editing stuff....
  165.   if (((key = VK_RETURN) and (Shift = [ssCtrl])) or ((Key = VK_SPACE) or (key = vk_f2))) and
  166.     fButton.visible then
  167.   begin
  168.     ButtonClick(FButton);
  169.   end;
  170.   inherited KeyDown(Key, Shift);
  171. end;
  172.  
  173. function TrmEditGrid.SelectCell(ACol, ARow: integer): boolean;
  174. var
  175.   Rect: TRect;
  176.   wCalc : integer;
  177.   fCanShow, fIsEnabled : boolean;
  178. begin
  179.   result := inherited SelectCell(ACol, ARow);
  180.  
  181.   FButton.Visible := False;
  182.   fButton.OnClick := nil;
  183.  
  184.   Rect := CellRect(ACol, ARow);
  185.   wCalc := Rect.Bottom - Rect.top;
  186.  
  187.   FButton.Top := Rect.Top;
  188.   FButton.Left := Rect.Right - wCalc;
  189.   FButton.Width := wCalc;
  190.   FButton.Height := wCalc;
  191.  
  192.   fCanShow := false;
  193.   fIsEnabled := false;
  194.  
  195.   if assigned(fOnBeforeCellSelect) then
  196.      fOnBeforeCellSelect(Self, acol, arow, fCanShow, fIsEnabled);
  197.  
  198.   fButton.onclick := ButtonClick;
  199.   FButton.Enabled := fIsEnabled;
  200.   FButton.Visible := fCanShow;
  201. end;
  202.  
  203. procedure TrmEditGrid.TopLeftChanged;
  204. begin
  205.   inherited TopLeftChanged;
  206.   if FButton.Visible = True then
  207.   begin
  208.     FButton.Visible := False;
  209.     FButton.OnClick := nil;
  210.     SelectCell(Col, Row);
  211.   end;
  212. end;
  213.  
  214. procedure TrmEditGrid.WndProc(var Message: TMessage);
  215. begin
  216.   //There is a better way to do this but....
  217.   if Message.Msg = WM_RBUTTONDOWN then
  218.     ClickCell(TWMMouse(Message).XPos, TWMMouse(Message).YPos, False);
  219.   inherited WndProc(Message);
  220. end;
  221.  
  222. { TrmEditDrawGrid }
  223.  
  224. procedure TrmEditDrawGrid.ButtonClick(Sender: TObject);
  225. begin
  226.   FButton.Down := True;
  227.   try
  228.      ClickCell(TSpeedButton(Sender).Left, TSpeedButton(Sender).Top, True);
  229.   finally
  230.      FButton.Down := False;
  231.   end;
  232. end;
  233.  
  234. procedure TrmEditDrawGrid.ClickCell(X, Y: integer; LeftButton: Boolean);
  235. var
  236.   P: TPoint;
  237.   mCol,
  238.     mRow: integer;
  239. begin
  240.   if not assigned(fOnDoCellEdit) then
  241.     exit;
  242.  
  243.   MouseToCell(X, Y, mCol, mRow);
  244.   if (mCol < 0) or (mRow < 0) then
  245.     Exit;
  246.  
  247.   if LeftButton then
  248.   begin
  249.     P.X := X;
  250.     P.Y := Y + 16;
  251.   end
  252.   else
  253.   begin
  254.     P.X := X;
  255.     P.Y := Y;
  256.   end;
  257.   P := ClientToScreen(P);
  258.   if ((mCol > 0) and (mCol < ColCount)) and ((mRow >= 0) and (mRow < RowCount)) and LeftButton then
  259.      fOnDoCellEdit(self, mcol, mrow, p.x, p.y);
  260. end;
  261.  
  262. procedure TrmEditDrawGrid.ColumnMoved(FromIndex, ToIndex: Integer);
  263. begin
  264.   // Now let the control do the move ....
  265.   inherited ColumnMoved(FromIndex, ToIndex);
  266.   if FButton.Visible = True then
  267.   begin
  268.     FButton.Visible := False;
  269.     FButton.OnClick := nil;
  270.     SelectCell(Col, Row);
  271.   end;
  272. end;
  273.  
  274. procedure TrmEditDrawGrid.ColWidthsChanged;
  275. begin
  276.   inherited ColWidthsChanged;
  277.   if FButton.Visible = True then
  278.   begin
  279.     FButton.Visible := False;
  280.     FButton.OnClick := nil;
  281.     SelectCell(Col, Row);
  282.   end;
  283. end;
  284.  
  285. constructor TrmEditDrawGrid.Create(AOwner: TComponent);
  286. begin
  287.   inherited Create(AOwner);
  288.  
  289.   //creating the magic portion of our editor...
  290.   FButton := TSpeedButton.Create(nil);
  291.   FButton.GroupIndex := 1;
  292.   FButton.AllowAllUp := True;
  293.   FButton.Parent := Self;
  294.   FButton.Visible := False;
  295.   FButton.Caption := '...';
  296. end;
  297.  
  298. destructor TrmEditDrawGrid.Destroy;
  299. begin
  300.   FButton.Free;
  301.   inherited;
  302. end;
  303.  
  304. procedure TrmEditDrawGrid.DoExit;
  305. begin
  306.   FButton.Visible := False;
  307.   FButton.OnClick := nil;
  308.   inherited;
  309. end;
  310.  
  311. procedure TrmEditDrawGrid.KeyDown(var Key: Word; Shift: TShiftState);
  312. begin
  313.   //Keyboard triggers for the editing stuff....
  314.   if (((key = VK_RETURN) and (Shift = [ssCtrl])) or ((Key = VK_SPACE) or (key = vk_f2))) and
  315.     fButton.visible then
  316.   begin
  317.     ButtonClick(FButton);
  318.   end;
  319.   inherited KeyDown(Key, Shift);
  320. end;
  321.  
  322. function TrmEditDrawGrid.SelectCell(ACol, ARow: integer): boolean;
  323. var
  324.   Rect: TRect;
  325.   wCalc : integer;
  326.   fCanShow, fIsEnabled : boolean;
  327. begin
  328.   result := inherited SelectCell(ACol, ARow);
  329.  
  330.   FButton.Visible := False;
  331.   fButton.OnClick := nil;
  332.  
  333.   Rect := CellRect(ACol, ARow);
  334.   wCalc := Rect.Bottom - Rect.top;
  335.  
  336.   FButton.Top := Rect.Top;
  337.   FButton.Left := Rect.Right - wCalc;
  338.   FButton.Width := wCalc;
  339.   FButton.Height := wCalc;
  340.  
  341.   fCanShow := false;
  342.   fIsEnabled := false;
  343.  
  344.   if assigned(fOnBeforeCellSelect) then
  345.      fOnBeforeCellSelect(Self, acol, arow, fCanShow, fIsEnabled);
  346.  
  347.   fButton.onclick := ButtonClick;
  348.   FButton.Enabled := fIsEnabled;
  349.   FButton.Visible := fCanShow;
  350. end;
  351.  
  352. procedure TrmEditDrawGrid.TopLeftChanged;
  353. begin
  354.   inherited TopLeftChanged;
  355.   if FButton.Visible = True then
  356.   begin
  357.     FButton.Visible := False;
  358.     FButton.OnClick := nil;
  359.     SelectCell(Col, Row);
  360.   end;
  361. end;
  362.  
  363. procedure TrmEditDrawGrid.WndProc(var Message: TMessage);
  364. begin
  365.   //There is a better way to do this but....
  366.   if Message.Msg = WM_RBUTTONDOWN then
  367.     ClickCell(TWMMouse(Message).XPos, TWMMouse(Message).YPos, False);
  368.   inherited WndProc(Message);
  369. end;
  370.  
  371. end.
  372.