{*******************************************************} { } { Responsive Software http://www.responsive.co.nz } { } { Copyright (c) 2003-2006 Responsive Software Limited } { } {*******************************************************} unit ProxyDatabaseCollectionObjectMaintain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, DB, DBTables, Base, DatabaseObjects, ProxyDatabaseObjectCollectionUnit, StdCtrls; type TProxyDatabaseCollectionObjectMaintainForm = class(TBaseForm) StringGrid: TStringGrid; PrintButton: TButton; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure StringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure StringGridGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); procedure StringGridSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); procedure StringGridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure PrintButtonClick(Sender: TObject); procedure StringGridDblClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } FDatabaseObjectClass : TDatabaseObjectClass; FProxyDatabaseObjectCollection : TProxyDatabaseObjectCollection; FNoDelete : boolean; FEditOccurred : boolean; FEditRow : integer; FEditCol : integer; FValue : string; SavedWidth : integer; SavedHeight : integer; procedure UpdateDatabase; procedure InsertObject (Row : integer); procedure DeleteObject (Row : integer); public { Public declarations } procedure Maintain (DatabaseObjectClass : TDatabaseObjectClass; ProxyDatabaseObjectCollection : TProxyDatabaseObjectCollection; NoDelete : boolean); end; var ProxyDatabaseCollectionObjectMaintainForm: TProxyDatabaseCollectionObjectMaintainForm; implementation uses DatabaseManager, Globals, ProxyObjectListingReportUnit; {$R *.dfm} procedure TProxyDatabaseCollectionObjectMaintainForm.UpdateDatabase; var DatabaseObject : TDatabaseObject; begin if not FEditOccurred then Exit; DatabaseObject := TDatabaseObject(FProxyDatabaseObjectCollection[FEditRow - 1]); if DatabaseObject <> nil then begin DatabaseObject.MaintainStringGridSetEditText(FEditCol,FValue ); DatabaseObject.FullSaveToDatabase(false); end; FEditOccurred := false; end; procedure TProxyDatabaseCollectionObjectMaintainForm.InsertObject (Row : integer); var DatabaseObject : TDatabaseObject; begin DatabaseObject := FDatabaseObjectClass.Create; DatabaseObject.FullSaveToDatabase(false); FProxyDatabaseObjectCollection.InsertObject(Row - 1, DatabaseObject); StringGrid.RowCount := FProxyDatabaseObjectCollection.Count + 1; StringGrid.Repaint; FEditOccurred := false; end; procedure TProxyDatabaseCollectionObjectMaintainForm.DeleteObject (Row : integer); var i : integer; DatabaseObject : TDatabaseObject; begin DatabaseObject := TDatabaseObject(FProxyDatabaseObjectCollection[Row - 1]); if (DatabaseObject <> nil) and (not DatabaseObject.HasReferences) then begin DatabaseObject.DeleteFromDatabase(true); FProxyDatabaseObjectCollection.DeleteObject(Row - 1); if FProxyDatabaseObjectCollection.Count = 0 then begin StringGrid.RowCount := 2; // clear details on last row for i := 0 to StringGrid.ColCount - 1 do StringGrid.Cells[i,1] := ''; end else StringGrid.RowCount := FProxyDatabaseObjectCollection.Count + 1; StringGrid.Repaint; end; FEditOccurred := false; end; procedure TProxyDatabaseCollectionObjectMaintainForm.Maintain (DatabaseObjectClass : TDatabaseObjectClass; ProxyDatabaseObjectCollection : TProxyDatabaseObjectCollection; NoDelete : boolean); var i : integer; begin // record width and height on first call and restore on subsequent if (SavedWidth = 0) and (SavedHeight = 0) then begin SavedWidth := Width; SavedHeight := Height; end else begin Width := SavedWidth; Height := SavedHeight; end; FDatabaseObjectClass := DatabaseObjectClass; FProxyDatabaseObjectCollection := ProxyDatabaseObjectCollection; FNoDelete := NoDelete; FEditOccurred := false; Caption := FDatabaseObjectClass.MaintainFormCaption; FDatabaseObjectClass.SetupMaintainStringGrid(StringGrid); if FProxyDatabaseObjectCollection.Count = 0 then begin StringGrid.RowCount := 2; // clear details on last row for i := 0 to StringGrid.ColCount - 1 do StringGrid.Cells[i,1] := ''; end else StringGrid.RowCount := FProxyDatabaseObjectCollection.Count + 1; StringGrid.Row := 1; ShowModal; end; procedure TProxyDatabaseCollectionObjectMaintainForm.StringGridDblClick( Sender: TObject); var DatabaseObject : TDatabaseObject; begin StringGrid.EditorMode := false; FEditOccurred := false; DatabaseObject := TDatabaseObject(FProxyDatabaseObjectCollection[StringGrid.Row - 1]); if DatabaseObject <> nil then begin if DatabaseObject.MaintainStringGridDblClick(StringGrid.Col) then begin DatabaseObject.FullSaveToDatabase(false); StringGrid.Repaint; end; end; end; procedure TProxyDatabaseCollectionObjectMaintainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_ESCAPE then begin Close; Key := 0; end else if Key = VK_RETURN then UpdateDatabase else if (Key = VK_INSERT) and (not (ssShift in Shift)) and (not (ssCtrl in Shift)) then begin UpdateDatabase; InsertObject(StringGrid.Row); Key := 0; end else if (Key = VK_DOWN) and (StringGrid.Row = StringGrid.RowCount - 1) and (FProxyDatabaseObjectCollection.Count <> 0) then begin UpdateDatabase; InsertObject(StringGrid.RowCount); end else if (not FNoDelete) and (Key = VK_DELETE) and (ssCtrl in Shift) then begin DeleteObject(StringGrid.Row); Key := 0; end; end; procedure TProxyDatabaseCollectionObjectMaintainForm.StringGridDrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var DatabaseObject : TDatabaseObject; Text : string; begin DatabaseObject := TDatabaseObject(FProxyDatabaseObjectCollection[ARow - 1]); if DatabaseObject <> nil then begin // set the brush color if gdSelected in State then StringGrid.Canvas.Brush.Color := clHighlight else StringGrid.Canvas.Brush.Color := StringGrid.Color; // set the font color if gdSelected in State then StringGrid.Canvas.Font.Color := clWhite else StringGrid.Canvas.Font.Color := StringGrid.Font.Color; // format the text Text := DatabaseObject.MaintainStringGridDrawText(ACol); // output the text StringGrid.Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,Text); end; end; procedure TProxyDatabaseCollectionObjectMaintainForm.StringGridGetEditText( Sender: TObject; ACol, ARow: Integer; var Value: String); var DatabaseObject : TDatabaseObject; begin DatabaseObject := TDatabaseObject(FProxyDatabaseObjectCollection[ARow - 1]); if DatabaseObject <> nil then Value := DatabaseObject.MaintainStringGridGetEditText(ACol) else Value := ''; end; procedure TProxyDatabaseCollectionObjectMaintainForm.StringGridSetEditText( Sender: TObject; ACol, ARow: Integer; const Value: String); begin FEditOccurred := true; FEditCol := ACol; FEditRow := ARow; FValue := Value; if FProxyDatabaseObjectCollection.Count = 0 then InsertObject(1); end; procedure TProxyDatabaseCollectionObjectMaintainForm.StringGridSelectCell( Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin UpdateDatabase; end; procedure TProxyDatabaseCollectionObjectMaintainForm.PrintButtonClick( Sender: TObject); begin UpdateDatabase; // keep ownership of collection so that it is not destroyed by the report ProxyObjectListingReport.SetProxyCollection(FDatabaseObjectClass,FProxyDatabaseObjectCollection,false); ProxyObjectListingReport.Preview; end; procedure TProxyDatabaseCollectionObjectMaintainForm.FormClose( Sender: TObject; var Action: TCloseAction); begin UpdateDatabase; StringGrid.EditorMode := false; end; end.