fpspreadsheet: Some improvements of spready in relation to merged cells (improved row height calculation for merged block, lots of clean-up, in main form move "show header/gridlines" checkboxes to menu)

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3561 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2014-09-13 18:59:18 +00:00
parent 35ee9ccb27
commit 432cfcc6c0
3 changed files with 220 additions and 192 deletions

View File

@ -21,46 +21,24 @@ object MainFrm: TMainFrm
ClientHeight = 78
ClientWidth = 884
TabOrder = 6
object CbShowHeaders: TCheckBox
Left = 8
Height = 19
Top = 8
Width = 93
Caption = 'Show headers'
Checked = True
OnClick = CbShowHeadersClick
State = cbChecked
TabOrder = 0
end
object CbShowGridLines: TCheckBox
Left = 8
Height = 19
Top = 39
Width = 100
Caption = 'Show grid lines'
Checked = True
OnClick = CbShowGridLinesClick
State = cbChecked
TabOrder = 1
end
object EdFrozenCols: TSpinEdit
Left = 645
Left = 429
Height = 23
Top = 8
Width = 52
OnChange = EdFrozenColsChange
TabOrder = 5
TabOrder = 3
end
object EdFrozenRows: TSpinEdit
Left = 645
Left = 429
Height = 23
Top = 39
Width = 52
OnChange = EdFrozenRowsChange
TabOrder = 6
TabOrder = 4
end
object Label1: TLabel
Left = 560
Left = 344
Height = 15
Top = 13
Width = 62
@ -69,7 +47,7 @@ object MainFrm: TMainFrm
ParentColor = False
end
object Label2: TLabel
Left = 560
Left = 344
Height = 15
Top = 40
Width = 66
@ -78,16 +56,16 @@ object MainFrm: TMainFrm
ParentColor = False
end
object CbReadFormulas: TCheckBox
Left = 160
Left = 8
Height = 19
Top = 8
Width = 96
Caption = 'Read formulas'
OnChange = CbReadFormulasChange
TabOrder = 2
TabOrder = 0
end
object CbHeaderStyle: TComboBox
Left = 408
Left = 200
Height = 23
Top = 8
Width = 116
@ -100,17 +78,17 @@ object MainFrm: TMainFrm
)
OnChange = CbHeaderStyleChange
Style = csDropDownList
TabOrder = 4
TabOrder = 2
Text = 'Native'
end
object CbAutoCalcFormulas: TCheckBox
Left = 160
Left = 8
Height = 19
Top = 39
Width = 128
Caption = 'Calculate on change'
OnChange = CbAutoCalcFormulasChange
TabOrder = 3
TabOrder = 1
end
end
object ToolBar1: TToolBar
@ -1229,6 +1207,42 @@ object MainFrm: TMainFrm
end
object MenuItem68: TMenuItem
Action = AcMergeCells
Bitmap.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D69E
72C4D3996EF4D19668FFCE9263FFCB8E5EFFC98A5BFFC78756FFC38452FFC384
52FFC38452FFC38452FFC38452FFC38452FFBB7742B0FFFFFF00FFFFFF00D7A1
75FFF8F2EDFFF7F0EAFFF6EDE6FFF4EAE2FFF3E7DEFFF1E4DBFFF0E2D8FFF0E2
D8FFF0E2D8FFF0E2D8FFF0E2D8FFF0E2D8FFC58A5DFDFFFFFF00FFFFFF00D9A4
7AFFF9F3EEFFEBD2BEFFFFFFFFFFEBD3BFFFFFFFFFFFFFFFFFFFFFFFFFFFEAC7
ADFFFFFFFFFFFFFFFFFFFFFFFFFFF0E2D8FFC68C5FFFFFFFFF00FFFFFF00DDA8
7EFFF9F3EFFFEBD0BAFFEBD0BBFFC68A5CFFC38452FFC38452FFC38452FFCA92
66FFEACDB5FFEACDB5FFEACDB5FFF0E2D8FFC68A5CFFFFFFFF00FFFFFF00DFAA
82FFF9F3EFFFEACEB7FFFFFFFFFFC88D5FFFFFFFFFFFFFFFFFFFFFFFFFFFC58B
5EFFFBF6F2FFFFFFFFFFFFFFFFFFF0E2D8FFC88D5FFFFFFFFF00FFFFFF00E1AE
87FFFAF4F0FFEACBB2FFEACCB3FFC48654FFE9C7ADFFE9C9AEFFE9C9B0FFC68C
5FFFE8C7ACFFE8C8B0FFE8C8AEFFF0E2D8FFC48654FFFFFFFF00FFFFFF00E3B1
8CFFFAF6F1FFEAC9AEFFFFFFFFFFC68655FFFFFFFFFFFFFFFFFFFFFFFFFFC68A
5CFFFFFFFFFFFFFFFFFFFFFFFFFFF1E5DBFFC68655FFFFFFFF00FFFFFF00E5B4
8FFFFAF6F2FFE9C6AAFFE9C6ACFFC98A5BFFC98A5BFFC78756FFC38452FFC384
52FFE9C9B0FFE8C8B0FFE8CCB5FFF2E7DEFFC88A59FFFFFFFF00FFFFFF00E7B7
94FFFBF7F4FFE9C3A6FFFFFFFFFFE8C4A9FFFFFFFFFFFFFFFFFFFFFFFFFFE8C7
ACFFFFFFFFFFFFFFFFFFFFFFFFFFF7F1EBFFCB8F5FFFFFFFFF00FFFFFF00E9BA
98FFFBF7F4FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3
A6FFE9C3A6FFE9C3A6FFE9C3A6FFFBF7F4FFCE9364FFFFFFFF00FFFFFF00EBBD
9BFFFBF7F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF7F4FFD1976AFFFFFFFF00FFFFFF00ECBF
9EFFFBF7F4FF9CD5A5FF98D3A1FF94D09DFF90CE98FF8BCB93FF87C98EFF82C6
89FF7EC384FF7AC180FF76BE7CFFFBF7F4FFD49B6FFFFFFFFF00FFFFFF00EEC1
A1EBFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7
F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFD7A074F8FFFFFF00FFFFFF00EFC2
A37EEFC1A2E3EDC09FFFEBBE9DFFEBBC9AFFE9BA96FFE7B793FFE6B590FFE4B2
8CFFE2AF88FFE0AC84FFDDA980FFDCA57DFFDAA37ACAFFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
end
end
object mnuView: TMenuItem
@ -1237,6 +1251,17 @@ object MainFrm: TMainFrm
Action = AcViewInspector
AutoCheck = True
end
object MenuItem71: TMenuItem
Caption = '-'
end
object MenuItem70: TMenuItem
Action = AcShowGridlines
AutoCheck = True
end
object MenuItem69: TMenuItem
Action = AcShowHeaders
AutoCheck = True
end
end
end
object ImageList: TImageList
@ -2983,6 +3008,22 @@ object MainFrm: TMainFrm
ImageIndex = 39
OnExecute = AcMergeCellsExecute
end
object AcShowHeaders: TAction
Category = 'View'
AutoCheck = True
Caption = 'Headers'
Checked = True
Hint = 'Show/hide column and row headers'
OnExecute = AcShowHeadersExecute
end
object AcShowGridlines: TAction
Category = 'View'
AutoCheck = True
Caption = 'Grid lines'
Checked = True
Hint = 'Show/hide grid lines'
OnExecute = AcShowGridlinesExecute
end
end
object FontDialog: TFontDialog
MinFontSize = 0

