diff --git a/components/fpspreadsheet/examples/spready/mainform.lfm b/components/fpspreadsheet/examples/spready/mainform.lfm index e64b0770a..4db616a1b 100644 --- a/components/fpspreadsheet/examples/spready/mainform.lfm +++ b/components/fpspreadsheet/examples/spready/mainform.lfm @@ -359,49 +359,63 @@ object MainFrm: TMainFrm end object FormulaToolBar: TToolBar Left = 0 - Height = 26 + Height = 28 Top = 53 Width = 884 Caption = 'FormulaToolBar' + Constraints.MinHeight = 26 TabOrder = 2 - object EdFormula: TEdit - Left = 129 - Height = 24 + object FormulaToolbarSplitter: TSplitter + Left = 171 + Height = 26 Top = 2 - Width = 755 - Align = alClient - OnEditingDone = EdFormulaEditingDone - TabOrder = 1 + Width = 5 end - object EdCellAddress: TEdit + object FormulaMemo: TMemo + Left = 176 + Height = 26 + Top = 2 + Width = 708 + Align = alClient + OnEditingDone = MemoFormulaEditingDone + TabOrder = 1 + WantReturns = False + end + object AddressPanel: TPanel Left = 1 Height = 24 Top = 2 - Width = 123 + Width = 170 Align = alLeft - Alignment = taCenter - OnEditingDone = EdCellAddressEditingDone - TabOrder = 0 - end - object FormulaToolbarSplitter: TSplitter - Left = 124 - Height = 24 - Top = 2 - Width = 5 + BorderSpacing.Bottom = 2 + BevelOuter = bvNone + ClientHeight = 24 + ClientWidth = 170 + TabOrder = 2 + object EdCellAddress: TEdit + Left = 0 + Height = 28 + Top = 0 + Width = 170 + Align = alTop + Alignment = taCenter + OnEditingDone = EdCellAddressEditingDone + TabOrder = 0 + end end end object InspectorSplitter: TSplitter Left = 648 - Height = 453 - Top = 79 + Height = 446 + Top = 86 Width = 5 Align = alRight ResizeAnchor = akRight end object InspectorPageControl: TPageControl Left = 653 - Height = 453 - Top = 79 + Height = 446 + Top = 86 Width = 231 ActivePage = PgCellValue Align = alRight @@ -410,11 +424,11 @@ object MainFrm: TMainFrm OnChange = InspectorPageControlChange object PgCellValue: TTabSheet Caption = 'Cell value' - ClientHeight = 420 + ClientHeight = 413 ClientWidth = 223 object CellInspector: TValueListEditor Left = 0 - Height = 420 + Height = 413 Top = 0 Width = 223 Align = alClient @@ -458,15 +472,15 @@ object MainFrm: TMainFrm end object TabControl: TTabControl Left = 0 - Height = 453 - Top = 79 + Height = 446 + Top = 86 Width = 648 OnChange = TabControlChange Align = alClient TabOrder = 3 object WorksheetGrid: TsWorksheetGrid Left = 2 - Height = 448 + Height = 441 Top = 3 Width = 644 FrozenCols = 0 @@ -514,6 +528,15 @@ object MainFrm: TMainFrm ) end end + object Splitter1: TSplitter + Cursor = crVSplit + Left = 0 + Height = 5 + Top = 81 + Width = 884 + Align = alTop + ResizeAnchor = akTop + end object OpenDialog: TOpenDialog DefaultExt = '.xls' Filter = 'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Comma-delimited files (*.csv)|*.csv|Wikitable (pipes) (.wikitable_pipes)|*.wikitable_pipes|All files (*.*)|*.*' diff --git a/components/fpspreadsheet/examples/spready/mainform.pas b/components/fpspreadsheet/examples/spready/mainform.pas index cc8c57117..e31e91270 100644 --- a/components/fpspreadsheet/examples/spready/mainform.pas +++ b/components/fpspreadsheet/examples/spready/mainform.pas @@ -89,7 +89,6 @@ type CbHeaderStyle: TComboBox; CbAutoCalcFormulas: TCheckBox; CbTextOverflow: TCheckBox; - EdFormula: TEdit; EdCellAddress: TEdit; FontComboBox: TComboBox; EdFrozenRows: TSpinEdit; @@ -99,6 +98,7 @@ type Label1: TLabel; Label2: TLabel; MainMenu: TMainMenu; + FormulaMemo: TMemo; MenuItem1: TMenuItem; MenuItem10: TMenuItem; MenuItem11: TMenuItem; @@ -215,6 +215,7 @@ type Panel1: TPanel; BordersPopupMenu: TPopupMenu; NumFormatPopupMenu: TPopupMenu; + AddressPanel: TPanel; SaveDialog: TSaveDialog; EdFrozenCols: TSpinEdit; FormulaToolBar: TToolBar; @@ -222,6 +223,7 @@ type InspectorSplitter: TSplitter; PgCellValue: TTabSheet; PgProperties: TTabSheet; + Splitter1: TSplitter; TabControl: TTabControl; PgSheet: TTabSheet; ToolButton22: TToolButton; @@ -291,7 +293,6 @@ type procedure CbBackgroundColorGetColors(Sender: TCustomColorBox; Items: TStrings); procedure CbTextOverflowChange(Sender: TObject); procedure EdCellAddressEditingDone(Sender: TObject); - procedure EdFormulaEditingDone(Sender: TObject); procedure EdFrozenColsChange(Sender: TObject); procedure EdFrozenRowsChange(Sender: TObject); procedure FontComboBoxSelect(Sender: TObject); @@ -299,6 +300,7 @@ type procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); procedure InspectorPageControlChange(Sender: TObject); + procedure MemoFormulaEditingDone(Sender: TObject); procedure TabControlChange(Sender: TObject); procedure WorksheetGridHeaderClick(Sender: TObject; IsColumn: Boolean; Index: Integer); @@ -793,20 +795,6 @@ begin end; end; -procedure TMainFrm.EdFormulaEditingDone(Sender: TObject); -var - r, c: Cardinal; - s: String; -begin - r := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row); - c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col); - s := EdFormula.Text; - if (s <> '') and (s[1] = '=') then - WorksheetGrid.Worksheet.WriteFormula(r, c, Copy(s, 2, Length(s)), true) - else - WorksheetGrid.Worksheet.WriteCellValueAsString(r, c, EdFormula.Text); -end; - procedure TMainFrm.EdFrozenColsChange(Sender: TObject); begin WorksheetGrid.FrozenCols := EdFrozenCols.Value; @@ -931,6 +919,20 @@ begin end; end; +procedure TMainFrm.MemoFormulaEditingDone(Sender: TObject); +var + r, c: Cardinal; + s: String; +begin + r := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row); + c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col); + s := FormulaMemo.Lines.Text; + if (s <> '') and (s[1] = '=') then + WorksheetGrid.Worksheet.WriteFormula(r, c, Copy(s, 2, Length(s)), true) + else + WorksheetGrid.Worksheet.WriteCellValueAsString(r, c, s); +end; + procedure TMainFrm.SetupBackgroundColorBox; begin // This change triggers re-reading of the workbooks palette by the OnGetColors @@ -1244,24 +1246,26 @@ begin s := WorksheetGrid.Worksheet.ReadFormulaAsString(cell, true); if s <> '' then begin if s[1] <> '=' then s := '=' + s; - EdFormula.Text := s; - end - else + FormulaMemo.Lines.Text := s; + end else + begin case cell^.ContentType of cctNumber: - EdFormula.Text := FloatToStr(cell^.NumberValue); + s := FloatToStr(cell^.NumberValue); cctDateTime: if cell^.DateTimeValue < 1.0 then - EdFormula.Text := FormatDateTime('tt', cell^.DateTimeValue) + s := FormatDateTime('tt', cell^.DateTimeValue) else - EdFormula.Text := FormatDateTime('c', cell^.DateTimeValue); + s := FormatDateTime('c', cell^.DateTimeValue); cctUTF8String: - EdFormula.Text := cell^.UTF8StringValue; + s := cell^.UTF8StringValue; else - EdFormula.Text := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell); + s := WorksheetGrid.Worksheet.ReadAsUTF8Text(cell); end; + FormulaMemo.Lines.Text := s; + end; end else - EdFormula.Text := ''; + FormulaMemo.Text := ''; EdCellAddress.Text := GetCellString(r, c, [rfRelRow, rfRelCol]); AcMergeCells.Checked := WorksheetGrid.Worksheet.IsMerged(cell); diff --git a/components/fpspreadsheet/fpscsv.pas b/components/fpspreadsheet/fpscsv.pas index f276e0f6e..d10159536 100644 --- a/components/fpspreadsheet/fpscsv.pas +++ b/components/fpspreadsheet/fpscsv.pas @@ -263,6 +263,16 @@ begin c := 0; while AStream.Position < n do begin ch := char(AStream.ReadByte); + if (CSVParams.QuoteChar <> #0) and (ch = CSVParams.QuoteChar) then + begin + // Begin of quoted string --> read until next quote; this allows line breaks + // and column separators in quoted string! + cellValue := cellValue + ch; + repeat + ch := char(AStream.ReadByte); + cellValue := cellValue + ch; + until (AStream.Position = n) or (ch = CSVParams.QuoteChar); + end else if ch = CSVParams.Delimiter then begin // End of column reached ReadCellValue(r, c, cellValue);