diff --git a/components/fpspreadsheet/fpsfunc.pas b/components/fpspreadsheet/fpsfunc.pas
index 46fdd11db..cb8d0112b 100644
--- a/components/fpspreadsheet/fpsfunc.pas
+++ b/components/fpspreadsheet/fpsfunc.pas
@@ -17,6 +17,19 @@ type
TsArgNumberArray = array of double;
TsArgStringArray = array of string;
+ TsArgument = record
+ IsMissing: Boolean;
+ Worksheet: TsWorksheet;
+ ArgumentType: TsArgumentType;
+ Cell: PCell;
+ FirstRow, FirstCol, LastRow, LastCol: Cardinal;
+ NumberValue: Double;
+ StringValue: String;
+ BoolValue: Boolean;
+ ErrorValue: TsErrorValue;
+ end;
+
+{
TsArgument = record
IsMissing: Boolean;
Worksheet: TsWorksheet;
@@ -28,6 +41,7 @@ type
atBool : (BoolValue: Boolean);
atError : (ErrorValue: TsErrorValue);
end;
+ }
PsArgument = ^TsArgument;
TsArgumentStack = class(TFPList)
@@ -191,6 +205,7 @@ uses
function CreateArgument: TsArgument;
begin
+ Result.StringValue := '';
FillChar(Result, SizeOf(Result), 0);
end;
@@ -419,7 +434,7 @@ var
begin
P := PsArgument(Items[AIndex]);
P^.StringValue := '';
- FreeMem(P, SizeOf(P));
+ FreeMem(P, SizeOf(P^));
inherited Delete(AIndex);
end;
diff --git a/components/fpspreadsheet/fpspreadsheet.pas b/components/fpspreadsheet/fpspreadsheet.pas
index e4a65e42e..65bf5b789 100755
--- a/components/fpspreadsheet/fpspreadsheet.pas
+++ b/components/fpspreadsheet/fpspreadsheet.pas
@@ -4540,7 +4540,6 @@ end;
}
procedure TsWorksheet.InsertRow(ARow: Cardinal);
var
- cell: PCell;
row: PRow;
cellnode: TAVLTreeNode;
i: Integer;
@@ -4817,7 +4816,6 @@ procedure TsWorkbook.GetLastRowColIndex(out ALastRow, ALastCol: Cardinal);
var
i: Integer;
sheet: TsWorksheet;
- r1,r2, c1,c2: Cardinal;
begin
if (boVirtualMode in Options) then begin
ALastRow := FVirtualRowCount - 1;
@@ -6555,8 +6553,10 @@ end;
}
procedure DisposeRPNItem(AItem: PRPNItem);
begin
- if AItem <> nil then
+ if AItem <> nil then begin
+ AItem.FE.StringValue := '';;
FreeMem(AItem, SizeOf(TRPNItem));
+ end;
end;
{@@
diff --git a/components/fpspreadsheet/tests/colortests.pas b/components/fpspreadsheet/tests/colortests.pas
index 60d250e47..867749749 100644
--- a/components/fpspreadsheet/tests/colortests.pas
+++ b/components/fpspreadsheet/tests/colortests.pas
@@ -120,66 +120,71 @@ begin
TempFile:=GetTempFileName;
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:= MyWorkBook.AddWorksheet(ColorsSheet);
+ try
+ MyWorkSheet:= MyWorkBook.AddWorksheet(ColorsSheet);
- // Define palette
- case whichPalette of
- 5: MyWorkbook.UsePalette(@PALETTE_BIFF5, Length(PALETTE_BIFF5));
- 8: MyWorkbook.UsePalette(@PALETTE_BIFF8, Length(PALETTE_BIFF8));
- 999: begin // Random palette: testing of color replacement
- MyWorkbook.UsePalette(@PALETTE_BIFF8, Length(PALETTE_BIFF8));
- for i:=8 to 63 do // first 8 colors cannot be changed
- MyWorkbook.SetPaletteColor(i, random(256) + random(256) shr 8 + random(256) shr 16);
- end;
- // else use default palette
+ // Define palette
+ case whichPalette of
+ 5: MyWorkbook.UsePalette(@PALETTE_BIFF5, Length(PALETTE_BIFF5));
+ 8: MyWorkbook.UsePalette(@PALETTE_BIFF8, Length(PALETTE_BIFF8));
+ 999: begin // Random palette: testing of color replacement
+ MyWorkbook.UsePalette(@PALETTE_BIFF8, Length(PALETTE_BIFF8));
+ for i:=8 to 63 do // first 8 colors cannot be changed
+ MyWorkbook.SetPaletteColor(i, random(256) + random(256) shr 8 + random(256) shr 16);
+ end;
+ // else use default palette
+ end;
+
+ // Remember all colors because ODS does not have a palette in the file; therefore
+ // we do not know which colors to expect.
+ SetLength(pal, MyWorkbook.GetPaletteSize);
+ for i:=0 to High(pal) do
+ pal[i] := MyWorkbook.GetPaletteColor(i);
+
+ // Write out all colors
+ row := 0;
+ col := 0;
+ for color := 0 to MyWorkbook.GetPaletteSize-1 do begin
+ MyWorksheet.WriteUTF8Text(row, col, CELLTEXT);
+ MyWorksheet.WriteBackgroundColor(row, col, color);
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ currentRGB := MyWorkbook.GetPaletteColor(MyCell^.BackgroundColor);
+ expectedRGB := MyWorkbook.GetPaletteColor(color);
+ CheckEquals(expectedRGB, currentRGB,
+ 'Test unsaved background color, cell ' + CellNotation(MyWorksheet,0,0));
+ inc(row);
+ end;
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
end;
- // Remember all colors because ODS does not have a palette in the file; therefore
- // we do not know which colors to expect.
- SetLength(pal, MyWorkbook.GetPaletteSize);
- for i:=0 to High(pal) do
- pal[i] := MyWorkbook.GetPaletteColor(i);
-
- // Write out all colors
- row := 0;
- col := 0;
- for color := 0 to MyWorkbook.GetPaletteSize-1 do begin
- MyWorksheet.WriteUTF8Text(row, col, CELLTEXT);
- MyWorksheet.WriteBackgroundColor(row, col, color);
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- currentRGB := MyWorkbook.GetPaletteColor(MyCell^.BackgroundColor);
- expectedRGB := MyWorkbook.GetPaletteColor(color);
- CheckEquals(expectedRGB, currentRGB,
- 'Test unsaved background color, cell ' + CellNotation(MyWorksheet,0,0));
- inc(row);
- end;
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
-
// Open the spreadsheet
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook, ColorsSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
- for row := 0 to MyWorksheet.GetLastRowIndex do begin
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- color := TsColor(row);
- currentRGB := MyWorkbook.GetPaletteColor(MyCell^.BackgroundColor);
- expectedRGB := pal[color];
- CheckEquals(expectedRGB, currentRGB,
- 'Test saved background color, cell '+CellNotation(MyWorksheet,Row,Col));
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet
+ else
+ MyWorksheet := GetWorksheetByName(MyWorkBook, ColorsSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
+ for row := 0 to MyWorksheet.GetLastRowIndex do begin
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ color := TsColor(row);
+ currentRGB := MyWorkbook.GetPaletteColor(MyCell^.BackgroundColor);
+ expectedRGB := pal[color];
+ CheckEquals(expectedRGB, currentRGB,
+ 'Test saved background color, cell '+CellNotation(MyWorksheet,Row,Col));
+ end;
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
end;
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
end;
procedure TSpreadWriteReadColorTests.TestWriteReadFontColors(AFormat: TsSpreadsheetFormat;
@@ -204,68 +209,73 @@ begin
TempFile:=GetTempFileName;
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:= MyWorkBook.AddWorksheet(ColorsSheet);
+ try
+ MyWorkSheet:= MyWorkBook.AddWorksheet(ColorsSheet);
- // Define palette
- case whichPalette of
- 5: MyWorkbook.UsePalette(@PALETTE_BIFF5, High(PALETTE_BIFF5)+1);
- 8: MyWorkbook.UsePalette(@PALETTE_BIFF8, High(PALETTE_BIFF8)+1);
- 999: begin // Random palette: testing of color replacement
- MyWorkbook.UsePalette(@PALETTE_BIFF8, Length(PALETTE_BIFF8));
- for i:=8 to 63 do // first 8 colors cannot be changed
- MyWorkbook.SetPaletteColor(i, random(256) + random(256) shr 8 + random(256) shr 16);
- end;
- // else use default palette
+ // Define palette
+ case whichPalette of
+ 5: MyWorkbook.UsePalette(@PALETTE_BIFF5, High(PALETTE_BIFF5)+1);
+ 8: MyWorkbook.UsePalette(@PALETTE_BIFF8, High(PALETTE_BIFF8)+1);
+ 999: begin // Random palette: testing of color replacement
+ MyWorkbook.UsePalette(@PALETTE_BIFF8, Length(PALETTE_BIFF8));
+ for i:=8 to 63 do // first 8 colors cannot be changed
+ MyWorkbook.SetPaletteColor(i, random(256) + random(256) shr 8 + random(256) shr 16);
+ end;
+ // else use default palette
+ end;
+
+ // Remember all colors because ODS does not have a palette in the file;
+ // therefore we do not know which colors to expect.
+ SetLength(pal, MyWorkbook.GetPaletteSize);
+ for color:=0 to High(pal) do
+ pal[color] := MyWorkbook.GetPaletteColor(color);
+
+ // Write out all colors
+ row := 0;
+ col := 0;
+ for color := 0 to MyWorkbook.GetPaletteSize-1 do begin
+ MyWorksheet.WriteUTF8Text(row, col, CELLTEXT);
+ MyWorksheet.WriteFontColor(row, col, color);
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ colorInFile := MyWorkbook.GetFont(MyCell^.FontIndex).Color;
+ currentRGB := MyWorkbook.GetPaletteColor(colorInFile);
+ expectedRGB := MyWorkbook.GetPaletteColor(color);
+ CheckEquals(expectedRGB, currentRGB,
+ 'Test unsaved font color, cell ' + CellNotation(MyWorksheet,row, col));
+ inc(row);
+ end;
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
end;
- // Remember all colors because ODS does not have a palette in the file;
- // therefore we do not know which colors to expect.
- SetLength(pal, MyWorkbook.GetPaletteSize);
- for color:=0 to High(pal) do
- pal[color] := MyWorkbook.GetPaletteColor(color);
-
- // Write out all colors
- row := 0;
- col := 0;
- for color := 0 to MyWorkbook.GetPaletteSize-1 do begin
- MyWorksheet.WriteUTF8Text(row, col, CELLTEXT);
- MyWorksheet.WriteFontColor(row, col, color);
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- colorInFile := MyWorkbook.GetFont(MyCell^.FontIndex).Color;
- currentRGB := MyWorkbook.GetPaletteColor(colorInFile);
- expectedRGB := MyWorkbook.GetPaletteColor(color);
- CheckEquals(expectedRGB, currentRGB,
- 'Test unsaved font color, cell ' + CellNotation(MyWorksheet,row, col));
- inc(row);
- end;
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
-
// Open the spreadsheet
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook, ColorsSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
- for row := 0 to MyWorksheet.GetLastRowIndex do begin
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- color := TsColor(row);
- colorInFile := MyWorkbook.GetFont(MyCell^.FontIndex).Color;
- currentRGB := MyWorkbook.GetPaletteColor(colorInFile);
- expectedRGB := pal[color]; //MyWorkbook.GetPaletteColor(color);
- CheckEquals(expectedRGB, currentRGB,
- 'Test saved font color, cell '+CellNotation(MyWorksheet,Row,Col));
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet
+ else
+ MyWorksheet := GetWorksheetByName(MyWorkBook, ColorsSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
+ for row := 0 to MyWorksheet.GetLastRowIndex do begin
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ color := TsColor(row);
+ colorInFile := MyWorkbook.GetFont(MyCell^.FontIndex).Color;
+ currentRGB := MyWorkbook.GetPaletteColor(colorInFile);
+ expectedRGB := pal[color]; //MyWorkbook.GetPaletteColor(color);
+ CheckEquals(expectedRGB, currentRGB,
+ 'Test saved font color, cell '+CellNotation(MyWorksheet,Row,Col));
+ end;
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
end;
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
end;
{ Tests for BIFF2 file format }
diff --git a/components/fpspreadsheet/tests/datetests.pas b/components/fpspreadsheet/tests/datetests.pas
index 995f8ee6d..7b64f7103 100644
--- a/components/fpspreadsheet/tests/datetests.pas
+++ b/components/fpspreadsheet/tests/datetests.pas
@@ -389,39 +389,43 @@ begin
}
// Write out all test values
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:=MyWorkBook.AddWorksheet(DatesSheet);
- for Row := Low(SollDates) to High(SollDates) do
- begin
- MyWorkSheet.WriteDateTime(Row, 0, SollDates[Row], nfShortDateTime);
- // Some checks inside worksheet itself
- if not(MyWorkSheet.ReadAsDateTime(Row,0,ActualDateTime)) then
- Fail('Failed writing date time for cell '+CellNotation(MyWorkSheet,Row));
- CheckEquals(SollDates[Row],ActualDateTime,'Test date/time value mismatch cell '+CellNotation(MyWorksheet,Row));
+ try
+ MyWorkSheet:=MyWorkBook.AddWorksheet(DatesSheet);
+ for Row := Low(SollDates) to High(SollDates) do
+ begin
+ MyWorkSheet.WriteDateTime(Row, 0, SollDates[Row], nfShortDateTime);
+ // Some checks inside worksheet itself
+ if not(MyWorkSheet.ReadAsDateTime(Row,0,ActualDateTime)) then
+ Fail('Failed writing date time for cell '+CellNotation(MyWorkSheet,Row));
+ CheckEquals(SollDates[Row],ActualDateTime,'Test date/time value mismatch cell '+CellNotation(MyWorksheet,Row));
+ end;
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
end;
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
// Open the spreadsheet, as biff8
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook,DatesSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet
+ else
+ MyWorksheet := GetWorksheetByName(MyWorkBook,DatesSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
- // Read test data from A column & compare if written=original
- for Row := Low(SollDates) to High(SollDates) do
- begin
- if not(MyWorkSheet.ReadAsDateTime(Row,0,ActualDateTime)) then
- Fail('Could not read date time for cell '+CellNotation(MyWorkSheet,Row));
- CheckEquals(SollDates[Row],ActualDateTime,'Test date/time value mismatch cell '+CellNotation(MyWorkSheet,Row));
+ // Read test data from A column & compare if written=original
+ for Row := Low(SollDates) to High(SollDates) do
+ begin
+ if not(MyWorkSheet.ReadAsDateTime(Row,0,ActualDateTime)) then
+ Fail('Could not read date time for cell '+CellNotation(MyWorkSheet,Row));
+ CheckEquals(SollDates[Row],ActualDateTime,'Test date/time value mismatch cell '+CellNotation(MyWorkSheet,Row));
+ end;
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
end;
- // Finalization
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
end;
procedure TSpreadWriteReadDateTests.TestWriteReadDates_BIFF2;
diff --git a/components/fpspreadsheet/tests/emptycelltests.pas b/components/fpspreadsheet/tests/emptycelltests.pas
index 25a9aa262..220103aa1 100644
--- a/components/fpspreadsheet/tests/emptycelltests.pas
+++ b/components/fpspreadsheet/tests/emptycelltests.pas
@@ -155,62 +155,67 @@ var
begin
TempFile := GetTempFileName;
- MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:= MyWorkBook.AddWorksheet(EmptyCellsSheet);
-
L := TStringList.Create;
try
L.Delimiter := '|';
L.StrictDelimiter := true;
L.DelimitedText := SollLayoutStrings[ALayout];
- // Write out cells
- for row := 0 to L.Count-1 do begin
- s := L[row];
- for col := 0 to Length(s)-1 do begin
- if AInverted then begin
- if s[col+1] = ' ' then s[col+1] := 'x' else s[col+1] := ' ';
+ MyWorkbook := TsWorkbook.Create;
+ try
+ MyWorkSheet:= MyWorkBook.AddWorksheet(EmptyCellsSheet);
+
+ // Write out cells
+ for row := 0 to L.Count-1 do begin
+ s := L[row];
+ for col := 0 to Length(s)-1 do begin
+ if AInverted then begin
+ if s[col+1] = ' ' then s[col+1] := 'x' else s[col+1] := ' ';
+ end;
+ if s[col+1] = 'x' then
+ MyWorksheet.WriteUTF8Text(row, col, CELLTEXT);
+ end;
end;
- if s[col+1] = 'x' then
- MyWorksheet.WriteUTF8Text(row, col, CELLTEXT);
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
end;
- end;
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
// Open the spreadsheet
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook, EmptyCellsSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
-
- for row := 0 to MyWorksheet.GetLastRowIndex do begin
- SetLength(s, MyWorksheet.GetLastColIndex + 1);
- for col := 0 to MyWorksheet.GetLastColIndex do begin
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then s[col+1] := ' ' else s[col+1] := 'x';
- if AInverted then begin
- if s[col+1] = ' ' then s[col+1] := 'x' else s[col+1] := ' ';
- end;
- end;
- if AInverted then
- while Length(s) < Length(L[row]) do s := s + 'x'
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet
else
- while Length(s) < Length(L[row]) do s := s + ' ';
- CheckEquals(L[row], s,
- 'Test empty cell layout mismatch, cell '+CellNotation(MyWorksheet, Row, Col));
+ MyWorksheet := GetWorksheetByName(MyWorkBook, EmptyCellsSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
+
+ for row := 0 to MyWorksheet.GetLastRowIndex do begin
+ SetLength(s, MyWorksheet.GetLastColIndex + 1);
+ for col := 0 to MyWorksheet.GetLastColIndex do begin
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then s[col+1] := ' ' else s[col+1] := 'x';
+ if AInverted then begin
+ if s[col+1] = ' ' then s[col+1] := 'x' else s[col+1] := ' ';
+ end;
+ end;
+ if AInverted then
+ while Length(s) < Length(L[row]) do s := s + 'x'
+ else
+ while Length(s) < Length(L[row]) do s := s + ' ';
+ CheckEquals(L[row], s,
+ 'Test empty cell layout mismatch, cell '+CellNotation(MyWorksheet, Row, Col));
+ end;
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
end;
+
finally
L.Free;
end;
-
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
end;
{ BIFF2 tests }
diff --git a/components/fpspreadsheet/tests/fonttests.pas b/components/fpspreadsheet/tests/fonttests.pas
index d79342e54..40f786c8d 100644
--- a/components/fpspreadsheet/tests/fonttests.pas
+++ b/components/fpspreadsheet/tests/fonttests.pas
@@ -143,61 +143,66 @@ begin
DeleteFile(TempFile);
}
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:= MyWorkBook.AddWorksheet(FontSheet);
+ try
+ MyWorkSheet:= MyWorkBook.AddWorksheet(FontSheet);
- // Write out a cell without "bold" formatting style
- row := 0;
- col := 0;
- MyWorksheet.WriteUTF8Text(row, col, 'not bold');
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- CheckEquals(uffBold in MyCell^.UsedFormattingFields, false,
- 'Test unsaved bold attribute, cell '+CellNotation(MyWorksheet,Row,Col));
+ // Write out a cell without "bold" formatting style
+ row := 0;
+ col := 0;
+ MyWorksheet.WriteUTF8Text(row, col, 'not bold');
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ CheckEquals(uffBold in MyCell^.UsedFormattingFields, false,
+ 'Test unsaved bold attribute, cell '+CellNotation(MyWorksheet,Row,Col));
- // Write out a cell with "bold" formatting style
- inc(row);
- MyWorksheet.WriteUTF8Text(row, col, 'bold');
- MyWorksheet.WriteUsedFormatting(row, col, [uffBold]);
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failded to get cell.');
- CheckEquals(uffBold in MyCell^.UsedFormattingFields, true,
- 'Test unsaved bold attribute, cell '+CellNotation(MyWorksheet,Row, Col));
+ // Write out a cell with "bold" formatting style
+ inc(row);
+ MyWorksheet.WriteUTF8Text(row, col, 'bold');
+ MyWorksheet.WriteUsedFormatting(row, col, [uffBold]);
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failded to get cell.');
+ CheckEquals(uffBold in MyCell^.UsedFormattingFields, true,
+ 'Test unsaved bold attribute, cell '+CellNotation(MyWorksheet,Row, Col));
- TempFile:=NewTempFile;
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
+ TempFile:=NewTempFile;
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
+ end;
// Open the spreadsheet
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet // only 1 sheet for BIFF2
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook, FontSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet // only 1 sheet for BIFF2
+ else
+ MyWorksheet := GetWorksheetByName(MyWorkBook, FontSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
- // Try to read cell without "bold"
- row := 0;
- col := 0;
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- CheckEquals(uffBold in MyCell^.UsedFormattingFields, false,
- 'Test saved bold attribute, cell '+CellNotation(MyWorksheet,row,col));
+ // Try to read cell without "bold"
+ row := 0;
+ col := 0;
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ CheckEquals(uffBold in MyCell^.UsedFormattingFields, false,
+ 'Test saved bold attribute, cell '+CellNotation(MyWorksheet,row,col));
- // Try to read cell with "bold"
- inc(row);
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- CheckEquals(uffBold in MyCell^.UsedFormattingFields, true,
- 'Test saved bold attribute, cell '+CellNotation(MyWorksheet,row,col));
-
- MyWorkbook.Free;
- DeleteFile(TempFile);
+ // Try to read cell with "bold"
+ inc(row);
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ CheckEquals(uffBold in MyCell^.UsedFormattingFields, true,
+ 'Test saved bold attribute, cell '+CellNotation(MyWorksheet,row,col));
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
+ end;
end;
procedure TSpreadWriteReadFontTests.TestWriteReadFont(AFormat: TsSpreadsheetFormat;
@@ -220,64 +225,69 @@ begin
DeleteFile(TempFile);
}
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:= MyWorkBook.AddWorksheet(FontSheet);
+ try
+ MyWorkSheet:= MyWorkBook.AddWorksheet(FontSheet);
- // Write out all font styles at various sizes
- for row := 0 to High(SollSizes) do
- begin
- for col := 0 to High(SollStyles) do
- begin
- cellText := Format('%s, %.1f-pt', [AFontName, SollSizes[row]]);
- MyWorksheet.WriteUTF8Text(row, col, celltext);
- MyWorksheet.WriteFont(row, col, AFontName, SollSizes[row], SollStyles[col], scBlack);
+ // Write out all font styles at various sizes
+ for row := 0 to High(SollSizes) do
+ begin
+ for col := 0 to High(SollStyles) do
+ begin
+ cellText := Format('%s, %.1f-pt', [AFontName, SollSizes[row]]);
+ MyWorksheet.WriteUTF8Text(row, col, celltext);
+ MyWorksheet.WriteFont(row, col, AFontName, SollSizes[row], SollStyles[col], scBlack);
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- font := MyWorkbook.GetFont(MyCell^.FontIndex);
- CheckEquals(SollSizes[row], font.Size,
- 'Test unsaved font size, cell ' + CellNotation(MyWorksheet,0,0));
- currValue := GetEnumName(TypeInfo(TsFontStyles), byte(font.Style));
- expectedValue := GetEnumName(TypeInfo(TsFontStyles), byte(SollStyles[col]));
- CheckEquals(currValue, expectedValue,
- 'Test unsaved font style, cell ' + CellNotation(MyWorksheet,0,0));
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ font := MyWorkbook.GetFont(MyCell^.FontIndex);
+ CheckEquals(SollSizes[row], font.Size,
+ 'Test unsaved font size, cell ' + CellNotation(MyWorksheet,0,0));
+ currValue := GetEnumName(TypeInfo(TsFontStyles), byte(font.Style));
+ expectedValue := GetEnumName(TypeInfo(TsFontStyles), byte(SollStyles[col]));
+ CheckEquals(currValue, expectedValue,
+ 'Test unsaved font style, cell ' + CellNotation(MyWorksheet,0,0));
+ end;
end;
+ TempFile:=NewTempFile;
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
end;
- TempFile:=NewTempFile;
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
// Open the spreadsheet
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet // only 1 sheet for BIFF2
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook, FontSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
- counter := 0;
- for row := 0 to MyWorksheet.GetLastRowIndex do
- for col := 0 to MyWorksheet.GetLastColIndex do
- begin
- if (AFormat = sfExcel2) and (counter = 4) then
- break; // Excel 2 allows only 4 fonts
- MyCell := MyWorksheet.FindCell(row, col);
- if MyCell = nil then
- fail('Error in test code. Failed to get cell.');
- font := MyWorkbook.GetFont(MyCell^.FontIndex);
- if abs(SollSizes[row] - font.Size) > 1e-6 then // safe-guard against rounding errors
- CheckEquals(SollSizes[row], font.Size,
- 'Test saved font size, cell '+CellNotation(MyWorksheet,Row,Col));
- currValue := GetEnumName(TypeInfo(TsFontStyles), byte(font.Style));
- expectedValue := GetEnumName(TypeInfo(TsFontStyles), byte(SollStyles[col]));
- CheckEquals(currValue, expectedValue,
- 'Test unsaved font style, cell ' + CellNotation(MyWorksheet,0,0));
- inc(counter);
- end;
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet // only 1 sheet for BIFF2
+ else
+ MyWorksheet := GetWorksheetByName(MyWorkBook, FontSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
+ counter := 0;
+ for row := 0 to MyWorksheet.GetLastRowIndex do
+ for col := 0 to MyWorksheet.GetLastColIndex do
+ begin
+ if (AFormat = sfExcel2) and (counter = 4) then
+ break; // Excel 2 allows only 4 fonts
+ MyCell := MyWorksheet.FindCell(row, col);
+ if MyCell = nil then
+ fail('Error in test code. Failed to get cell.');
+ font := MyWorkbook.GetFont(MyCell^.FontIndex);
+ if abs(SollSizes[row] - font.Size) > 1e-6 then // safe-guard against rounding errors
+ CheckEquals(SollSizes[row], font.Size,
+ 'Test saved font size, cell '+CellNotation(MyWorksheet,Row,Col));
+ currValue := GetEnumName(TypeInfo(TsFontStyles), byte(font.Style));
+ expectedValue := GetEnumName(TypeInfo(TsFontStyles), byte(SollStyles[col]));
+ CheckEquals(currValue, expectedValue,
+ 'Test unsaved font style, cell ' + CellNotation(MyWorksheet,0,0));
+ inc(counter);
+ end;
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
+ end;
end;
{ BIFF2 }
diff --git a/components/fpspreadsheet/tests/numberstests.pas b/components/fpspreadsheet/tests/numberstests.pas
index 0166a7665..b8f5d967e 100644
--- a/components/fpspreadsheet/tests/numberstests.pas
+++ b/components/fpspreadsheet/tests/numberstests.pas
@@ -201,38 +201,42 @@ begin
}
// Write out all test values
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet := MyWorkBook.AddWorksheet(NumbersSheet);
- for Row := Low(SollNumbers) to High(SollNumbers) do
- begin
- MyWorkSheet.WriteNumber(Row,0,SollNumbers[Row]);
- // Some checks inside worksheet itself
- ActualNumber:=MyWorkSheet.ReadAsNumber(Row,0);
- CheckEquals(SollNumbers[Row],ActualNumber,'Test value mismatch cell '+CellNotation(MyWorkSheet,Row));
+ try
+ MyWorkSheet := MyWorkBook.AddWorksheet(NumbersSheet);
+ for Row := Low(SollNumbers) to High(SollNumbers) do
+ begin
+ MyWorkSheet.WriteNumber(Row,0,SollNumbers[Row]);
+ // Some checks inside worksheet itself
+ ActualNumber:=MyWorkSheet.ReadAsNumber(Row,0);
+ CheckEquals(SollNumbers[Row],ActualNumber,'Test value mismatch cell '+CellNotation(MyWorkSheet,Row));
+ end;
+ TempFile:=NewTempFile;
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
end;
- TempFile:=NewTempFile;
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
// Open the spreadsheet, as biff8
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook,NumbersSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet
+ else
+ MyWorksheet := GetWorksheetByName(MyWorkBook,NumbersSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
- // Read test data from A column & compare if written=original
- for Row := Low(SollNumbers) to High(SollNumbers) do
- begin
- ActualNumber:=MyWorkSheet.ReadAsNumber(Row,0);
- CheckEquals(SollNumbers[Row],ActualNumber,'Test value mismatch cell '+CellNotation(MyWorkSheet,Row));
+ // Read test data from A column & compare if written=original
+ for Row := Low(SollNumbers) to High(SollNumbers) do
+ begin
+ ActualNumber:=MyWorkSheet.ReadAsNumber(Row,0);
+ CheckEquals(SollNumbers[Row],ActualNumber,'Test value mismatch cell '+CellNotation(MyWorkSheet,Row));
+ end;
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
end;
- // Finalization
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
end;
procedure TSpreadWriteReadNumberTests.TestWriteReadNumbers_BIFF2;
@@ -279,7 +283,7 @@ begin
TestWorkbook := TsWorkbook.Create;
case UpperCase(ExtractFileExt(FileName)) of
'.XLSX': TestWorkbook.ReadFromFile(FileName, sfOOXML);
- '.ODS': TestWorkbook.ReadFromFile(FileName, sfOpenDocument);
+ '.ODS' : TestWorkbook.ReadFromFile(FileName, sfOpenDocument);
// Excel XLS/BIFF
else TestWorkbook.ReadFromFile(FileName, sfExcel8);
end;
diff --git a/components/fpspreadsheet/tests/optiontests.pas b/components/fpspreadsheet/tests/optiontests.pas
index 0e2b8da8b..68cfdab89 100644
--- a/components/fpspreadsheet/tests/optiontests.pas
+++ b/components/fpspreadsheet/tests/optiontests.pas
@@ -116,35 +116,40 @@ begin
// Write out show/hide grid lines/sheet headers
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:= MyWorkBook.AddWorksheet(OptionsSheet);
- if AShowGridLines then
- MyWorksheet.Options := MyWorksheet.Options + [soShowGridLines]
- else
- MyWorksheet.Options := MyWorksheet.Options - [soShowGridLines];
- if AShowHeaders then
- MyWorksheet.Options := MyWorksheet.Options + [soShowHeaders]
- else
- MyWorksheet.Options := MyWorksheet.Options - [soShowHeaders];
+ try
+ MyWorkSheet:= MyWorkBook.AddWorksheet(OptionsSheet);
+ if AShowGridLines then
+ MyWorksheet.Options := MyWorksheet.Options + [soShowGridLines]
+ else
+ MyWorksheet.Options := MyWorksheet.Options - [soShowGridLines];
+ if AShowHeaders then
+ MyWorksheet.Options := MyWorksheet.Options + [soShowHeaders]
+ else
+ MyWorksheet.Options := MyWorksheet.Options - [soShowHeaders];
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
+ end;
// Read back presence of grid lines/sheet headers
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook, OptionsSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
- CheckEquals(soShowGridLines in MyWorksheet.Options, AShowGridLines,
- 'Test saved show grid lines mismatch');
- CheckEquals(soShowHeaders in MyWorksheet.Options, AShowHeaders,
- 'Test saved show headers mismatch');
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet
+ else
+ MyWorksheet := GetWorksheetByName(MyWorkBook, OptionsSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
+ CheckEquals(soShowGridLines in MyWorksheet.Options, AShowGridLines,
+ 'Test saved show grid lines mismatch');
+ CheckEquals(soShowHeaders in MyWorksheet.Options, AShowHeaders,
+ 'Test saved show headers mismatch');
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
+ end;
end;
{ Tests for BIFF2 grid lines and/or headers }
@@ -270,34 +275,39 @@ begin
// Write out pane sizes
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:= MyWorkBook.AddWorksheet(OptionsSheet);
- MyWorksheet.LeftPaneWidth := ALeftPaneWidth;
- MyWorksheet.TopPaneHeight := ATopPaneHeight;
- MyWorksheet.Options := MyWorksheet.Options + [soHasFrozenPanes];
- MyWorkBook.WriteToFile(TempFile, AFormat, true);
- MyWorkbook.Free;
+ try
+ MyWorkSheet:= MyWorkBook.AddWorksheet(OptionsSheet);
+ MyWorksheet.LeftPaneWidth := ALeftPaneWidth;
+ MyWorksheet.TopPaneHeight := ATopPaneHeight;
+ MyWorksheet.Options := MyWorksheet.Options + [soHasFrozenPanes];
+ MyWorkBook.WriteToFile(TempFile, AFormat, true);
+ finally
+ MyWorkbook.Free;
+ end;
// Read back pane sizes
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, AFormat);
- if AFormat = sfExcel2 then
- MyWorksheet := MyWorkbook.GetFirstWorksheet
- else
- MyWorksheet := GetWorksheetByName(MyWorkBook, OptionsSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
- CheckEquals(
- (AleftPaneWidth > 0) or (ATopPaneHeight > 0),
- (soHasFrozenPanes in MyWorksheet.Options)
- and ((MyWorksheet.LeftPaneWidth > 0) or (MyWorksheet.TopPaneHeight > 0)),
- 'Test saved frozen panes mismatch');
- CheckEquals(ALeftPaneWidth, MyWorksheet.LeftPaneWidth,
- 'Test saved left pane width mismatch');
- CheckEquals(ATopPaneHeight, MyWorksheet.TopPaneHeight,
- 'Test save top pane height mismatch');
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
+ try
+ MyWorkbook.ReadFromFile(TempFile, AFormat);
+ if AFormat = sfExcel2 then
+ MyWorksheet := MyWorkbook.GetFirstWorksheet
+ else
+ MyWorksheet := GetWorksheetByName(MyWorkBook, OptionsSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
+ CheckEquals(
+ (AleftPaneWidth > 0) or (ATopPaneHeight > 0),
+ (soHasFrozenPanes in MyWorksheet.Options)
+ and ((MyWorksheet.LeftPaneWidth > 0) or (MyWorksheet.TopPaneHeight > 0)),
+ 'Test saved frozen panes mismatch');
+ CheckEquals(ALeftPaneWidth, MyWorksheet.LeftPaneWidth,
+ 'Test saved left pane width mismatch');
+ CheckEquals(ATopPaneHeight, MyWorksheet.TopPaneHeight,
+ 'Test save top pane height mismatch');
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
+ end;
end;
{ Tests for BIFF5 frozen panes }
diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpi b/components/fpspreadsheet/tests/spreadtestgui.lpi
index d798ee65c..e3a5d330a 100644
--- a/components/fpspreadsheet/tests/spreadtestgui.lpi
+++ b/components/fpspreadsheet/tests/spreadtestgui.lpi
@@ -48,10 +48,12 @@
+
+
@@ -81,18 +83,22 @@
+
+
+
+
@@ -127,6 +133,9 @@
+
+
+
diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpr b/components/fpspreadsheet/tests/spreadtestgui.lpr
index ee867af5d..3b139c9b2 100644
--- a/components/fpspreadsheet/tests/spreadtestgui.lpr
+++ b/components/fpspreadsheet/tests/spreadtestgui.lpr
@@ -2,13 +2,27 @@ program spreadtestgui;
{$mode objfpc}{$H+}
+{.$DEFINE HEAPTRC} // Instead of using -gh activate this to write the heap trace to file
+
uses
+ {$IFDEF HEAPTRC}
+ HeapTrc, SysUtils,
+ {$ENDIF}
Interfaces, Forms, GuiTestRunner, datetests, stringtests, numberstests,
manualtests, testsutility, internaltests, formattests, colortests, fonttests,
optiontests, numformatparsertests, formulatests, rpnFormulaUnit,
emptycelltests;
begin
+ {$IFDEF HEAPTRC}
+ // Assuming your build mode sets -dDEBUG in Project Options/Other when defining -gh
+ // This avoids interference when running a production/default build without -gh
+
+ if FileExists('heap.trc') then
+ DeleteFile('heap.trc');
+ SetHeapTraceOutput('heap.trc');
+ {$ENDIF HEAPTRC}
+
Application.Initialize;
Application.CreateForm(TGuiTestRunner, TestRunner);
Application.Run;
diff --git a/components/fpspreadsheet/tests/stringtests.pas b/components/fpspreadsheet/tests/stringtests.pas
index 29920dd7e..4f691b90e 100644
--- a/components/fpspreadsheet/tests/stringtests.pas
+++ b/components/fpspreadsheet/tests/stringtests.pas
@@ -172,35 +172,39 @@ begin
}
// Write out all test values
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:=MyWorkBook.AddWorksheet(StringsSheet);
- for Row := Low(SollStrings) to High(SollStrings) do
- begin
- MyWorkSheet.WriteUTF8Text(Row,0,SollStrings[Row]);
- // Some checks inside worksheet itself
- ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0);
- CheckEquals(SollStrings[Row],ActualString,'Test value mismatch cell '+CellNotation(MyWorkSheet,Row));
+ try
+ MyWorkSheet:=MyWorkBook.AddWorksheet(StringsSheet);
+ for Row := Low(SollStrings) to High(SollStrings) do
+ begin
+ MyWorkSheet.WriteUTF8Text(Row,0,SollStrings[Row]);
+ // Some checks inside worksheet itself
+ ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0);
+ CheckEquals(SollStrings[Row],ActualString,'Test value mismatch cell '+CellNotation(MyWorkSheet,Row));
+ end;
+ TempFile:=NewTempFile;
+ MyWorkBook.WriteToFile(TempFile,sfExcel8,true);
+ finally
+ MyWorkbook.Free;
end;
- TempFile:=NewTempFile;
- MyWorkBook.WriteToFile(TempFile,sfExcel8,true);
- MyWorkbook.Free;
// Open the spreadsheet, as biff8
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, sfExcel8);
- MyWorksheet:=GetWorksheetByName(MyWorkBook,StringsSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
+ try
+ MyWorkbook.ReadFromFile(TempFile, sfExcel8);
+ MyWorksheet:=GetWorksheetByName(MyWorkBook,StringsSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
- // Read test data from A column & compare if written=original
- for Row := Low(SollStrings) to High(SollStrings) do
- begin
- ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0);
- CheckEquals(SollStrings[Row],ActualString,'Test value mismatch, cell '+CellNotation(MyWorkSheet,Row));
+ // Read test data from A column & compare if written=original
+ for Row := Low(SollStrings) to High(SollStrings) do
+ begin
+ ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0);
+ CheckEquals(SollStrings[Row],ActualString,'Test value mismatch, cell '+CellNotation(MyWorkSheet,Row));
+ end;
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
end;
- // Finalization
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
end;
procedure TSpreadWriteReadStringTests.TestWriteReadStringsLimits;
@@ -227,24 +231,45 @@ begin
}
// Write out all test values
MyWorkbook := TsWorkbook.Create;
- MyWorkSheet:=MyWorkBook.AddWorksheet(StringsSheet);
+ try
+ MyWorkSheet:=MyWorkBook.AddWorksheet(StringsSheet);
- for Row := Low(LocalNormStrings) to High(LocalNormStrings) do
- begin
- // We could use CheckException but then you can't pass parameters
+ for Row := Low(LocalNormStrings) to High(LocalNormStrings) do
+ begin
+ // We could use CheckException but then you can't pass parameters
+ TestResult:=true;
+ try
+ MyWorkSheet.WriteUTF8Text(Row,0,LocalNormStrings[Row]);
+ // Some checks inside worksheet itself
+ ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0);
+ CheckEquals(length(LocalNormStrings[Row]),length(ActualString),
+ 'Test value mismatch cell '+CellNotation(MyWorkSheet,Row)+
+ ' for string length.');
+ except
+ { When over size limit we expect to hit this:
+ if TextTooLong then
+ Raise Exception.CreateFmt('Text value exceeds %d character limit in cell [%d,%d]. Text has been truncated.',[MaxBytes,ARow,ACol]);
+ }
+ //todo: rewrite when/if the fpspreadsheet exception class changes
+ on E: Exception do
+ begin
+ if Row=2 then
+ TestResult:=true
+ else
+ begin
+ TestResult:=false;
+ ExceptionMessage:=E.Message;
+ end;
+ end;
+ end;
+ // Notify user of exception if it happened where we didn't expect it:
+ CheckTrue(TestResult,'Exception: '+ExceptionMessage);
+ end;
TestResult:=true;
+ TempFile:=NewTempFile;
try
- MyWorkSheet.WriteUTF8Text(Row,0,LocalNormStrings[Row]);
- // Some checks inside worksheet itself
- ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0);
- CheckEquals(length(LocalNormStrings[Row]),length(ActualString),
- 'Test value mismatch cell '+CellNotation(MyWorkSheet,Row)+
- ' for string length.');
+ MyWorkBook.WriteToFile(TempFile,sfExcel8,true);
except
- { When over size limit we expect to hit this:
- if TextTooLong then
- Raise Exception.CreateFmt('Text value exceeds %d character limit in cell [%d,%d]. Text has been truncated.',[MaxBytes,ARow,ACol]);
- }
//todo: rewrite when/if the fpspreadsheet exception class changes
on E: Exception do
begin
@@ -259,53 +284,36 @@ begin
end;
// Notify user of exception if it happened where we didn't expect it:
CheckTrue(TestResult,'Exception: '+ExceptionMessage);
+ finally
+ MyWorkbook.Free;
end;
- TestResult:=true;
- TempFile:=NewTempFile;
- try
- MyWorkBook.WriteToFile(TempFile,sfExcel8,true);
- except
- //todo: rewrite when/if the fpspreadsheet exception class changes
- on E: Exception do
- begin
- if Row=2 then
- TestResult:=true
- else
- begin
- TestResult:=false;
- ExceptionMessage:=E.Message;
- end;
- end;
- end;
- // Notify user of exception if it happened where we didn't expect it:
- CheckTrue(TestResult,'Exception: '+ExceptionMessage);
- MyWorkbook.Free;
// Open the spreadsheet, as biff8
MyWorkbook := TsWorkbook.Create;
- MyWorkbook.ReadFromFile(TempFile, sfExcel8);
- MyWorksheet:=GetWorksheetByName(MyWorkBook,StringsSheet);
- if MyWorksheet=nil then
- fail('Error in test code. Failed to get named worksheet');
+ try
+ MyWorkbook.ReadFromFile(TempFile, sfExcel8);
+ MyWorksheet:=GetWorksheetByName(MyWorkBook,StringsSheet);
+ if MyWorksheet=nil then
+ fail('Error in test code. Failed to get named worksheet');
- // Read test data from A column & compare if written=original
- for Row := Low(LocalNormStrings) to High(LocalNormStrings) do
- begin
- ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0);
- // Allow for truncation of excessive strings by fpspreadsheet
- if length(LocalNormStrings[Row])>MaxBytesBIFF8 then
- CheckEquals(MaxBytesBIFF8,length(ActualString),
+ // Read test data from A column & compare if written=original
+ for Row := Low(LocalNormStrings) to High(LocalNormStrings) do
+ begin
+ ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0);
+ // Allow for truncation of excessive strings by fpspreadsheet
+ if length(LocalNormStrings[Row])>MaxBytesBIFF8 then
+ CheckEquals(MaxBytesBIFF8,length(ActualString),
+ 'Test value mismatch cell '+CellNotation(MyWorkSheet,Row)+
+ ' for string length.')
+ else
+ CheckEquals(length(LocalNormStrings[Row]),length(ActualString),
'Test value mismatch cell '+CellNotation(MyWorkSheet,Row)+
- ' for string length.')
- else
- CheckEquals(length(LocalNormStrings[Row]),length(ActualString),
- 'Test value mismatch cell '+CellNotation(MyWorkSheet,Row)+
- ' for string length.');
+ ' for string length.');
+ end;
+ finally
+ MyWorkbook.Free;
+ DeleteFile(TempFile);
end;
- // Finalization
- MyWorkbook.Free;
-
- DeleteFile(TempFile);
end;
diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas
index 305008acb..bc64d680c 100755
--- a/components/fpspreadsheet/xlsxooxml.pas
+++ b/components/fpspreadsheet/xlsxooxml.pas
@@ -1677,6 +1677,9 @@ begin
end else
begin
// The cells need to be written in order, row by row, cell by cell
+ c1 := AWorksheet.GetFirstColIndex;
+ c2 := AWorksheet.GetLastColIndex;
+ if (c1 = $FFFFFFFF) and (c2 = 0) then c1 := 0; // avoid arithmetic overflow in case of empty worksheet
for r := 0 to AWorksheet.GetLastRowIndex do begin
// If the row has a custom height add this value to the specification
row := AWorksheet.FindRow(r);
@@ -1685,8 +1688,6 @@ begin
(row^.Height + ROW_HEIGHT_CORRECTION)*h0])
else
rh := '';
- c1 := AWorksheet.GetFirstColIndex;
- c2 := AWorksheet.GetLastColIndex;
AppendToStream(AStream, Format(
'', [r+1, c1+1, c2+1, rh]));
// Write cells belonging to this row.