fpspreadsheet: Improved worksheet actions and related examples

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3715 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2014-11-10 16:51:22 +00:00
parent e111cf8fb9
commit 436387487b
5 changed files with 171 additions and 23 deletions

View File

@@ -11,7 +11,7 @@ object Form1: TForm1
object Panel1: TPanel object Panel1: TPanel
Left = 0 Left = 0
Height = 42 Height = 42
Top = 0 Top = 26
Width = 925 Width = 925
Align = alTop Align = alTop
BevelOuter = bvNone BevelOuter = bvNone
@@ -49,8 +49,8 @@ object Form1: TForm1
end end
object WorkbookTabControl: TsWorkbookTabControl object WorkbookTabControl: TsWorkbookTabControl
Left = 0 Left = 0
Height = 533 Height = 507
Top = 42 Top = 68
Width = 672 Width = 672
TabIndex = 0 TabIndex = 0
Tabs.Strings = ( Tabs.Strings = (
@@ -61,7 +61,7 @@ object Form1: TForm1
WorkbookSource = WorkbookSource WorkbookSource = WorkbookSource
object WorksheetGrid: TsWorksheetGrid object WorksheetGrid: TsWorksheetGrid
Left = 2 Left = 2
Height = 503 Height = 477
Top = 28 Top = 28
Width = 668 Width = 668
FrozenCols = 0 FrozenCols = 0
@@ -114,8 +114,8 @@ object Form1: TForm1
end end
object InspectorTabControl: TTabControl object InspectorTabControl: TTabControl
Left = 677 Left = 677
Height = 533 Height = 507
Top = 42 Top = 68
Width = 248 Width = 248
OnChange = InspectorTabControlChange OnChange = InspectorTabControlChange
TabIndex = 0 TabIndex = 0
@@ -129,7 +129,7 @@ object Form1: TForm1
TabOrder = 2 TabOrder = 2
object Inspector: TsSpreadsheetInspector object Inspector: TsSpreadsheetInspector
Left = 2 Left = 2
Height = 503 Height = 477
Top = 28 Top = 28
Width = 244 Width = 244
Align = alClient Align = alClient
@@ -175,12 +175,48 @@ object Form1: TForm1
end end
object Splitter1: TSplitter object Splitter1: TSplitter
Left = 672 Left = 672
Height = 533 Height = 507
Top = 42 Top = 68
Width = 5 Width = 5
Align = alRight Align = alRight
ResizeAnchor = akRight ResizeAnchor = akRight
end 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 object WorkbookSource: TsWorkbookSource
AutoDetectFormat = False AutoDetectFormat = False
Options = [boAutoCalc, boCalcBeforeSaving, boReadFormulas] Options = [boAutoCalc, boCalcBeforeSaving, boReadFormulas]
@@ -194,13 +230,15 @@ object Form1: TForm1
left = 312 left = 312
top = 128 top = 128
end end
object ActionList1: TActionList object ActionList: TActionList
Images = ImageList
left = 434 left = 434
top = 180 top = 180
object AddWorksheetAction: TsWorksheetAddAction object AddWorksheetAction: TsWorksheetAddAction
Category = 'FPSpreadsheet' Category = 'FPSpreadsheet'
Caption = 'Add' Caption = 'Add'
Hint = 'Add empty worksheet' Hint = 'Add empty worksheet'
ImageIndex = 1
WorkbookSource = WorkbookSource WorkbookSource = WorkbookSource
NameMask = 'Sheet%d' NameMask = 'Sheet%d'
end end
@@ -208,20 +246,60 @@ object Form1: TForm1
Category = 'FPSpreadsheet' Category = 'FPSpreadsheet'
Caption = 'Delete' Caption = 'Delete'
Hint = 'Delete worksheet' Hint = 'Delete worksheet'
ImageIndex = 2
WorkbookSource = WorkbookSource WorkbookSource = WorkbookSource
end end
object RenameWorksheetAction: TsWorksheetRenameAction object RenameWorksheetAction: TsWorksheetRenameAction
Category = 'FPSpreadsheet' Category = 'FPSpreadsheet'
Caption = 'Rename...' Caption = 'Rename...'
Hint = 'Rename worksheet' Hint = 'Rename worksheet'
ImageIndex = 3
WorkbookSource = WorkbookSource WorkbookSource = WorkbookSource
end end
object AcFileExit: TFileExit
Category = 'File'
Caption = 'E&xit'
Hint = 'Exit'
ImageIndex = 0
end
end end
object ImageList1: TImageList object ImageList: TImageList
left = 434 left = 434
top = 249 top = 249
Bitmap = { 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 800080808000808080008080800080808000129D000014A8000015A9009915A9
00CC15A9009914A80000129D00007E7E7E007E7E7E007F7F7F00808080008080 00CC15A9009914A80000129D00007E7E7E007E7E7E007F7F7F00808080008080
800080808000808080008080800080808000129D000013A1000014A400CC75EE 800080808000808080008080800080808000129D000013A1000014A400CC75EE
@@ -326,7 +404,7 @@ object Form1: TForm1
object MnuFile: TMenuItem object MnuFile: TMenuItem
Caption = 'File' Caption = 'File'
object MenuItem1: TMenuItem object MenuItem1: TMenuItem
Caption = 'New Item5' Action = AcFileExit
end end
end end
object MnuEdit: TMenuItem object MnuEdit: TMenuItem

View File

@@ -6,7 +6,7 @@ interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, ComCtrls, ActnList, Menus, StdCtrls, ComCtrls, ActnList, Menus, StdActns,
fpspreadsheet, fpspreadsheetctrls, fpspreadsheetgrid, fpsActions; fpspreadsheet, fpspreadsheetctrls, fpspreadsheetgrid, fpsActions;
type type
@@ -14,9 +14,10 @@ type
{ TForm1 } { TForm1 }
TForm1 = class(TForm) TForm1 = class(TForm)
ActionList1: TActionList; ActionList: TActionList;
Button1: TButton; Button1: TButton;
ImageList1: TImageList; AcFileExit: TFileExit;
ImageList: TImageList;
MainMenu: TMainMenu; MainMenu: TMainMenu;
MenuItem1: TMenuItem; MenuItem1: TMenuItem;
MenuItem2: TMenuItem; MenuItem2: TMenuItem;
@@ -37,6 +38,12 @@ type
AddWorksheetAction: TsWorksheetAddAction; AddWorksheetAction: TsWorksheetAddAction;
DeleteWorksheetAction: TsWorksheetDeleteAction; DeleteWorksheetAction: TsWorksheetDeleteAction;
RenameWorksheetAction: TsWorksheetRenameAction; RenameWorksheetAction: TsWorksheetRenameAction;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
WorkbookSource: TsWorkbookSource; WorkbookSource: TsWorkbookSource;
WorkbookTabControl: TsWorkbookTabControl; WorkbookTabControl: TsWorkbookTabControl;
WorksheetGrid: TsWorksheetGrid; WorksheetGrid: TsWorksheetGrid;

View File

@@ -185,6 +185,9 @@ object Form1: TForm1
top = 80 top = 80
object MnuFile: TMenuItem object MnuFile: TMenuItem
Caption = 'File' Caption = 'File'
object MnuFileExit: TMenuItem
Action = AcFileExit
end
end end
object MnuEdit: TMenuItem object MnuEdit: TMenuItem
Caption = 'Edit' Caption = 'Edit'
@@ -196,11 +199,19 @@ object Form1: TForm1
object MnuDeleteWorksheet: TMenuItem object MnuDeleteWorksheet: TMenuItem
Caption = 'New Item5' Caption = 'New Item5'
end end
object MnuRenameWorksheet: TMenuItem
Caption = 'New Item6'
end
end end
end end
end end
object ActionList: TActionList object ActionList: TActionList
left = 203 left = 203
top = 144 top = 144
object AcFileExit: TFileExit
Category = 'File'
Caption = 'E&xit'
Hint = 'Exit'
end
end end
end end

View File

@@ -6,7 +6,7 @@ interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, 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; fpspreadsheet, fpspreadsheetctrls, fpSpreadsheetGrid, fpsActions;
type type
@@ -17,8 +17,11 @@ type
ActionList: TActionList; ActionList: TActionList;
BtnLoad: TButton; BtnLoad: TButton;
CbLoader: TComboBox; CbLoader: TComboBox;
AcFileExit: TFileExit;
Label1: TLabel; Label1: TLabel;
MainMenu: TMainMenu; MainMenu: TMainMenu;
MnuFileExit: TMenuItem;
MnuRenameWorksheet: TMenuItem;
MnuDeleteWorksheet: TMenuItem; MnuDeleteWorksheet: TMenuItem;
MnuAddWorksheet: TMenuItem; MnuAddWorksheet: TMenuItem;
MnuWorksheets: TMenuItem; MnuWorksheets: TMenuItem;
@@ -149,10 +152,17 @@ begin
actn := TsWorksheetDeleteAction.Create(self); actn := TsWorksheetDeleteAction.Create(self);
with TsWorksheetDeleteAction(actn) do begin with TsWorksheetDeleteAction(actn) do begin
ActionList := self.ActionList; ActionList := self.ActionList;
WOrkbookSource := Self.WorkbookSource; WorkbookSource := Self.WorkbookSource;
end; end;
MnuDeleteWorksheet.Action := actn; MnuDeleteWorksheet.Action := actn;
actn := TsWorksheetRenameAction.Create(self);
with TsWorksheetRenameAction(actn) do begin
ActionList := self.ActionList;
WorkbookSource := Self.WorkbookSource;
end;
MnuRenameWorksheet.Action := actn;
end; end;
procedure TForm1.InspectorTabControlChange(Sender: TObject); procedure TForm1.InspectorTabControlChange(Sender: TObject);
@@ -161,6 +171,7 @@ begin
end; end;
procedure TForm1.SpeedButton1Click(Sender: TObject); procedure TForm1.SpeedButton1Click(Sender: TObject);
// The same effect is obtained by using the built-in TsWorksheetAddAction.
var var
sheetname: String; sheetname: String;
i: Integer; i: Integer;
@@ -174,6 +185,7 @@ begin
end; end;
procedure TForm1.SpeedButton2Click(Sender: TObject); procedure TForm1.SpeedButton2Click(Sender: TObject);
// The same effect is obtained by using the built-in TsWorksheetDeleteAction.
begin begin
if WorkbookSource.Workbook.GetWorksheetCount = 1 then if WorkbookSource.Workbook.GetWorksheetCount = 1 then
MessageDlg('There must be a least 1 worksheet.', mtError, [mbOK], 0) MessageDlg('There must be a least 1 worksheet.', mtError, [mbOK], 0)
@@ -185,6 +197,7 @@ begin
end; end;
procedure TForm1.SpeedButton3Click(Sender: TObject); procedure TForm1.SpeedButton3Click(Sender: TObject);
// The same effect can be obtained by using the built-in TsWorksheetRenameAction
var var
s: String; s: String;
begin begin

View File

@@ -33,10 +33,14 @@ type
property Worksheet; property Worksheet;
end; end;
TsWorksheetNameEvent = procedure (Sender: TObject; AWorksheet: TsWorksheet;
var ASheetName: String) of object;
{ Action for adding a worksheet } { Action for adding a worksheet }
TsWorksheetAddAction = class(TsWorksheetAction) TsWorksheetAddAction = class(TsWorksheetAction)
private private
FNameMask: String; FNameMask: String;
FOnGetWorksheetName: TsWorksheetNameEvent;
procedure SetNameMask(const AValue: String); procedure SetNameMask(const AValue: String);
protected protected
function GetUniqueSheetName: String; function GetUniqueSheetName: String;
@@ -45,6 +49,8 @@ type
procedure ExecuteTarget(Target: TObject); override; procedure ExecuteTarget(Target: TObject); override;
published published
property NameMask: String read FNameMask write SetNameMask; property NameMask: String read FNameMask write SetNameMask;
property OnGetWorksheetName: TsWorksheetNameEvent
read FOnGetWorksheetName write FOnGetWorksheetName;
end; end;
{ Action for deleting selected worksheet } { Action for deleting selected worksheet }
@@ -56,9 +62,14 @@ type
{ Action for renaming selected worksheet } { Action for renaming selected worksheet }
TsWorksheetRenameAction = class(TsWorksheetAction) TsWorksheetRenameAction = class(TsWorksheetAction)
private
FOnGetWorksheetName: TsWorksheetNameEvent;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
procedure ExecuteTarget(Target: TObject); override; procedure ExecuteTarget(Target: TObject); override;
published
property OnGetWorksheetName: TsWorksheetNameEvent
read FOnGetWorksheetName write FOnGetWorksheetName;
end; end;
procedure Register; procedure Register;
@@ -128,7 +139,7 @@ end;
{ TsWorksheetAddAction } { TsWorksheetAddAction }
constructor TsWOrksheetAddAction.Create(AOwner: TComponent); constructor TsWorksheetAddAction.Create(AOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
Caption := 'Add'; Caption := 'Add';
@@ -136,6 +147,8 @@ begin
FNameMask := 'Sheet%d'; FNameMask := 'Sheet%d';
end; 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; function TsWorksheetAddAction.GetUniqueSheetName: String;
var var
i: Integer; i: Integer;
@@ -157,7 +170,18 @@ var
begin begin
if HandlesTarget(Target) then if HandlesTarget(Target) then
begin begin
// Get default name of the new worksheet
sheetName := GetUniqueSheetName; 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); Workbook.AddWorksheet(sheetName);
end; end;
end; end;
@@ -179,7 +203,7 @@ end;
constructor TsWorksheetDeleteAction.Create(AOwner: TComponent); constructor TsWorksheetDeleteAction.Create(AOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
Caption := 'Delete'; Caption := 'Delete...';
Hint := 'Delete worksheet'; Hint := 'Delete worksheet';
end; end;
@@ -187,20 +211,24 @@ procedure TsWorksheetDeleteAction.ExecuteTarget(Target: TObject);
begin begin
if HandlesTarget(Target) then if HandlesTarget(Target) then
begin begin
// Make sure that the last worksheet is not deleted - there must always be
// at least 1 worksheet.
if Workbook.GetWorksheetCount = 1 then if Workbook.GetWorksheetCount = 1 then
begin begin
MessageDlg('The workbook must contain at least 1 worksheet', mtError, [mbOK], 0); MessageDlg('The workbook must contain at least 1 worksheet', mtError, [mbOK], 0);
exit; exit;
end; end;
// Confirmation dialog
if MessageDlg( if MessageDlg(
Format('Do you really want to delete worksheet "%s"?', [Worksheet.Name]), Format('Do you really want to delete worksheet "%s"?', [Worksheet.Name]),
mtConfirmation, [mbYes, mbNo], 0) <> mrYes mtConfirmation, [mbYes, mbNo], 0) <> mrYes
then then
exit; exit;
// Remove the worksheet; the workbookSource takes care of selecting the
// next worksheet after deletion.
Workbook.RemoveWorksheet(Worksheet); Workbook.RemoveWorksheet(Worksheet);
// The workbooksource takes care of selecting the next worksheet
end; end;
end; end;
@@ -221,8 +249,19 @@ begin
if HandlesTarget(Target) then if HandlesTarget(Target) then
begin begin
s := Worksheet.Name; s := Worksheet.Name;
if InputQuery('Rename worksheet', 'New worksheet name', s) then // If requested, override input box by own input
Worksheet.Name := s; 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;
end; end;