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
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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;