diff --git a/components/fpspreadsheet/examples/other/conditional_formatting/demo_conditional_formatting.pas b/components/fpspreadsheet/examples/other/conditional_formatting/demo_conditional_formatting.pas index c30f9f37d..fcd156c24 100644 --- a/components/fpspreadsheet/examples/other/conditional_formatting/demo_conditional_formatting.pas +++ b/components/fpspreadsheet/examples/other/conditional_formatting/demo_conditional_formatting.pas @@ -274,6 +274,15 @@ begin fmtIdx := wb.AddCellFormat(fmt); sh.WriteConditionalCellFormat(Range(row, 2, row, 2), cfcExpression, '=ISNUMBER($E$5)', fmtIdx); + // conditional format: expression + inc(row); + sh.WriteText(row, 0, 'expression: ISNUMBER(E5)'); + sh.WriteText(row, 1, 'background blue'); + InitFormatRecord(fmt); + fmt.SetBackgroundColor(scBlue); + fmtIdx := wb.AddCellFormat(fmt); + sh.WriteConditionalCellFormat(Range(row, 2, row, 5), cfcExpression, '=ISNUMBER(E5)', fmtIdx); + // Two rules in the same conditional format inc(row); sh.WriteText(row, 0, 'Two rules: #1: equal to 5, #2: equal to 3'); diff --git a/components/fpspreadsheet/source/common/fpscell.pas b/components/fpspreadsheet/source/common/fpscell.pas index c8cf04470..cee44d4a7 100644 --- a/components/fpspreadsheet/source/common/fpscell.pas +++ b/components/fpspreadsheet/source/common/fpscell.pas @@ -31,6 +31,7 @@ type procedure SetBackgroundColor(const AValue: TsColor); procedure SetBiDiMode(const AValue: TsBiDiMode); procedure SetBorder(const AValue: TsCellBorders); + procedure SetBorders(const ABorders: TsCellBorders; const AValue: TsCellBorderStyle); procedure SetBorderStyle(const ABorder: TsCellBorder; const AValue: TsCellBorderStyle); procedure SetBorderStyles(const AValue: TsCellBorderStyles); procedure SetCellFormat(const AValue: TsCellFormat); @@ -55,6 +56,8 @@ type read GetBiDiMode write SetBiDiMode; property Border: TsCellBorders read GetBorder write SetBorder; + property Borders[ABorders: TsCellBorders]: TsCellBorderStyle + write SetBorders; // write-only! property BorderStyle[ABorder: TsCellBorder]: TsCellBorderStyle read GetBorderStyle write SetBorderStyle; property BorderStyles: TsCellBorderStyles @@ -204,6 +207,16 @@ begin (Worksheet as TsWorksheet).WriteBorders(@self, AValue); end; +procedure TCellHelper.SetBorders(const ABorders: TsCellBorders; + const AValue: TsCellBorderStyle); +var + fmt: TsCellFormat; +begin + fmt := CellFormat; + fmt.SetBorders(ABorders, AValue.Color, AValue.LineStyle); + CellFormat := fmt; +end; + procedure TCellHelper.SetBorderStyle(const ABorder: TsCellBorder; const AValue: TsCellBorderStyle); begin diff --git a/components/fpspreadsheet/source/common/fpstypes.pas b/components/fpspreadsheet/source/common/fpstypes.pas index 886a1dbc2..547c05232 100644 --- a/components/fpspreadsheet/source/common/fpstypes.pas +++ b/components/fpspreadsheet/source/common/fpstypes.pas @@ -543,6 +543,8 @@ const {@@ Border style to be used for "no border"} NO_CELL_BORDER: TsCellBorderStyle = (LineStyle: lsThin; Color: scNotDefined); + ALL_BORDERS: TsCellBorders = [cbNorth, cbEast, cbSouth, cbWest]; + type {@@ Style of fill pattern for cell backgrounds } TsFillStyle = (fsNoFill, fsSolidFill, @@ -724,7 +726,7 @@ type procedure SetBackground(AFillStyle: TsFillStyle; AFgColor, ABgColor: TsColor); procedure SetBackgroundColor(AColor: TsColor); procedure SetBorders(ABorders: TsCellBorders; - AColor: TsColor = scBlack; ALineStyle: TsLineStyle = lsThin); + const AColor: TsColor = scBlack; const ALineStyle: TsLineStyle = lsThin); procedure SetFont(AFontIndex: Integer); procedure SetHorAlignment(AHorAlign: TsHorAlignment); procedure SetTextRotation(ARotation: TsTextRotation); @@ -1088,13 +1090,13 @@ begin end; procedure TsCellFormat.SetBorders(ABorders: TsCellBorders; - AColor: TsColor = scBlack; ALineStyle: TsLineStyle = lsThin); + const AColor: TsColor = scBlack; const ALineStyle: TsLineStyle = lsThin); var cb: TsCellBorder; begin for cb in ABorders do begin - if (AColor = scTransparent) then + if (AColor = scTransparent) or (AColor = scNotDefined) then Exclude(Border, cb) else begin diff --git a/components/fpspreadsheet/source/common/fpsutils.pas b/components/fpspreadsheet/source/common/fpsutils.pas index 64812a1fd..9236f25e5 100644 --- a/components/fpspreadsheet/source/common/fpsutils.pas +++ b/components/fpspreadsheet/source/common/fpsutils.pas @@ -227,7 +227,11 @@ function SameFont(AFont1, AFont2: TsFont): Boolean; overload; function SameFont(AFont: TsFont; AFontName: String; AFontSize: Single; AStyle: TsFontStyles; AColor: TsColor; APos: TsFontPosition): Boolean; overload; -function Range(ARow1, ACol1, ARow2, ACol2: Cardinal): TsCellRange; +function Range(ARow, ACol: Cardinal): TsCellRange; overload; +function Range(ARow1, ACol1, ARow2, ACol2: Cardinal): TsCellRange; overload; + +function CellBorderStyle(const AColor: TsColor = scBlack; + const ALineStyle: TsLineStyle = lsThin): TsCellBorderStyle; function GetFontAsString(AFont: TsFont): String; @@ -2757,9 +2761,20 @@ begin (AFont.Position = APos); end; +{@@ ---------------------------------------------------------------------------- + Creates a TsCellRange record from the coordinates of a single cell. +-------------------------------------------------------------------------------} +function Range(ARow, ACol: Cardinal): TsCellRange; +begin + Result.Row1 := ARow; + Result.Row2 := ARow; + Result.Col1 := ACol; + Result.Col2 := ACol; +end; + {@@ ---------------------------------------------------------------------------- Creates a TsCellRange record from the provided cell corner coordinates. - Put the coordinates into right order if needed. + Puts the coordinates into right order if needed. -------------------------------------------------------------------------------} function Range(ARow1, ACol1, ARow2, ACol2: Cardinal): TsCellRange; begin @@ -2803,31 +2818,16 @@ begin end; end; - - (* {@@ ---------------------------------------------------------------------------- - Constructs a string of length "Len" containing random uppercase characters + Combines color and linestyle to a TsCellBorderStyle record -------------------------------------------------------------------------------} -function GetRandomString(Len: Integer): String; +function CellBorderStyle(const AColor: TsColor = scBlack; + const ALineStyle: TsLineStyle = lsThin): TsCellBorderStyle; begin - Result := ''; - While Length(Result) < Len do - Result := Result + char(ord('A') + random(26)); + Result.Color := AColor; + Result.LineStyle := ALineStyle; end; -{@@ ---------------------------------------------------------------------------- - Constructs a unique folder name in the temp directory of the OS --------------------------------------------------------------------------------} -function GetUniqueTempDir(Global: Boolean): String; -var - tempdir: String; -begin - tempdir := AppendPathDelim(GetTempDir(Global)); - repeat - Result := tempdir + AppendPathDelim(GetRandomString(8)); - until not DirectoryExists(Result); -end; - *) {@@ ---------------------------------------------------------------------------- Appends a string to a stream