unit smain; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, mrumanager, Forms, Controls, Graphics, Dialogs, ExtCtrls, ComCtrls, ActnList, Menus, StdActns, Buttons, Grids, StdCtrls, types, fpstypes, fpspreadsheet, fpspreadsheetctrls, fpspreadsheetgrid, fpsActions, {%H-}fpsAllFormats, fpsSYLK, xlsBIFF34, xlsxml, xlsxooxml_crypto, fpsOpenDocument_crypto; // NOTE: // In order to use the decrypting xlsx and ods readers put // xlsxooxlm_crypto and fpsOpenDocument_crypto after all other reader/writer // units. type { TMainForm } TMainForm = class(TForm) AcRowDelete: TAction; AcColDelete: TAction; AcRowAdd: TAction; AcColAdd: TAction; AcSettingsCSVParams: TAction; AcSettingsCurrency: TAction; AcSettingsFormatSettings: TAction; AcSearch: TAction; AcShowGridLines: TAction; AcShowHeaders: TAction; AcFrozenRows: TAction; AcFrozenCols: TAction; AcAutoRowHeights: TAction; AcFileNew: TAction; AcAbout: TAction; AcSort: TAction; AcSortColAsc: TAction; AcRowHeight: TAction; AcColWidth: TAction; AcSettingsReadFormulas: TAction; AcSettingsAutoUpdateRowheights: TAction; AcSettingsAutoDetectCellType: TAction; AcShowPageBreaks: TAction; AcHideCols: TAction; AcShowCols: TAction; AcAddPageBreakCol: TAction; AcAddPageBreakRow: TAction; AcRemovePageBreakCol: TAction; AcRemovePageBreakRow: TAction; AcHideRows: TAction; AcShowRows: TAction; AcWorksheetShowHeaders: TAction; AcWorksheetShowGrid: TAction; AcWorksheetProtection: TAction; AcWorksheetRTL: TAction; AcViewInspector: TAction; ActionList: TActionList; AcFileExit: TFileExit; AcFileOpen: TFileOpen; AcFileSaveAs: TFileSaveAs; ImageList: TImageList; MainMenu: TMainMenu; MenuItem1: TMenuItem; MenuItem102: TMenuItem; MenuItem103: TMenuItem; MenuItem104: TMenuItem; MenuItem105: TMenuItem; MenuItem106: TMenuItem; MenuItem131: TMenuItem; MenuItem136: TMenuItem; MenuItem137: TMenuItem; MenuItem138: TMenuItem; MenuItem139: TMenuItem; MenuItem140: TMenuItem; MenuItem158: TMenuItem; MenuItem159: TMenuItem; MenuItem160: TMenuItem; MenuItem161: TMenuItem; MenuItem162: TMenuItem; MenuItem163: TMenuItem; MenuItem164: TMenuItem; MenuItem165: TMenuItem; MenuItem166: TMenuItem; MenuItem167: TMenuItem; MenuItem168: TMenuItem; MenuItem169: TMenuItem; MenuItem170: TMenuItem; MenuItem171: TMenuItem; MenuItem172: TMenuItem; MenuItem173: TMenuItem; MenuItem174: TMenuItem; MenuItem175: TMenuItem; MenuItem176: TMenuItem; MenuItem177: TMenuItem; MenuItem178: TMenuItem; MenuItem179: TMenuItem; MenuItem180: TMenuItem; MenuItem181: TMenuItem; MenuItem182: TMenuItem; MenuItem183: TMenuItem; MenuItem184: TMenuItem; MenuItem185: TMenuItem; MenuItem186: TMenuItem; MenuItem187: TMenuItem; MenuItem188: TMenuItem; MenuItem189: TMenuItem; MenuItem190: TMenuItem; MenuItem191: TMenuItem; MenuItem192: TMenuItem; MenuItem193: TMenuItem; MenuItem194: TMenuItem; MenuItem195: TMenuItem; MenuItem196: TMenuItem; MenuItem197: TMenuItem; MenuItem198: TMenuItem; MenuItem199: TMenuItem; MenuItem2: TMenuItem; MenuItem200: TMenuItem; MenuItem201: TMenuItem; MenuItem202: TMenuItem; MenuItem203: TMenuItem; MenuItem204: TMenuItem; MenuItem205: TMenuItem; MenuItem206: TMenuItem; MenuItem207: TMenuItem; MenuItem208: TMenuItem; MenuItem209: TMenuItem; MenuItem210: TMenuItem; MenuItem211: TMenuItem; MenuItem3: TMenuItem; MenuItem4: TMenuItem; MenuItem51: TMenuItem; MenuItem90: TMenuItem; MenuItem91: TMenuItem; MenuItem92: TMenuItem; MenuItem93: TMenuItem; MenuItem99: TMenuItem; MnuHelp: TMenuItem; MnuFileNew: TMenuItem; MnuFileExit: TMenuItem; MenuItem10: TMenuItem; MenuItem100: TMenuItem; MenuItem101: TMenuItem; MenuItem107: TMenuItem; MenuItem108: TMenuItem; MenuItem109: TMenuItem; MenuItem110: TMenuItem; MenuItem111: TMenuItem; MenuItem112: TMenuItem; MenuItem113: TMenuItem; MenuItem114: TMenuItem; MenuItem115: TMenuItem; MenuItem116: TMenuItem; MenuItem117: TMenuItem; MenuItem118: TMenuItem; MenuItem119: TMenuItem; MenuItem120: TMenuItem; MenuItem121: TMenuItem; MenuItem122: TMenuItem; MenuItem123: TMenuItem; MenuItem124: TMenuItem; MenuItem125: TMenuItem; MenuItem126: TMenuItem; MenuItem127: TMenuItem; MenuItem128: TMenuItem; MenuItem129: TMenuItem; MenuItem130: TMenuItem; MenuItem132: TMenuItem; MenuItem133: TMenuItem; MenuItem134: TMenuItem; MenuItem135: TMenuItem; MenuItem141: TMenuItem; MenuItem142: TMenuItem; MenuItem143: TMenuItem; MenuItem144: TMenuItem; MenuItem145: TMenuItem; MenuItem146: TMenuItem; MenuItem148: TMenuItem; MenuItem149: TMenuItem; MenuItem150: TMenuItem; MenuItem151: TMenuItem; MenuItem152: TMenuItem; MenuItem153: TMenuItem; MenuItem154: TMenuItem; MenuItem155: TMenuItem; MenuItem156: TMenuItem; MenuItem157: TMenuItem; MenuItem50: TMenuItem; MnuFileReopen: TMenuItem; MnuZoom: TMenuItem; MenuItem147: TMenuItem; MnuSettings: TMenuItem; MenuItem11: TMenuItem; MenuItem12: TMenuItem; MenuItem13: TMenuItem; MenuItem14: TMenuItem; MenuItem15: TMenuItem; MenuItem16: TMenuItem; MenuItem17: TMenuItem; MenuItem18: TMenuItem; MenuItem19: TMenuItem; MenuItem20: TMenuItem; MenuItem21: TMenuItem; MenuItem22: TMenuItem; MenuItem23: TMenuItem; MenuItem24: TMenuItem; MenuItem25: TMenuItem; MenuItem26: TMenuItem; MenuItem27: TMenuItem; MenuItem28: TMenuItem; MenuItem29: TMenuItem; MenuItem30: TMenuItem; MenuItem31: TMenuItem; MenuItem32: TMenuItem; MenuItem33: TMenuItem; MenuItem34: TMenuItem; MenuItem35: TMenuItem; MenuItem36: TMenuItem; MenuItem37: TMenuItem; MenuItem38: TMenuItem; MenuItem39: TMenuItem; MenuItem40: TMenuItem; MenuItem41: TMenuItem; MenuItem42: TMenuItem; MenuItem43: TMenuItem; MenuItem44: TMenuItem; MenuItem45: TMenuItem; MenuItem46: TMenuItem; MenuItem47: TMenuItem; MenuItem48: TMenuItem; MenuItem49: TMenuItem; MenuItem5: TMenuItem; MnuFileOpen: TMenuItem; MnuFileSaveAs: TMenuItem; MenuItem52: TMenuItem; MenuItem53: TMenuItem; MenuItem54: TMenuItem; MenuItem55: TMenuItem; MenuItem56: TMenuItem; MenuItem57: TMenuItem; MenuItem58: TMenuItem; MenuItem59: TMenuItem; MenuItem60: TMenuItem; MenuItem61: TMenuItem; MenuItem62: TMenuItem; MenuItem63: TMenuItem; MenuItem64: TMenuItem; MenuItem65: TMenuItem; MenuItem66: TMenuItem; MenuItem67: TMenuItem; MenuItem68: TMenuItem; MenuItem69: TMenuItem; MenuItem70: TMenuItem; MenuItem71: TMenuItem; MenuItem72: TMenuItem; MenuItem73: TMenuItem; MenuItem74: TMenuItem; MenuItem75: TMenuItem; MenuItem76: TMenuItem; MenuItem77: TMenuItem; MenuItem78: TMenuItem; MenuItem79: TMenuItem; MenuItem80: TMenuItem; MenuItem81: TMenuItem; MenuItem82: TMenuItem; MenuItem83: TMenuItem; MenuItem84: TMenuItem; MenuItem85: TMenuItem; MenuItem86: TMenuItem; MenuItem87: TMenuItem; MenuItem88: TMenuItem; MenuItem89: TMenuItem; MenuItem9: TMenuItem; MenuItem95: TMenuItem; MenuItem96: TMenuItem; MenuItem97: TMenuItem; MenuItem98: TMenuItem; MenuItem94: TMenuItem; MnuAddWorksheet: TMenuItem; MnuView: TMenuItem; MenuItem6: TMenuItem; MenuItem7: TMenuItem; MenuItem8: TMenuItem; MnuFormat: TMenuItem; MnuFile: TMenuItem; MnuEdit: TMenuItem; OpenDialog: TOpenDialog; OpenDialog1: TOpenDialog; CellEdit: TsCellEdit; CellIndicator: TsCellIndicator; AcFontBold: TsFontStyleAction; AcFontItalic: TsFontStyleAction; AcVertAlignTop: TsVertAlignmentAction; AcVertAlignCenter: TsVertAlignmentAction; AcVertAlignBottom: TsVertAlignmentAction; AcHorAlignLeft: TsHorAlignmentAction; AcHorAlignCenter: TsHorAlignmentAction; AcHorAlignRight: TsHorAlignmentAction; AcTextRotHor: TsTextRotationAction; AcTextRot90CW: TsTextRotationAction; AcTextRot90CCW: TsTextRotationAction; AcTextRotStacked: TsTextRotationAction; AcWordWrap: TsWordwrapAction; AcNumFormatFixed: TsNumberFormatAction; AcNumFormatFixedTh: TsNumberFormatAction; AcNumFormatPercentage: TsNumberFormatAction; AcNumFormatCurrency: TsNumberFormatAction; AcNumFormatCurrencyRed: TsNumberFormatAction; Panel2: TPanel; Panel3: TPanel; PuCellProtection: TPopupMenu; PuRecentFiles: TPopupMenu; PuPaste: TPopupMenu; PuBorders: TPopupMenu; PuTimeFormat: TPopupMenu; PuDateFormat: TPopupMenu; PuCurrencyFormat: TPopupMenu; PuNumFormat: TPopupMenu; AcNumFormatGeneral: TsNumberFormatAction; AcNumFormatExp: TsNumberFormatAction; AcNumFormatDateTime: TsNumberFormatAction; AcNumFormatLongDate: TsNumberFormatAction; AcNumFormatShortDate: TsNumberFormatAction; AcNumFormatLongTime: TsNumberFormatAction; AcNumFormatShortTime: TsNumberFormatAction; AcNumFormatLongTimeAM: TsNumberFormatAction; AcNumFormatShortTimeAM: TsNumberFormatAction; AcNumFormatTimeInterval: TsNumberFormatAction; AcIncDecimals: TsDecimalsAction; AcDecDecimals: TsDecimalsAction; AcCellFontDialog: TsFontDialogAction; AcBackgroundColorDialog: TsBackgroundColorDialogAction; AcCellBorderTop: TsCellBorderAction; AcCellBorderBottom: TsCellBorderAction; AcCellBorderLeft: TsCellBorderAction; AcCellBorderRight: TsCellBorderAction; AcCellBorderInnerHor: TsCellBorderAction; AcCellBorderInnerVert: TsCellBorderAction; AcCellBorderAllHor: TsCellBorderAction; AcCellBorderBottomThick: TsCellBorderAction; AcCellBorderBottomDbl: TsCellBorderAction; AcCellBorderAllOuter: TsCellBorderAction; AcCellBorderNone: TsNoCellBordersAction; AcCellBorderAllOuterThick: TsCellBorderAction; AcCellBorderTopBottomThick: TsCellBorderAction; AcCellBorderTopBottomDbl: TsCellBorderAction; AcCellBorderAll: TsCellBorderAction; AcCellBorderAllVert: TsCellBorderAction; AcCopyFormat: TsCopyAction; FontColorCombobox: TsCellCombobox; BackgroundColorCombobox: TsCellCombobox; FontnameCombo: TsCellCombobox; FontsizeCombo: TsCellCombobox; AcMergeCells: TsMergeAction; AcCopyToClipboard: TsCopyAction; AcCutToClipboard: TsCopyAction; AcPasteAllFromClipboard: TsCopyAction; AcPasteValueFromClipboard: TsCopyAction; AcPasteFormatFromClipboard: TsCopyAction; AcPasteFormulaFromClipboard: TsCopyAction; AcCommentNew: TsCellCommentAction; AcCommentEdit: TsCellCommentAction; AcCommentDelete: TsCellCommentAction; AcHyperlinkNew: TsCellHyperlinkAction; AcHyperlinkEdit: TsCellHyperlinkAction; AcHyperlinkDelete: TsCellHyperlinkAction; AcNumFormatFraction2: TsNumberFormatAction; AcNumFormatFraction1: TsNumberFormatAction; AcNumFormatFraction3: TsNumberFormatAction; AcNumFormatDayMonth: TsNumberFormatAction; AcNumFormatMonthYear: TsNumberFormatAction; AcNumFormatCustom: TsNumberFormatAction; AcCellBorderDiagUp: TsCellBorderAction; AcCellBorderDiagDown: TsCellBorderAction; AcNumFormatText: TsNumberFormatAction; AcCellProtection_Cell: TsCellProtectionAction; AcCellProtection_HideFormulas: TsCellProtectionAction; AcClearFormat: TsClearFormatAction; Splitter2: TSplitter; Splitter3: TSplitter; AcZoom100: TsWorksheetZoomAction; AcZoom90: TsWorksheetZoomAction; AcZoom30: TsWorksheetZoomAction; AcZoom50: TsWorksheetZoomAction; AcZoom75: TsWorksheetZoomAction; AcZoom150: TsWorksheetZoomAction; AcZoom200: TsWorksheetZoomAction; AcZoom300: TsWorksheetZoomAction; AcZoom500: TsWorksheetZoomAction; AcZoomMore: TsWorksheetZoomAction; ToolBar2: TToolBar; ToolButton1: TToolButton; ToolButton11: TToolButton; ToolButton12: TToolButton; ToolButton13: TToolButton; ToolButton14: TToolButton; ToolButton15: TToolButton; ToolButton16: TToolButton; ToolButton17: TToolButton; ToolButton18: TToolButton; ToolButton19: TToolButton; AcFontUnderline: TsFontStyleAction; AcFontStrikeout: TsFontStyleAction; InspectorSplitter: TSplitter; Inspector: TsSpreadsheetInspector; InspectorTabControl: TTabControl; AcAddWorksheet: TsWorksheetAddAction; AcDeleteWorksheet: TsWorksheetDeleteAction; acRenameWorksheet: TsWorksheetRenameAction; ToolBar1: TToolBar; ToolButton10: TToolButton; ToolButton2: TToolButton; ToolButton20: TToolButton; ToolButton21: TToolButton; ToolButton22: TToolButton; ToolButton23: TToolButton; ToolButton24: TToolButton; ToolButton25: TToolButton; ToolButton26: TToolButton; ToolButton27: TToolButton; ToolButton28: TToolButton; ToolButton29: TToolButton; ToolButton3: TToolButton; ToolButton30: TToolButton; ToolButton31: TToolButton; TbBorders: TToolButton; ToolButton32: TToolButton; ToolButton33: TToolButton; ToolButton34: TToolButton; ToolButton35: TToolButton; ToolButton36: TToolButton; ToolButton37: TToolButton; ToolButton38: TToolButton; ToolButton39: TToolButton; TbCommentAdd: TToolButton; ToolButton4: TToolButton; ToolButton40: TToolButton; ToolButton41: TToolButton; ToolButton42: TToolButton; ToolButton43: TToolButton; ToolButton44: TToolButton; ToolButton45: TToolButton; ToolButton46: TToolButton; ToolButton47: TToolButton; ToolButton48: TToolButton; ToolButton49: TToolButton; ToolButton5: TToolButton; TbCommentDelete: TToolButton; TbCommentEdit: TToolButton; ToolButton50: TToolButton; ToolButton51: TToolButton; ToolButton52: TToolButton; ToolButton53: TToolButton; ToolButton54: TToolButton; ToolButton55: TToolButton; ToolButton56: TToolButton; ToolButton58: TToolButton; ToolButton6: TToolButton; ToolButton7: TToolButton; ToolButton8: TToolButton; tbFileOpen: TToolButton; ToolButton9: TToolButton; WorkbookSource: TsWorkbookSource; WorkbookTabControl: TsWorkbookTabControl; WorksheetGrid: TsWorksheetGrid; procedure AcAboutExecute(Sender: TObject); procedure AcAddPageBreakColExecute(Sender: TObject); procedure AcAddPageBreakColUpdate(Sender: TObject); procedure AcAddPageBreakRowExecute(Sender: TObject); procedure AcAddPageBreakRowUpdate(Sender: TObject); procedure AcAutoRowHeightsExecute(Sender: TObject); procedure AcColAddExecute(Sender: TObject); procedure AcColDeleteExecute(Sender: TObject); procedure AcColWidthExecute(Sender: TObject); procedure AcFileNewExecute(Sender: TObject); procedure AcFileOpenAccept(Sender: TObject); procedure AcFileSaveAsAccept(Sender: TObject); procedure AcFileSaveAsBeforeExecute(Sender: TObject); procedure AcFrozenColsExecute(Sender: TObject); procedure AcFrozenColsUpdate(Sender: TObject); procedure AcFrozenRowsExecute(Sender: TObject); procedure AcFrozenRowsUpdate(Sender: TObject); procedure AcHideColsExecute(Sender: TObject); procedure AcHideRowsExecute(Sender: TObject); procedure AcNumFormatCustomGetNumberFormatString(Sender: TObject; AWorkbook: TsWorkbook; var ANumFormatStr: String); procedure AcRemovePageBreakColExecute(Sender: TObject); procedure AcRemovePageBreakColUpdate(Sender: TObject); procedure AcRemovePageBreakRowExecute(Sender: TObject); procedure AcRemovePageBreakRowUpdate(Sender: TObject); procedure AcRowAddExecute(Sender: TObject); procedure AcRowDeleteExecute(Sender: TObject); procedure AcRowHeightExecute(Sender: TObject); procedure AcSettingsAutoDetectCellTypeExecute(Sender: TObject); procedure AcSettingsAutoUpdateRowheightsExecute(Sender: TObject); procedure AcSettingsReadFormulasExecute(Sender: TObject); procedure AcShowColsExecute(Sender: TObject); procedure AcShowPageBreaksExecute(Sender: TObject); procedure AcShowRowsExecute(Sender: TObject); procedure AcSortColAscExecute(Sender: TObject); procedure AcSortExecute(Sender: TObject); procedure ActionListUpdate(AAction: TBasicAction; var Handled: Boolean); procedure AcWorksheetProtectionExecute(Sender: TObject); procedure AcWorksheetProtectionUpdate(Sender: TObject); procedure AcWorksheetRTLExecute(Sender: TObject); procedure AcWorksheetRTLUpdate(Sender: TObject); procedure AcSearchExecute(Sender: TObject); procedure AcSettingsCSVParamsExecute(Sender: TObject); procedure AcSettingsCurrencyExecute(Sender: TObject); procedure AcSettingsFormatSettingsExecute(Sender: TObject); procedure AcShowGridLinesExecute(Sender: TObject); procedure AcShowGridLinesUpdate(Sender: TObject); procedure AcShowHeadersExecute(Sender: TObject); procedure AcShowHeadersUpdate(Sender: TObject); procedure AcViewInspectorExecute(Sender: TObject); procedure AcWorksheetShowGridExecute(Sender: TObject); procedure AcWorksheetShowGridUpdate(Sender: TObject); procedure AcWorksheetShowHeadersExecute(Sender: TObject); procedure AcWorksheetShowHeadersUpdate(Sender: TObject); procedure AcZoomMoreExecute(Sender: TObject); procedure EditCut1Execute(Sender: TObject); procedure ColorComboboxAddColors(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure FormCreate(Sender: TObject); procedure FormDropFiles(Sender: TObject; const FileNames: array of String); procedure FormShow(Sender: TObject); procedure HyperlinkHandler(Sender: TObject; ACaption: String; var AHyperlink: TsHyperlink); procedure InspectorEnter(Sender: TObject); procedure InspectorExit(Sender: TObject); procedure InspectorTabControlChange(Sender: TObject); procedure ToolBar3Resize(Sender: TObject); procedure TSaveDialogTypeChange(Sender: TObject); procedure WorksheetGridClickHyperlink(Sender: TObject; const AHyperlink: TsHyperlink); procedure WorksheetGridMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); private FOpenFormats: TsSpreadFormatIDArray; FSaveFormats: TsSpreadFormatIDArray; FMRUMenuManager: TMRUMenuManager; FActivated: Boolean; procedure LoadFile(const AFileName: String); procedure MRUMenuManagerRecentFile(Sender: TObject; const AFileName: string); procedure SearchClose(Sender: TObject; var CloseAction: TCloseAction); procedure SearchFound(Sender: TObject; AFound: Boolean; AWorksheet: TsWorksheet; ARow, ACol: Cardinal); procedure UpdateCaption; procedure UpdateInspectorColumns; procedure UpdateRowHeights; protected procedure ReadFromIni; procedure WriteToIni; public end; var MainForm: TMainForm; implementation {$R *.lfm} uses LCLIntf, inifiles, uriparser, ValEdit, fpsUtils, fpsCSV, fpsReaderWriter, sCSVParamsForm, sCurrencyForm, sFormatSettingsForm, sSortParamsForm, sHyperlinkForm, sNumFormatForm, sSearchForm, sColWidthForm, sRowHeightForm, sWorksheetProtection, sZoomForm, sAbout, sUtils; var SEARCH_DLG_POS: TPoint = (X: -1; Y: -1); function CreateIni: TCustomIniFile; begin Result := TMemIniFile.Create(GetAppConfigFile(false)); end; { TMainForm } procedure TMainForm.AcAboutExecute(Sender: TObject); var F: TAboutForm; begin F := TAboutForm.Create(nil); try F.ShowModal; finally F.Free; end; end; procedure TMainForm.AcAddPageBreakColExecute(Sender: TObject); var sheet: TsWorksheet; c: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col); sheet.AddPageBreakToCol(c); WorksheetGrid.Invalidate; end; end; procedure TMainForm.AcAddPageBreakColUpdate(Sender: TObject); var sheet: TsWorksheet; c: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col); AcAddPageBreakCol.Enabled := not sheet.IsPageBreakCol(c); end; end; procedure TMainForm.AcAddPageBreakRowExecute(Sender: TObject); var sheet: TsWorksheet; r: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin r := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row); sheet.AddPageBreakToRow(r); WorksheetGrid.Invalidate; end; end; procedure TMainForm.AcAddPageBreakRowUpdate(Sender: TObject); var sheet: TsWorksheet; r: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin r := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row); AcAddPageBreakRow.Enabled := not sheet.IsPageBreakRow(r); end; end; procedure TMainForm.AcAutoRowHeightsExecute(Sender: TObject); begin Screen.Cursor := crHourglass; try WorksheetGrid.UpdateRowHeights(0, true); finally Screen.Cursor := crDefault; end; end; { Adds a column before the active cell } procedure TMainForm.AcColAddExecute(Sender: TObject); begin WorksheetGrid.InsertCol(WorksheetGrid.Col); WorksheetGrid.Col := WorksheetGrid.Col + 1; end; { Deletes the column with the active cell } procedure TMainForm.AcColDeleteExecute(Sender: TObject); var c: Integer; begin c := WorksheetGrid.Col; WorksheetGrid.DeleteCol(c); WorksheetGrid.Col := c; end; procedure TMainForm.AcColWidthExecute(Sender: TObject); var F: TColWidthForm; sc: Cardinal; book: TsWorkbook; sheet: TsWorksheet; begin book := WorkbookSource.Workbook; sheet := WorkbookSource.Worksheet; sc := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col); F := TColWidthForm.Create(nil); try F.Caption := 'Width of column ' + GetColString(sc); F.SetData(book, sheet.GetColWidth(sc, book.Units), sheet.GetColWidthType(sc)); if F.ShowModal = mrOK then begin sheet.WriteColWidth(sc, F.ColWidth, F.Units, F.ColWidthType); WorksheetGrid.UpdateColWidth(WorksheetGrid.Col); end; finally F.Free; end; end; procedure TMainForm.AcFileNewExecute(Sender: TObject); begin WorkbookSource.CreateNewWorkbook; //WorksheetGrid.NewWorkbook(26, 100); WorksheetGrid.BeginUpdate; try WorksheetGrid.Col := WorksheetGrid.FixedCols; WorksheetGrid.Row := WorksheetGrid.FixedRows; UpdateCaption; //SetupBackgroundColorBox; //WorksheetGridSelection(nil, WorksheetGrid.Col, WorksheetGrid.Row); finally WorksheetGrid.EndUpdate; end; end; { Loads the spreadsheet file selected by the AcFileOpen action } procedure TMainForm.AcFileOpenAccept(Sender: TObject); begin WorkbookSource.AutodetectFormat := false; case AcFileOpen.Dialog.FilterIndex of 1: WorkbookSource.AutoDetectFormat := true; // All spreadsheet files 2: WorkbookSource.AutoDetectFormat := true; // All Excel files else WorkbookSource.FileFormatID := FOpenFormats[AcFileOpen.Dialog.FilterIndex - 3]; // -3 because FilterIndex is 1-based and there are 2 add'l items at the top. end; LoadFile(AcFileOpen.Dialog.FileName); end; { Saves the spreadsheet to the file selected by the AcFileSaveAs action } procedure TMainForm.AcFileSaveAsAccept(Sender: TObject); var fmt: TsSpreadFormatID; begin Screen.Cursor := crHourglass; try fmt := FSaveFormats[AcFileSaveAs.Dialog.FilterIndex - 1]; WorkbookSource.SaveToSpreadsheetFile(UTF8ToAnsi(AcFileSaveAs.Dialog.FileName), fmt); FMRUMenuManager.AddToRecent(AcFileSaveAs.Dialog.FileName); UpdateCaption; finally Screen.Cursor := crDefault; end; end; procedure TMainForm.AcFileSaveAsBeforeExecute(Sender: TObject); var i: Integer; begin if WorkbookSource.FileName = '' then exit; AcFileSaveAs.Dialog.InitialDir := ExtractFileDir(WorkbookSource.FileName); AcFileSaveAs.Dialog.FileName := ExtractFileName(WorkbookSource.FileName); // Pre-select the file format according to the input file if WorkbookSource.Workbook.FileFormatID = sfidUnknown then exit; for i:=0 to High(FSaveformats) do if FSaveFormats[i] = WorkbookSource.Workbook.FileFormatID then begin AcFileSaveAs.Dialog.FilterIndex := i + 1; break; end; end; procedure TMainForm.AcFrozenColsExecute(Sender: TObject); begin if AcFrozenCols.Checked then WorksheetGrid.FrozenCols := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col) else WorksheetGrid.FrozenCols := 0; end; procedure TMainForm.AcFrozenColsUpdate(Sender: TObject); begin AcFrozenCols.Checked := WorksheetGrid.FrozenCols > 0; end; procedure TMainForm.AcFrozenRowsExecute(Sender: TObject); begin if AcFrozenRows.Checked then WorksheetGrid.FrozenRows := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row) else WorksheetGrid.FrozenRows := 0; end; procedure TMainForm.AcFrozenRowsUpdate(Sender: TObject); begin AcFrozenRows.Checked := WorksheetGrid.FrozenRows > 0; end; procedure TMainForm.AcHideColsExecute(Sender: TObject); var sheet: TsWorksheet; i: Integer; rng: TsCellRange; c: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin for i:=0 to sheet.GetSelectionCount-1 do begin rng := sheet.GetSelection[i]; for c := rng.Col1 to rng.Col2 do WorksheetGrid.HideCol(WorksheetGrid.GetGridCol(c)); end; end; end; procedure TMainForm.AcHideRowsExecute(Sender: TObject); var sheet: TsWorksheet; i: Integer; rng: TsCellRange; r: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin for i:=0 to sheet.GetSelectionCount-1 do begin rng := sheet.GetSelection[i]; for r := rng.Row1 to rng.Row2 do WorksheetGrid.HideRow(WorksheetGrid.GetGridRow(r)); end; end; end; procedure TMainForm.AcNumFormatCustomGetNumberFormatString(Sender: TObject; AWorkbook: TsWorkbook; var ANumFormatStr: String); var F: TNumFormatForm; sample: Double; begin Unused(AWorkbook); F := TNumFormatForm.Create(nil); try F.Position := poMainFormCenter; with WorkbookSource.Worksheet do sample := ReadAsNumber(ActiveCellRow, ActiveCellCol); F.SetData(ANumFormatStr, WorkbookSource.Workbook, sample); if F.ShowModal = mrOK then ANumFormatStr := F.NumFormatStr; finally F.Free; end; end; procedure TMainForm.AcRemovePageBreakColExecute(Sender: TObject); var sheet: TsWorksheet; c: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col); sheet.RemovePageBreakFromCol(c); WorksheetGrid.Invalidate; end; end; procedure TMainForm.AcRemovePageBreakColUpdate(Sender: TObject); var sheet: TsWorksheet; c: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col); AcRemovePageBreakCol.Enabled := sheet.IsPageBreakCol(c); end; end; procedure TMainForm.AcRemovePageBreakRowExecute(Sender: TObject); var sheet: TsWorksheet; r: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin r := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row); sheet.RemovePageBreakFromRow(r); WorksheetGrid.Invalidate; end; end; procedure TMainForm.AcRemovePageBreakRowUpdate(Sender: TObject); var sheet: TsWorksheet; r: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin r := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row); AcRemovePageBreakRow.Enabled := sheet.IsPageBreakRow(r); end; end; { Adds a row before the active cell } procedure TMainForm.AcRowAddExecute(Sender: TObject); begin WorksheetGrid.InsertRow(WorksheetGrid.Row); WorksheetGrid.Row := WorksheetGrid.Row + 1; end; { Deletes the row with the active cell } procedure TMainForm.AcRowDeleteExecute(Sender: TObject); var r: Integer; begin r := WorksheetGrid.Row; WorksheetGrid.DeleteRow(r); WorksheetGrid.Row := r; end; procedure TMainForm.AcRowHeightExecute(Sender: TObject); var F: TRowHeightForm; sr: Cardinal; book: TsWorkbook; sheet: TsWorksheet; begin book := WorkbookSource.Workbook; sheet := WorkbookSource.Worksheet; sr := WorksheetGrid.GetWorksheetRow(WorksheetGrid.Row); F := TRowHeightForm.Create(nil); try F.Caption := Format('Height of row %d', [WorksheetGrid.Row]); F.SetData(book, sheet.GetRowHeight(sr, book.Units), sheet.GetRowHeightType(sr)); if F.ShowModal = mrOK then begin sheet.WriteRowHeight(sr, F.RowHeight, F.Units, F.RowHeightType); WorksheetGrid.UpdateRowHeight(WorksheetGrid.Row, F.RowHeightType = rhtAuto); end; finally F.Free; end; end; procedure TMainForm.AcSettingsAutoUpdateRowheightsExecute(Sender: TObject); begin if AcSettingsAutoUpdateRowHeights.Checked then UpdateRowHeights; end; procedure TMainForm.AcWorksheetRTLExecute(Sender: TObject); begin if AcWorksheetRTL.Checked then begin if WorksheetGrid.IsRightToLeft then WorksheetGrid.Worksheet.BiDiMode := bdLTR else WorksheetGrid.Worksheet.BiDiMode := bdRTL; end else WorksheetGrid.Worksheet.BiDiMode := bdDefault; end; procedure TMainForm.AcWorksheetRTLUpdate(Sender: TObject); begin AcWorksheetRTL.Checked := WorksheetGrid.Worksheet.BiDiMode <> bdDefault; end; procedure TMainForm.AcSearchExecute(Sender: TObject); begin if SearchForm = nil then SearchForm := TSearchForm.Create(self) else if not SearchForm.Showing then begin SearchForm.Position := poDesigned; SearchForm.Left := SEARCH_DLG_POS.X; SearchForm.Top := SEARCH_DLG_POS.Y; end else SearchForm.BringToFront; SearchForm.OnFound := @SearchFound; SearchForm.OnClose := @SearchClose; SearchForm.SearchParams := DefaultSearchParams; SearchForm.ReplaceParams := DefaultReplaceParams; SearchForm.Execute(WorkbookSource.Workbook); end; procedure TMainForm.AcSettingsAutoDetectCellTypeExecute(Sender: TObject); begin WorksheetGrid.AutoDetectCellType := AcSettingsautoDetectCellType.Checked; end; procedure TMainForm.AcSettingsCSVParamsExecute(Sender: TObject); var F: TCSVParamsForm; begin F := TCSVParamsForm.Create(nil); try F.SetParams(CSVParams); if F.ShowModal = mrOK then F.GetParams(CSVParams); finally F.Free; end; end; procedure TMainForm.AcSettingsCurrencyExecute(Sender: TObject); var F: TCurrencyForm; begin F := TCurrencyForm.Create(nil); try F.ShowModal; finally F.Free; end; end; procedure TMainForm.AcSettingsFormatSettingsExecute(Sender: TObject); var F: TFormatSettingsForm; begin if WorksheetGrid.Workbook = nil then exit; F := TFormatSettingsForm.Create(nil); try F.FormatSettings := WorksheetGrid.Workbook.FormatSettings; if F.ShowModal = mrOK then begin WorksheetGrid.Workbook.FormatSettings := F.FormatSettings; UTF8FormatSettings := F.FormatSettings; WorksheetGrid.Invalidate; end; finally F.Free; end; end; procedure TMainForm.AcSettingsReadFormulasExecute(Sender: TObject); begin if AcSettingsReadFormulas.Checked then WorkbookSource.Options := WorkbookSource.Options + [boReadFormulas] else WorkbookSource.Options := WorkbookSource.Options - [boReadFormulas]; end; procedure TMainForm.AcShowColsExecute(Sender: TObject); var sheet: TsWorksheet; i: Integer; rng: TsCellRange; c: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin for i:=0 to sheet.GetSelectionCount-1 do begin rng := sheet.GetSelection[i]; for c := rng.Col1 to rng.Col2 do WorksheetGrid.ShowCol(WorksheetGrid.GetGridCol(c)); end; end; end; procedure TMainForm.AcShowGridLinesExecute(Sender: TObject); begin WorksheetGrid.ShowGridLines := AcShowGridLines.Checked; end; procedure TMainForm.AcShowGridLinesUpdate(Sender: TObject); begin AcShowGridLines.Checked := WorksheetGrid.ShowGridLines; end; procedure TMainForm.AcShowHeadersExecute(Sender: TObject); begin WorksheetGrid.ShowHeaders := AcShowHeaders.Checked; end; procedure TMainForm.AcShowHeadersUpdate(Sender: TObject); begin AcShowHeaders.Checked := WorksheetGrid.ShowHeaders; end; procedure TMainForm.AcShowPageBreaksExecute(Sender: TObject); begin WorksheetGrid.ShowPageBreaks := AcShowPageBreaks.Checked; end; procedure TMainForm.AcShowRowsExecute(Sender: TObject); var sheet: TsWorksheet; i: Integer; rng: TsCellRange; r: Cardinal; begin sheet := WorksheetGrid.Worksheet; if sheet <> nil then begin for i:=0 to sheet.GetSelectionCount-1 do begin rng := sheet.GetSelection[i]; for r := rng.Row1 to rng.Row2 do WorksheetGrid.ShowRow(WorksheetGrid.GetGridRow(r)); end; end; end; procedure TMainForm.AcSortColAscExecute(Sender: TObject); var c: Cardinal; sortParams: TsSortParams; begin c := WorksheetGrid.GetWorksheetCol(WorksheetGrid.Col); sortParams := InitSortParams; WorksheetGrid.BeginUpdate; try with WorkbookSource.Worksheet do Sort(sortParams, 0, c, GetLastOccupiedRowIndex, c); finally WorksheetGrid.EndUpdate; end; end; procedure TMainForm.AcSortExecute(Sender: TObject); var F: TSortParamsForm; r1,c1,r2,c2: Cardinal; begin F := TSortParamsForm.Create(nil); try F.WorksheetGrid := WorksheetGrid; if F.ShowModal = mrOK then begin // Limits of the range to be sorted with WorksheetGrid do begin r1 := GetWorksheetRow(Selection.Top); c1 := GetWorksheetCol(Selection.Left); r2 := GetWorksheetRow(Selection.Bottom); c2 := GetWorksheetCol(Selection.Right); end; // Execute sorting. Use Begin/EndUpdate to avoid unnecessary redraws. WorksheetGrid.BeginUpdate; try WorksheetGrid.Worksheet.Sort(F.SortParams, r1, c1, r2, c2) finally WorksheetGrid.EndUpdate; end; end; finally F.Free; end; end; procedure TMainForm.ActionListUpdate(AAction: TBasicAction; var Handled: Boolean ); begin if AAction = AcAutoRowHeights then AcAutoRowHeights.Enabled := WorkbookSource.Worksheet <> nil; end; { Toggles the spreadsheet inspector on and off } procedure TMainForm.AcViewInspectorExecute(Sender: TObject); begin InspectorTabControl.Visible := AcViewInspector.Checked; InspectorSplitter.Visible := AcViewInspector.Checked; InspectorSplitter.Left := 0; // Make sure that the splitter is always at the left of the inspector tabcontrol UpdateInspectorColumns; end; procedure TMainForm.AcWorksheetShowGridExecute(Sender: TObject); begin WorksheetGrid.ShowGridLines := AcWorksheetShowGrid.Checked; end; procedure TMainForm.AcWorksheetShowGridUpdate(Sender: TObject); begin with AcWorksheetShowGrid do begin Enabled := WorkbookSource.Worksheet <> nil; Checked := soShowGridLines in WorkbookSource.Worksheet.Options; end; end; procedure TMainForm.AcWorksheetShowHeadersExecute(Sender: TObject); begin WorksheetGrid.ShowHeaders := AcWorksheetShowHeaders.Checked; end; procedure TMainForm.AcWorksheetShowHeadersUpdate(Sender: TObject); begin with AcWorksheetShowHeaders do begin Enabled := WorkbookSource.Worksheet <> nil; Checked := soShowHeaders in WorkbookSource.Worksheet.Options; end; end; procedure TMainForm.AcZoomMoreExecute(Sender: TObject); var F: TZoomForm; begin F := TZoomForm.Create(nil); try F.Worksheet := WorkbookSource.Worksheet; if F.ShowModal = mrOK then AcZoomMore.Zoom := F.ZoomLevel; finally F.Free; end; end; procedure TMainForm.AcWorksheetProtectionExecute(Sender: TObject); var F: TWorksheetProtectionForm; begin F := TWorksheetProtectionForm.Create(nil); try F.IsProtected := not WorkbookSource.Worksheet.IsProtected; F.Protection := WorkbookSource.Worksheet.Protection; if F.ShowModal = mrOK then begin WorkbookSource.Worksheet.Protection := F.Protection; WorkbookSource.Worksheet.Protect(F.IsProtected); end; finally F.Free; end; end; procedure TMainForm.AcWorksheetProtectionUpdate(Sender: TObject); begin AcWorksheetProtection.Checked := WorkbookSource.Worksheet.IsProtected; end; procedure TMainForm.ColorComboboxAddColors(Sender: TObject); begin with TsCellCombobox(Sender) do begin // These are the Excel-8 palette colors, a bit rearranged and without the // duplicates. AddColor($000000, 'black'); AddColor($333333, 'gray 80%'); AddColor($808080, 'gray 50%'); AddColor($969696, 'gray 40%'); AddColor($C0C0C0, 'silver'); AddColor($FFFFFF, 'white'); AddColor($0000FF, 'red'); AddColor($00FF00, 'green'); AddColor($FF0000, 'blue'); AddColor($00FFFF, 'yellow'); AddColor($FF00FF, 'magenta'); AddColor($FFFF00, 'cyan'); AddColor($000080, 'dark red'); AddColor($008000, 'dark green'); AddColor($800000, 'dark blue'); AddColor($008080, 'olive'); AddColor($800080, 'purple'); AddColor($808000, 'teal'); AddColor($FF9999, 'periwinkle'); AddColor($663399, 'plum'); AddColor($CCFFFF, 'ivory'); AddColor($FFFFCC, 'light turquoise'); AddColor($660066, 'dark purple'); AddColor($8080FF, 'coral'); AddColor($CC6600, 'ocean blue'); AddColor($FFCCCC, 'ice blue'); AddColor($FFCC00, 'sky blue'); AddColor($CCFFCC, 'light green'); AddColor($99FFFF, 'light yellow'); AddColor($FFCC99, 'pale blue'); AddColor($CC99FF, 'rose'); AddColor($FF99CC, 'lavander'); AddColor($99CCFF, 'tan'); AddColor($FF6633, 'light blue'); AddColor($CCCC33, 'aqua'); AddColor($00CC99, 'lime'); AddColor($00CCFF, 'gold'); AddColor($0099FF, 'light orange'); AddColor($0066FF, 'orange'); AddColor($996666, 'blue gray'); AddColor($663300, 'dark teal'); AddColor($669933, 'sea green'); AddColor($003300, 'very dark green'); AddColor($003333, 'olive green'); AddColor($003399, 'brown'); AddColor($993300, 'indigo'); end; end; procedure TMainForm.FormActivate(Sender: TObject); begin if not FActivated then begin FActivated := true; ReadFromIni; end; end; procedure TMainForm.EditCut1Execute(Sender: TObject); begin // end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin if CanClose then try WriteToIni; except end; end; procedure TMainForm.FormCreate(Sender: TObject); var priorityFormatsR: Array[0..10] of TsSpreadFormatID; priorityFormatsW: Array[0..8] of TsSpreadFormatID; i: Integer; begin FMRUMenuManager := TMRUMenuManager.Create(self); with FMRUMenuManager do begin Name := 'MRUMenuManager'; IniFileName := GetAppConfigFile(false); IniSection := 'RecentFiles'; MaxRecent := 16; MenuCaptionMask := '&%x - %s'; // & --> create hotkey MenuItem := MnuFileReopen; PopupMenu := PuRecentFiles; OnRecentFile := @MRUMenuManagerRecentFile; end; // These are the formats used in the FileDialogs priorityFormatsR[0] := sfidOOXML_crypto; //ord(sfOOXML); priorityFormatsR[1] := ord(sfExcel8); priorityFormatsR[2] := ord(sfExcel5); priorityFormatsR[3] := sfidExcel4; priorityFormatsR[4] := sfidExcel3; priorityFormatsR[5] := ord(sfExcel2); priorityFormatsR[6] := ord(sfExcelXML); priorityFormatsR[7] := sfidOpenDocument_crypto; //ord(sfOpenDocument); priorityFormatsR[8] := ord(sfCSV); priorityFormatsR[9] := sfidSYLK; priorityFormatsR[10] := ord(sfHTML); priorityFormatsW[0] := ord(sfOOXML); priorityFormatsW[1] := ord(sfExcel8); priorityFormatsW[2] := ord(sfExcel5); //priorityFormatsW[3] := sfidExcel4; // no write support here priorityFormatsW[3] := ord(sfExcel2); priorityFormatsW[4] := ord(sfExcelXML); priorityFormatsW[5] := ord(sfOpenDocument); priorityFormatsW[6] := ord(sfCSV); priorityFormatsW[7] := sfidSYLK; priorityFormatsW[8] := ord(sfHTML); AcFileOpen.Dialog.Filter := GetFileFormatFilter('|', ';', faRead, priorityFormatsR, true, true); FOpenFormats := GetSpreadFormats(faRead, priorityFormatsR); (* // Use decrypting XLSX and ODS formats instead of normal XLSX/ODS formats for i:=0 to High(FOpenFormats) do case FOpenFormats[i] of ord(sfOOXML): FOpenFormats[i] := sfidOOXML_Crypto; ord(sfOpenDocument): FOpenFormats[i] := sfidOpenDocument_Crypto; end; *) AcFileSaveAs.Dialog.Filter := GetFileFormatFilter('|', ';', faWrite, priorityFormatsW); FSaveFormats := GetSpreadFormats(faWrite, priorityFormatsW); Panel2.Height := CellIndicator.Height + 2; Panel3.Constraints.MinHeight := CellIndicator.Height + 2; {$IFDEF WINDOWS} if Win32MajorVersion >= 10 then begin // avoid the ugly themed grid of Win10... WorksheetGrid.TitleStyle := tsLazarus; Inspector.TitleStyle := tsLazarus; end; {$ENDIF} end; // Drag and drop files from the explorer onto the main form. procedure TMainForm.FormDropFiles(Sender: TObject; const FileNames: array of String); begin WorkbookSource.AutoDetectFormat := true; LoadFile(FileNames[0]); end; procedure TMainForm.FormShow(Sender: TObject); begin UpdateInspectorColumns; end; { Event handler for hyperlinks: it only has to provide the hyperlink data which are applied to the active cell by the TsCellHyperlinkAction. Is called by the "new hyperlink" and "edit hyperlink" actions. Here we open the HyperlinkForm which is similar to the one used by Open/LibreOffice. Caption .... Caption of the form in which the hyperlink can be specified Hyperlink .. Data record (target, tooltip) for/from the the hyperlink form. } procedure TMainForm.HyperlinkHandler(Sender: TObject; ACaption: String; var AHyperlink: TsHyperlink); begin if HyperlinkForm = nil then HyperlinkForm := THyperlinkForm.Create(self); HyperlinkForm.Caption := ACaption; HyperlinkForm.SetHyperlink(WorkbookSource.Worksheet, AHyperlink); if HyperlinkForm.ShowModal = mrOK then HyperlinkForm.GetHyperlink(AHyperlink); end; procedure TMainForm.InspectorEnter(Sender: TObject); begin Inspector.Options := Inspector.Options + [goDrawFocusSelected]; end; procedure TMainForm.InspectorExit(Sender: TObject); begin Inspector.Options := Inspector.Options - [goDrawFocusSelected]; end; { Event handler to synchronize the mode of the spreadsheet inspector with the selected tab of the TabControl } procedure TMainForm.InspectorTabControlChange(Sender: TObject); begin Inspector.Mode := TsInspectorMode(InspectorTabControl.TabIndex); UpdateInspectorColumns; end; procedure TMainForm.ToolBar3Resize(Sender: TObject); begin // CellEdit.Width := ToolBar3.ClientWidth - CellEdit.Left - 4; end; procedure TMainForm.LoadFile(const AFileName: String); var crs: TCursor; begin crs := Screen.Cursor; Screen.Cursor := crHourglass; try WorkbookSource.FileName := UTF8ToAnsi(AFileName); // this loads the file FMRUMenuManager.AddToRecent(AFileName); UpdateCaption; if AcSettingsAutoUpdateRowHeights.Checked then UpdateRowHeights; finally Screen.Cursor := crs; end; end; procedure TMainForm.MRUMenuManagerRecentFile(Sender: TObject; const AFileName: string); begin WorkbookSource.AutoDetectFormat := true; LoadFile(AFileName); end; procedure TMainForm.ReadFromIni; var ini: TCustomIniFile; s: String; b: Boolean; L,T,W,H: Integer; Rect: TRect; begin ini := CreateIni; try L := ini.ReadInteger('MainForm', 'Left', Left); T := ini.ReadInteger('MainForm', 'Top', Top); W := ini.ReadInteger('MainForm', 'Width', Width); H := ini.ReadInteger('MainForm', 'Height', Height); Rect := Screen.DesktopRect; if W > Rect.Right - Rect.Left then W := Rect.Right - Rect.Left; if H > Rect.Bottom - Rect.Top then H := Rect.Bottom - Rect.Top; if L + W > Rect.Right then L := Rect.Right - W; if L < Rect.Left then L := Rect.Left; if T + H > Rect.Bottom then T := Rect.Bottom - H; if T < Rect.Top then T := Rect.Top; SetBounds(L, T, W, H); if ini.ReadBool('MainForm', 'Maximized', WindowState = wsMaximized) then WindowState := wsMaximized else WindowState := wsNormal; InspectortabControl.Width := ini.ReadInteger('Inspector', 'Width', InspectorTabControl.Width); s := ini.ReadString('Inspector', 'Page', ''); if s <> '' then InspectorTabControl.PageIndex := InspectorTabControl.Pages.IndexOf(s);; b := ini.ReadBool('Inspector', 'Visible', false); AcViewInspector.Checked := b; AcviewInspectorExecute(nil); AcSettingsReadFormulas.Checked := ini.ReadBool('Settings', 'ReadFormulas', true); AcSettingsReadFormulasExecute(nil); AcSettingsAutoUpdateRowHeights.Checked := ini.ReadBool('Settings', 'AutoUpdateRowHeights', false); finally ini.Free; end; end; procedure TMainForm.SearchClose(Sender: TObject; var CloseAction: TCloseAction); begin Unused(CloseAction); DefaultSearchParams := TSearchForm(Sender).SearchParams; DefaultReplaceParams := TSearchForm(Sender).ReplaceParams; SEARCH_DLG_POS.X := SearchForm.Left; SEARCH_DLG_POS.Y := SearchForm.Top; end; procedure TMainForm.SearchFound(Sender: TObject; AFound: Boolean; AWorksheet: TsWorksheet; ARow, ACol: Cardinal); begin Unused(AWorksheet, ARow, ACol); if AFound then begin // end else begin DefaultSearchParams := TSearchForm(Sender).SearchParams; MessageDlg( Format('The search text "%s" could not be found.', [DefaultSearchParams.SearchText]), mtInformation, [mbOK], 0 ); end; end; procedure TMainForm.TSaveDialogTypeChange(Sender: TObject); var ext: String; begin ext := GetSpreadFormatExt(FSaveFormats[AcFileSaveAs.Dialog.FilterIndex - 1]); AcFileSaveAs.Dialog.FileName := ChangeFileExt(AcFileSaveAs.Dialog.FileName, ext); end; procedure TMainForm.UpdateCaption; begin if (WorkbookSource = nil) or (WorkbookSource.FileName = '') then Caption := 'spready' else Caption := Format('spready - "%s" [%s]', [ AnsiToUTF8(WorkbookSource.Filename), GetSpreadTechnicalName(WorkbookSource.Workbook.FileFormatID) ]); end; procedure TMainForm.UpdateInspectorColumns; begin Inspector.DisplayOptions := Inspector.DisplayOptions + [doAutoColResize]; Inspector.DisplayOptions := Inspector.DisplayOptions - [doAutoColResize]; end; procedure TMainForm.UpdateRowHeights; begin WorksheetGrid.UpdateRowHeights(-1, true); end; procedure TMainForm.WriteToIni; var ini: TCustomIniFile; begin ini := CreateIni; try ini.WriteBool('MainForm', 'Maximized', WindowState = wsMaximized); if WindowState = wsNormal then begin ini.WriteInteger('MainForm', 'Left', Left); ini.WriteInteger('MainForm', 'Top', Top); ini.WriteInteger('MainForm', 'Width', Width); ini.WriteInteger('MainForm', 'Height', Height); end; ini.WriteInteger('Inspector', 'Width', InspectorTabControl.Width); ini.WriteString('Inspector', 'Page', InspectorTabControl.Tabs[InspectorTabControl.TabIndex]); ini.WriteBool('Inspector', 'Visible', InspectorTabControl.Visible); ini.WriteBool('Settings', 'ReadFormulas', AcSettingsReadFormulas.Checked); ini.WriteBool('Settings', 'AutoUpdateRowHeights', AcSettingsAutoUpdateRowHeights.Checked); finally ini.Free; end; end; { Event handler if an external hyperlink in a cell is activated. Usually the linked documents/web sites etc. are opened. } procedure TMainForm.WorksheetGridClickHyperlink(Sender: TObject; const AHyperlink: TsHyperlink); var u: TUri; begin u := ParseURI(AHyperlink.Target); case Lowercase(u.Protocol) of 'http', 'https', 'ftp', 'mailto', 'file': OpenUrl(AHyperlink.Target); else ShowMessage('Hyperlink ' + AHyperlink.Target + ' clicked'); end; end; procedure TMainForm.WorksheetGridMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); const GROWTH_FACTOR = 1.05; begin if ([ssCtrl, ssShift] * Shift = [ssCtrl, ssShift]) then begin if WheelDelta > 0 then WorksheetGrid.ZoomFactor := GROWTH_FACTOR* WorksheetGrid.ZoomFactor else WorksheetGrid.ZoomFactor := WorksheetGrid.ZoomFactor / GROWTH_FACTOR; Handled := true; end; end; end.