diff --git a/components/fpspreadsheet/examples/fpsctrls/main.lfm b/components/fpspreadsheet/examples/fpsctrls/main.lfm index 809ff4b9b..92b8f2180 100644 --- a/components/fpspreadsheet/examples/fpsctrls/main.lfm +++ b/components/fpspreadsheet/examples/fpsctrls/main.lfm @@ -11,7 +11,7 @@ object Form1: TForm1 object Panel1: TPanel Left = 0 Height = 42 - Top = 0 + Top = 26 Width = 925 Align = alTop BevelOuter = bvNone @@ -49,8 +49,8 @@ object Form1: TForm1 end object WorkbookTabControl: TsWorkbookTabControl Left = 0 - Height = 533 - Top = 42 + Height = 507 + Top = 68 Width = 672 TabIndex = 0 Tabs.Strings = ( @@ -61,7 +61,7 @@ object Form1: TForm1 WorkbookSource = WorkbookSource object WorksheetGrid: TsWorksheetGrid Left = 2 - Height = 503 + Height = 477 Top = 28 Width = 668 FrozenCols = 0 @@ -114,8 +114,8 @@ object Form1: TForm1 end object InspectorTabControl: TTabControl Left = 677 - Height = 533 - Top = 42 + Height = 507 + Top = 68 Width = 248 OnChange = InspectorTabControlChange TabIndex = 0 @@ -129,7 +129,7 @@ object Form1: TForm1 TabOrder = 2 object Inspector: TsSpreadsheetInspector Left = 2 - Height = 503 + Height = 477 Top = 28 Width = 244 Align = alClient @@ -175,12 +175,48 @@ object Form1: TForm1 end object Splitter1: TSplitter Left = 672 - Height = 533 - Top = 42 + Height = 507 + Top = 68 Width = 5 Align = alRight ResizeAnchor = akRight end + object ToolBar1: TToolBar + Left = 0 + Height = 26 + Top = 0 + Width = 925 + Caption = 'ToolBar1' + Images = ImageList + TabOrder = 4 + object ToolButton1: TToolButton + Left = 1 + Top = 2 + Action = AddWorksheetAction + end + object ToolButton2: TToolButton + Left = 24 + Top = 2 + Action = RenameWorksheetAction + end + object ToolButton3: TToolButton + Left = 47 + Top = 2 + Action = RenameWorksheetAction + end + object ToolButton4: TToolButton + Left = 70 + Top = 2 + Width = 3 + Caption = 'ToolButton4' + Style = tbsDivider + end + object ToolButton5: TToolButton + Left = 73 + Top = 2 + Action = AcFileExit + end + end object WorkbookSource: TsWorkbookSource AutoDetectFormat = False Options = [boAutoCalc, boCalcBeforeSaving, boReadFormulas] @@ -194,13 +230,15 @@ object Form1: TForm1 left = 312 top = 128 end - object ActionList1: TActionList + object ActionList: TActionList + Images = ImageList left = 434 top = 180 object AddWorksheetAction: TsWorksheetAddAction Category = 'FPSpreadsheet' Caption = 'Add' Hint = 'Add empty worksheet' + ImageIndex = 1 WorkbookSource = WorkbookSource NameMask = 'Sheet%d' end @@ -208,20 +246,60 @@ object Form1: TForm1 Category = 'FPSpreadsheet' Caption = 'Delete' Hint = 'Delete worksheet' + ImageIndex = 2 WorkbookSource = WorkbookSource end object RenameWorksheetAction: TsWorksheetRenameAction Category = 'FPSpreadsheet' Caption = 'Rename...' Hint = 'Rename worksheet' + ImageIndex = 3 WorkbookSource = WorkbookSource end + object AcFileExit: TFileExit + Category = 'File' + Caption = 'E&xit' + Hint = 'Exit' + ImageIndex = 0 + end end - object ImageList1: TImageList + object ImageList: TImageList left = 434 top = 249 Bitmap = { - 4C690300000010000000100000007E7E7E007E7E7E007F7F7F00808080008080 + 4C69040000001000000010000000003F9300003F9300003F9300003F9424003F + 948A003E93CC004095CC004095CC004095CC004095CC004095CC004095CC0040 + 95CC004095CC00409599003F9400003F9300003F9324003F938A0E4B9CD33F76 + C0EC5D90D4FF3365A9FFA0A0A0FFA9A9A9FFA9A9A9FFAAAAAAFFACACACFFAEAE + AEFFB0B0B0FF003E93CC003E9300003F938A0E4A9CD33E75BFEC5487CBFF3669 + ADFF23569AFF3363A6FFA9A9A9FFBCBCBCFFBDBDBDFFBFBFBFFFC1C1C1FFC4C4 + C4FFC7C7C7FF003C90CC003C9000003D91CC5D90D4FF3568ACFF285B9FFF1A4D + 91FF4477BBFF3361A4FFA9A9A9FFBDBDBDFFBFBFBFFFC1C1C1FFC4C4C4FFC7C7 + C7FFC9C9C9FF003A8DCC003A8D00003B8ECC588BCFFF1A4D91FF4376BAFF3265 + A9FF4376BAFF335FA1FFAAAAAAFFBFBFBFFFC1C1C1FFC4C4C4FFB1B1B1FFBBBB + BBFFCCCCCCFF003789CC0037890000398BCC5588CCFF275A9EFF4174B8FF3164 + A8FF4174B8FF335D9EFFACACACFFC1C1C1FFC4C4C4FFC7C7C7FFA8A8A8FFA8A8 + A8FFBEBEBEFF003485CC00348500003688CC5386CAFF295CA0FF3F72B6FF3063 + A7FF3F72B6FF335A9AFFAEAEAEFFACACACFFA5A5A5FFA5A5A5FFA5A5A5FFFDFD + FDFFA5A5A5FF122F609510295100003485CC5083C7FF1D5094FF3265A9FF2D60 + A4FF3D70B4FF335897FFB0B0B0FFA2A2A2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2 + F2FFF2F2F2FF1A1A1A661A1A1A1A003181CC4C7FC3FFBBBBBBFF22518CFF2C5F + A3FF3B6EB2FF335593FFB3B3B3FFAAAAAAFFA0A0A0FFA0A0A0FFA0A0A0FFE4E4 + E4FFA0A0A0FF051E4D950B204600002E7DCC497CC0FF09336FFF215090FF2B5E + A2FF396CB0FF335290FFB5B5B5FFCCCCCCFFD0D0D0FFD3D3D3FF9D9D9DFF9D9D + 9DFFBFBFBFFF002774CC00277400002B79CC477ABEFF2C5FA3FF376AAEFF2B5E + A2FF376AAEFF33508CFFB8B8B8FFD0D0D0FFD3D3D3FFD5D5D5FFAAAAAAFFBEBE + BEFFDCDCDCFF00246FCC00246F00002875CC4477BBFF2C5FA3FF3568ACFF2B5E + A2FF2E61A5FF334B87FFBBBBBBFFD3D3D3FFD5D5D5FFD8D8D8FFDBDBDBFFDCDC + DCFFDDDDDDFF001F68CC001F6800002571CC4174B8FF2C5FA3FF2D60A4FF2356 + 9AFF3D70B4FF334179FFBEBEBEFFD5D5D5FFD8D8D8FFDBDBDBFFDCDCDCFFDDDD + DDFFDDDDDDFF001258CC0012580000226DCC3F72B6FF225599FF3B6EB2FF2C51 + 96EC0A1C60D3000749A4000648CC000648CC000648CC000648CC000648CC0006 + 48CC000648CC00074A9900084B00001B64CC4174B8FF2A5094EC0A1A5ED30008 + 4A8A000648240006470000044500000445000004450000044500000445000004 + 4500000445000006480000084B0000105500000B4FCC0007498A000546240005 + 4700000648000006470000044500000445000004450000044500000445000004 + 4500000445000006480000084B007E7E7E007E7E7E007F7F7F00808080008080 800080808000808080008080800080808000129D000014A8000015A9009915A9 00CC15A9009914A80000129D00007E7E7E007E7E7E007F7F7F00808080008080 800080808000808080008080800080808000129D000013A1000014A400CC75EE @@ -326,7 +404,7 @@ object Form1: TForm1 object MnuFile: TMenuItem Caption = 'File' object MenuItem1: TMenuItem - Caption = 'New Item5' + Action = AcFileExit end end object MnuEdit: TMenuItem diff --git a/components/fpspreadsheet/examples/fpsctrls/main.pas b/components/fpspreadsheet/examples/fpsctrls/main.pas index 0d541f766..f7a8e1ebb 100644 --- a/components/fpspreadsheet/examples/fpsctrls/main.pas +++ b/components/fpspreadsheet/examples/fpsctrls/main.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, - StdCtrls, ComCtrls, ActnList, Menus, + StdCtrls, ComCtrls, ActnList, Menus, StdActns, fpspreadsheet, fpspreadsheetctrls, fpspreadsheetgrid, fpsActions; type @@ -14,9 +14,10 @@ type { TForm1 } TForm1 = class(TForm) - ActionList1: TActionList; + ActionList: TActionList; Button1: TButton; - ImageList1: TImageList; + AcFileExit: TFileExit; + ImageList: TImageList; MainMenu: TMainMenu; MenuItem1: TMenuItem; MenuItem2: TMenuItem; @@ -37,6 +38,12 @@ type AddWorksheetAction: TsWorksheetAddAction; DeleteWorksheetAction: TsWorksheetDeleteAction; RenameWorksheetAction: TsWorksheetRenameAction; + ToolBar1: TToolBar; + ToolButton1: TToolButton; + ToolButton2: TToolButton; + ToolButton3: TToolButton; + ToolButton4: TToolButton; + ToolButton5: TToolButton; WorkbookSource: TsWorkbookSource; WorkbookTabControl: TsWorkbookTabControl; WorksheetGrid: TsWorksheetGrid; diff --git a/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm b/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm index 48d2a56c2..d18650504 100644 --- a/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm +++ b/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm @@ -185,6 +185,9 @@ object Form1: TForm1 top = 80 object MnuFile: TMenuItem Caption = 'File' + object MnuFileExit: TMenuItem + Action = AcFileExit + end end object MnuEdit: TMenuItem Caption = 'Edit' @@ -196,11 +199,19 @@ object Form1: TForm1 object MnuDeleteWorksheet: TMenuItem Caption = 'New Item5' end + object MnuRenameWorksheet: TMenuItem + Caption = 'New Item6' + end end end end object ActionList: TActionList left = 203 top = 144 + object AcFileExit: TFileExit + Category = 'File' + Caption = 'E&xit' + Hint = 'Exit' + end end end diff --git a/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas b/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas index 34cfff0f6..826ee22c9 100644 --- a/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas +++ b/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, - StdCtrls, ComCtrls, ExtCtrls, Grids, Buttons, Menus, ActnList, + StdCtrls, ComCtrls, ExtCtrls, Grids, Buttons, Menus, ActnList, StdActns, fpspreadsheet, fpspreadsheetctrls, fpSpreadsheetGrid, fpsActions; type @@ -17,8 +17,11 @@ type ActionList: TActionList; BtnLoad: TButton; CbLoader: TComboBox; + AcFileExit: TFileExit; Label1: TLabel; MainMenu: TMainMenu; + MnuFileExit: TMenuItem; + MnuRenameWorksheet: TMenuItem; MnuDeleteWorksheet: TMenuItem; MnuAddWorksheet: TMenuItem; MnuWorksheets: TMenuItem; @@ -149,10 +152,17 @@ begin actn := TsWorksheetDeleteAction.Create(self); with TsWorksheetDeleteAction(actn) do begin ActionList := self.ActionList; - WOrkbookSource := Self.WorkbookSource; + WorkbookSource := Self.WorkbookSource; end; MnuDeleteWorksheet.Action := actn; + actn := TsWorksheetRenameAction.Create(self); + with TsWorksheetRenameAction(actn) do begin + ActionList := self.ActionList; + WorkbookSource := Self.WorkbookSource; + end; + MnuRenameWorksheet.Action := actn; + end; procedure TForm1.InspectorTabControlChange(Sender: TObject); @@ -161,6 +171,7 @@ begin end; procedure TForm1.SpeedButton1Click(Sender: TObject); +// The same effect is obtained by using the built-in TsWorksheetAddAction. var sheetname: String; i: Integer; @@ -174,6 +185,7 @@ begin end; procedure TForm1.SpeedButton2Click(Sender: TObject); +// The same effect is obtained by using the built-in TsWorksheetDeleteAction. begin if WorkbookSource.Workbook.GetWorksheetCount = 1 then MessageDlg('There must be a least 1 worksheet.', mtError, [mbOK], 0) @@ -185,6 +197,7 @@ begin end; procedure TForm1.SpeedButton3Click(Sender: TObject); +// The same effect can be obtained by using the built-in TsWorksheetRenameAction var s: String; begin diff --git a/components/fpspreadsheet/fpsactions.pas b/components/fpspreadsheet/fpsactions.pas index 8db62bf86..270c84772 100644 --- a/components/fpspreadsheet/fpsactions.pas +++ b/components/fpspreadsheet/fpsactions.pas @@ -33,10 +33,14 @@ type property Worksheet; end; + TsWorksheetNameEvent = procedure (Sender: TObject; AWorksheet: TsWorksheet; + var ASheetName: String) of object; + { Action for adding a worksheet } TsWorksheetAddAction = class(TsWorksheetAction) private FNameMask: String; + FOnGetWorksheetName: TsWorksheetNameEvent; procedure SetNameMask(const AValue: String); protected function GetUniqueSheetName: String; @@ -45,6 +49,8 @@ type procedure ExecuteTarget(Target: TObject); override; published property NameMask: String read FNameMask write SetNameMask; + property OnGetWorksheetName: TsWorksheetNameEvent + read FOnGetWorksheetName write FOnGetWorksheetName; end; { Action for deleting selected worksheet } @@ -56,9 +62,14 @@ type { Action for renaming selected worksheet } TsWorksheetRenameAction = class(TsWorksheetAction) + private + FOnGetWorksheetName: TsWorksheetNameEvent; public constructor Create(AOwner: TComponent); override; procedure ExecuteTarget(Target: TObject); override; + published + property OnGetWorksheetName: TsWorksheetNameEvent + read FOnGetWorksheetName write FOnGetWorksheetName; end; procedure Register; @@ -128,7 +139,7 @@ end; { TsWorksheetAddAction } -constructor TsWOrksheetAddAction.Create(AOwner: TComponent); +constructor TsWorksheetAddAction.Create(AOwner: TComponent); begin inherited Create(AOwner); Caption := 'Add'; @@ -136,6 +147,8 @@ begin FNameMask := 'Sheet%d'; end; +{ Helper procedure which creates a default worksheetname by counting a number + up until it provides in the NameMask a unique worksheet name. } function TsWorksheetAddAction.GetUniqueSheetName: String; var i: Integer; @@ -157,7 +170,18 @@ var begin if HandlesTarget(Target) then begin + // Get default name of the new worksheet sheetName := GetUniqueSheetName; + // If available use own procedure to specify new worksheet name + if Assigned(FOnGetWorksheetName) then + FOnGetWorksheetName(self, Worksheet, sheetName); + // Check validity of worksheet name + if not Workbook.ValidWorksheetName(sheetName) then + begin + MessageDlg(Format('"5s" is not a valid worksheet name.', [sheetName]), mtError, [mbOK], 0); + exit; + end; + // Add new worksheet using the worksheet name. Workbook.AddWorksheet(sheetName); end; end; @@ -179,7 +203,7 @@ end; constructor TsWorksheetDeleteAction.Create(AOwner: TComponent); begin inherited Create(AOwner); - Caption := 'Delete'; + Caption := 'Delete...'; Hint := 'Delete worksheet'; end; @@ -187,20 +211,24 @@ procedure TsWorksheetDeleteAction.ExecuteTarget(Target: TObject); begin if HandlesTarget(Target) then begin + // Make sure that the last worksheet is not deleted - there must always be + // at least 1 worksheet. if Workbook.GetWorksheetCount = 1 then begin MessageDlg('The workbook must contain at least 1 worksheet', mtError, [mbOK], 0); exit; end; + // Confirmation dialog if MessageDlg( Format('Do you really want to delete worksheet "%s"?', [Worksheet.Name]), mtConfirmation, [mbYes, mbNo], 0) <> mrYes then exit; + // Remove the worksheet; the workbookSource takes care of selecting the + // next worksheet after deletion. Workbook.RemoveWorksheet(Worksheet); - // The workbooksource takes care of selecting the next worksheet end; end; @@ -221,8 +249,19 @@ begin if HandlesTarget(Target) then begin s := Worksheet.Name; - if InputQuery('Rename worksheet', 'New worksheet name', s) then - Worksheet.Name := s; + // If requested, override input box by own input + if Assigned(FOnGetWorksheetName) then + FOnGetWorksheetName(self, Worksheet, s) + else + s := InputBox('Rename worksheet', 'New worksheet name', s); + // No change + if s = WorksheetName then + exit; + // Check validity of new worksheet name + if Workbook.ValidWorksheetName(s) then + Worksheet.Name := s + else + MessageDlg(Format('"%s" is not a valid worksheet name.', [s]), mtError, [mbOK], 0); end; end;