View File

@ -73,6 +73,8 @@ type
AcAddColumn: TAction;
AcAddRow: TAction;
AcMergeCells: TAction;
AcShowHeaders: TAction;
AcShowGridlines: TAction;
AcViewInspector: TAction;
AcWordwrap: TAction;
AcVAlignDefault: TAction;
@ -80,8 +82,6 @@ type
AcVAlignCenter: TAction;
AcVAlignBottom: TAction;
ActionList: TActionList;
CbShowHeaders: TCheckBox;
CbShowGridLines: TCheckBox;
CbBackgroundColor: TColorBox;
CbReadFormulas: TCheckBox;
CbHeaderStyle: TComboBox;
@ -157,6 +157,9 @@ type
MenuItem66: TMenuItem;
MenuItem67: TMenuItem;
MenuItem68: TMenuItem;
MenuItem69: TMenuItem;
MenuItem70: TMenuItem;
MenuItem71: TMenuItem;
mnuInspector: TMenuItem;
mnuView: TMenuItem;
MnuFmtDateTimeMSZ: TMenuItem;
@ -263,8 +266,9 @@ type
procedure AcOpenExecute(Sender: TObject);
procedure AcQuitExecute(Sender: TObject);
procedure AcSaveAsExecute(Sender: TObject);
procedure AcShowGridlinesExecute(Sender: TObject);
procedure AcShowHeadersExecute(Sender: TObject);
procedure AcTextRotationExecute(Sender: TObject);
procedure AcUnmergeCellsExecute(Sender: TObject);
procedure AcVertAlignmentExecute(Sender: TObject);
procedure AcViewInspectorExecute(Sender: TObject);
procedure AcWordwrapExecute(Sender: TObject);
@ -272,8 +276,6 @@ type
procedure CbBackgroundColorSelect(Sender: TObject);
procedure CbHeaderStyleChange(Sender: TObject);
procedure CbReadFormulasChange(Sender: TObject);
procedure CbShowHeadersClick(Sender: TObject);
procedure CbShowGridLinesClick(Sender: TObject);
procedure CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings);
procedure EdCellAddressEditingDone(Sender: TObject);
procedure EdFormulaEditingDone(Sender: TObject);
@ -284,10 +286,8 @@ type
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure InspectorPageControlChange(Sender: TObject);
procedure PageControl1Change(Sender: TObject);
procedure TabControlChange(Sender: TObject);
procedure WorksheetGridSelection(Sender: TObject; aCol, aRow: Integer);
private
FCopiedFormat: TCell;
procedure LoadFile(const AFileName: String);
@ -617,6 +617,50 @@ begin
UpdateNumFormatActions;
end;
procedure TMainFrm.acOpenExecute(Sender: TObject);
begin
if OpenDialog.Execute then
LoadFile(OpenDialog.FileName);
end;
procedure TMainFrm.acQuitExecute(Sender: TObject);
begin
Close;
end;
procedure TMainFrm.acSaveAsExecute(Sender: TObject);
// Saves sheet in grid to file, overwriting existing file
var
err: String = '';
begin
if WorksheetGrid.Workbook = nil then
exit;
if SaveDialog.Execute then
begin
Screen.Cursor := crHourglass;
try
WorksheetGrid.SaveToSpreadsheetFile(SaveDialog.FileName);
finally
Screen.Cursor := crDefault;
err := WorksheetGrid.Workbook.ErrorMsg;
if err <> '' then
MessageDlg(err, mtError, [mbOK], 0);
end;
end;
end;
procedure TMainFrm.AcShowGridlinesExecute(Sender: TObject);
begin
WorksheetGrid.ShowGridLines := AcShowGridLines.Checked;
end;
procedure TMainFrm.AcShowHeadersExecute(Sender: TObject);
begin
WorksheetGrid.ShowHeaders := AcShowHeaders.Checked;
end;
procedure TMainFrm.AcTextRotationExecute(Sender: TObject);
var
text_rot: TsTextRotation;
@ -629,11 +673,6 @@ begin
UpdateTextRotationActions;
end;
procedure TMainFrm.AcUnmergeCellsExecute(Sender: TObject);
begin
WorksheetGrid.UnmergeCells;
end;
procedure TMainFrm.AcVertAlignmentExecute(Sender: TObject);
var
vert_align: TsVertAlignment;
@ -669,6 +708,23 @@ begin
WorksheetGrid.AutoCalc := CbAutoCalcFormulas.Checked;;
end;
procedure TMainFrm.CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings);
var
clr: TColor;
clrName: String;
i: Integer;
begin
if WorksheetGrid.Workbook <> nil then begin
Items.Clear;
Items.AddObject('no fill', TObject(PtrInt(clNone)));
for i:=0 to WorksheetGrid.Workbook.GetPaletteSize-1 do begin
clr := WorksheetGrid.Workbook.GetPaletteColor(i);
clrName := WorksheetGrid.Workbook.GetColorName(i);
Items.AddObject(Format('%d: %s', [i, clrName]), TObject(PtrInt(clr)));
end;
end;
end;
procedure TMainFrm.CbBackgroundColorSelect(Sender: TObject);
begin
if CbBackgroundColor.ItemIndex <= 0 then
@ -687,66 +743,6 @@ begin
WorksheetGrid.ReadFormulas := CbReadFormulas.Checked;
end;
procedure TMainFrm.CbShowHeadersClick(Sender: TObject);
begin
WorksheetGrid.ShowHeaders := CbShowHeaders.Checked;
end;
procedure TMainFrm.CbShowGridLinesClick(Sender: TObject);
begin
WorksheetGrid.ShowGridLines := CbShowGridLines.Checked;
end;
procedure TMainFrm.acOpenExecute(Sender: TObject);
begin
if OpenDialog.Execute then
LoadFile(OpenDialog.FileName);
end;
procedure TMainFrm.acQuitExecute(Sender: TObject);
begin
Close;
end;
procedure TMainFrm.acSaveAsExecute(Sender: TObject);
// Saves sheet in grid to file, overwriting existing file
var
err: String = '';
begin
if WorksheetGrid.Workbook = nil then
exit;
if SaveDialog.Execute then
begin
Screen.Cursor := crHourglass;
try
WorksheetGrid.SaveToSpreadsheetFile(SaveDialog.FileName);
finally
Screen.Cursor := crDefault;
err := WorksheetGrid.Workbook.ErrorMsg;
if err <> '' then
MessageDlg(err, mtError, [mbOK], 0);
end;
end;
end;
procedure TMainFrm.CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings);
var
clr: TColor;
clrName: String;
i: Integer;
begin
if WorksheetGrid.Workbook <> nil then begin
Items.Clear;
Items.AddObject('no fill', TObject(PtrInt(clNone)));
for i:=0 to WorksheetGrid.Workbook.GetPaletteSize-1 do begin
clr := WorksheetGrid.Workbook.GetPaletteColor(i);
clrName := WorksheetGrid.Workbook.GetColorName(i);
Items.AddObject(Format('%d: %s', [i, clrName]), TObject(PtrInt(clr)));
end;
end;
end;
procedure TMainFrm.EdCellAddressEditingDone(Sender: TObject);
var
c, r: cardinal;
@ -866,6 +862,7 @@ begin
WorksheetGrid.LoadFromSpreadsheetFile(UTF8ToSys(AFileName));
except
on E: Exception do begin
// In an error occurs show at least an empty valid worksheet
AcNewExecute(nil);
MessageDlg(E.Message, mtError, [mbOk], 0);
exit;
@ -877,29 +874,16 @@ begin
AFilename,
GetFileFormatName(WorksheetGrid.Workbook.FileFormat)
]);
CbShowGridLines.Checked := (soShowGridLines in WorksheetGrid.Worksheet.Options);
CbShowHeaders.Checked := (soShowHeaders in WorksheetGrid.Worksheet.Options);
AcShowGridLines.Checked := WorksheetGrid.ShowGridLines;
AcShowHeaders.Checked := WorksheetGrid.ShowHeaders;
EdFrozenCols.Value := WorksheetGrid.FrozenCols;
EdFrozenRows.Value := WorksheetGrid.FrozenRows;
SetupBackgroundColorBox;
// Load names of worksheets into tabcontrol and show first sheet
WorksheetGrid.GetSheets(TabControl.Tabs);
TabControl.TabIndex := 0;
{
// Create a tab in the pagecontrol for each worksheet contained in the workbook
// This would be easier with a TTabControl. This has display issues, though.
pages := TStringList.Create;
try
WorksheetGrid.GetSheets(pages);
WorksheetGrid.Parent := PageControl1.Pages[0];
while PageControl1.PageCount > pages.Count do PageControl1.Pages[1].Free;
while PageControl1.PageCount < pages.Count do PageControl1.AddTabSheet;
for i:=0 to PageControl1.PageCount-1 do
PageControl1.Pages[i].Caption := pages[i];
finally
pages.Free;
end;
}
// Update display
WorksheetGridSelection(nil, WorksheetGrid.Col, WorksheetGrid.Row);
finally
@ -911,19 +895,6 @@ begin
end;
end;
procedure TMainFrm.PageControl1Change(Sender: TObject);
begin
{
WorksheetGrid.Parent := PageControl1.Pages[PageControl1.ActivePageIndex];
WorksheetGrid.SelectSheetByIndex(PageControl1.ActivePageIndex);
}
end;
procedure TMainFrm.TabControlChange(Sender: TObject);
begin
WorksheetGrid.SelectSheetByIndex(TabControl.TabIndex);
end;
procedure TMainFrm.SetupBackgroundColorBox;
begin
// This change triggers re-reading of the workbooks palette by the OnGetColors
@ -933,63 +904,9 @@ begin
Application.ProcessMessages;
end;
procedure TMainFrm.WorksheetGridSelection(Sender: TObject; aCol, aRow: Integer);
var
r, c: Cardinal;
cell: PCell;
s: String;
procedure TMainFrm.TabControlChange(Sender: TObject);
begin
if WorksheetGrid.Workbook = nil then
exit;
r := WorksheetGrid.GetWorksheetRow(ARow);
c := WorksheetGrid.GetWorksheetCol(ACol);
if AcCopyFormat.Checked then begin
WorksheetGrid.Worksheet.CopyFormat(@FCopiedFormat, r, c);
AcCopyFormat.Checked := false;
end;
cell := WorksheetGrid.Worksheet.FindCell(r, c);
if cell <> nil then begin
s := WorksheetGrid.Worksheet.ReadFormulaAsString(cell, true);
if s <> '' then begin
if s[1] <> '=' then s := '=' + s;
EdFormula.Text := s;
end
else
case cell^.ContentType of
cctNumber:
EdFormula.Text := FloatToStr(cell^.NumberValue);
cctDateTime:
if cell^.DateTimeValue < 1.0 then
EdFormula.Text := FormatDateTime('tt', cell^.DateTimeValue)
else
EdFormula.Text := FormatDateTime('c', cell^.DateTimeValue);
cctUTF8String:
EdFormula.Text := cell^.UTF8StringValue;
else
EdFormula.Text := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell);
end;
end else
EdFormula.Text := '';
EdCellAddress.Text := GetCellString(r, c, [rfRelRow, rfRelCol]);
AcMergeCells.Checked := (cell <> nil) and (cell^.MergedNeighbors <> []);
UpdateHorAlignmentActions;
UpdateVertAlignmentActions;
UpdateWordwraps;
UpdateBackgroundColorIndex;
// UpdateFontActions;
UpdateFontNameIndex;
UpdateFontSizeIndex;
UpdateFontStyleActions;
UpdateTextRotationActions;
UpdateNumFormatActions;
UpdateCellInfo(cell);
WorksheetGrid.SelectSheetByIndex(TabControl.TabIndex);
end;
procedure TMainFrm.UpdateBackgroundColorIndex;
@ -1241,6 +1158,65 @@ begin
AcWordwrap.Checked := wrapped;
end;
procedure TMainFrm.WorksheetGridSelection(Sender: TObject; aCol, aRow: Integer);
var
r, c: Cardinal;
cell: PCell;
s: String;
begin
if WorksheetGrid.Workbook = nil then
exit;
r := WorksheetGrid.GetWorksheetRow(ARow);
c := WorksheetGrid.GetWorksheetCol(ACol);
if AcCopyFormat.Checked then begin
WorksheetGrid.Worksheet.CopyFormat(@FCopiedFormat, r, c);
AcCopyFormat.Checked := false;
end;
cell := WorksheetGrid.Worksheet.FindCell(r, c);
if cell <> nil then begin
s := WorksheetGrid.Worksheet.ReadFormulaAsString(cell, true);
if s <> '' then begin
if s[1] <> '=' then s := '=' + s;
EdFormula.Text := s;
end
else
case cell^.ContentType of
cctNumber:
EdFormula.Text := FloatToStr(cell^.NumberValue);
cctDateTime:
if cell^.DateTimeValue < 1.0 then
EdFormula.Text := FormatDateTime('tt', cell^.DateTimeValue)
else
EdFormula.Text := FormatDateTime('c', cell^.DateTimeValue);
cctUTF8String:
EdFormula.Text := cell^.UTF8StringValue;
else
EdFormula.Text := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell);
end;
end else
EdFormula.Text := '';
EdCellAddress.Text := GetCellString(r, c, [rfRelRow, rfRelCol]);
AcMergeCells.Checked := (cell <> nil) and (cell^.MergedNeighbors <> []);
UpdateHorAlignmentActions;
UpdateVertAlignmentActions;
UpdateWordwraps;
UpdateBackgroundColorIndex;
// UpdateFontActions;
UpdateFontNameIndex;
UpdateFontSizeIndex;
UpdateFontStyleActions;
UpdateTextRotationActions;
UpdateNumFormatActions;
UpdateCellInfo(cell);
end;
initialization
{$I mainform.lrs}

View File

@ -710,6 +710,8 @@ end;
constructor TsCustomWorksheetGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
AutoAdvance := aaDown;
ExtendedSelect := true;
FHeaderCount := 1;
FInitColCount := 26;
FInitRowCount := 100;
@ -2069,6 +2071,7 @@ var
txtR: TRect;
cellR: TRect;
flags: Cardinal;
r1,c1,r2,c2: Cardinal;
begin
Result := 0;
if ShowHeaders and ((ACol = 0) or (ARow = 0)) then
@ -2078,6 +2081,14 @@ begin
lCell := FWorksheet.FindCell(ARow-FHeaderCount, ACol-FHeaderCount);
if lCell <> nil then begin
if lCell^.MergedNeighbors <> [] then begin
FWorksheet.FindMergedRange(lCell, r1, c1, r2, c2);
if r1 <> r2 then
// If the merged range encloses several rows we skip automatic row height
// determination since only the height of the first row of the block
// (containing the merge base cell) would change which is very confusing.
exit;
end;
s := GetCellText(ACol, ARow);
if s = '' then
exit;