fpspreadsheet: Fix circular unit reference bug (thanks, Michael). Add demo_sorting.pas unit missing from last commit. Some improvements with multi-key sorting, but still in error sometimes (--> sorting code is still experimental).

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3678 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2014-10-22 23:25:26 +00:00
parent 2f6bc3c183
commit 4a1a99044b
6 changed files with 610 additions and 41 deletions

View File

@ -0,0 +1,416 @@
program demo_sorting;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
SysUtils, Classes
{ you can add units after this },
TypInfo, fpSpreadsheet, fpsutils;
var
workbook: TsWorkbook;
worksheet: TsWorksheet;
s: String;
sortParams: TsSortParams;
procedure SortSingleColumn;
var
i: Integer;
n: Double;
begin
WriteLn('Sorting of a single column');
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Test');
worksheet.WriteNumber(0, 0, 10); // A1
worksheet.WriteNumber(1, 0, 2); // A2
worksheet.WriteNumber(2, 0, 5); // A3
worksheet.WriteNumber(3, 0, 1); // A4
sortParams := InitSortParams(true, 1);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[0].Order := ssoAscending;
worksheet.Sort(sortParams, 0, 0, 3, 0);
WriteLn(#9, 'A');
for i:=0 to 3 do
begin
n := worksheet.ReadAsNumber(i, 0);
WriteLn(i, #9, FloatToStr(n));
end;
WriteLn;
finally
workbook.Free;
end;
end;
procedure SortSingleRow;
var
i: Integer;
n: Double;
begin
WriteLn('Sorting of a single row');
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Test');
worksheet.WriteNumber(0, 0, 10); // A1
worksheet.WriteNumber(0, 1, 2); // B1
worksheet.WriteNumber(0, 2, 5); // C1
worksheet.WriteNumber(0, 3, 1); // D1
sortParams := InitSortParams(false, 1);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[0].Order := ssoAscending;
worksheet.Sort(sortParams, 0, 0, 0, 3);
for i:=0 to 3 do
Write(char(ord('A')+i) + '1', #9);
WriteLn;
for i:=0 to 3 do
begin
n := worksheet.ReadAsNumber(0, i);
Write(FloatToStr(n), #9);
end;
WriteLn;
WriteLn;
finally
workbook.Free;
end;
end;
procedure SortTwoColumns_OneKey;
var
i: Integer;
n1, n2: Double;
begin
WriteLn('Sorting of two columns using a single key column');
WriteLn('(The 2nd column must be the negative of the 1st one)');
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Test');
worksheet.WriteNumber(0, 0, 10); // A1
worksheet.WriteNumber(1, 0, 2); // A2
worksheet.WriteNumber(2, 0, 5); // A3
worksheet.WriteNumber(3, 0, 1); // A4
worksheet.WriteNumber(0, 1, -10); // B1
worksheet.WriteNumber(1, 1, -2); // B2
worksheet.WriteNumber(2, 1, -5); // B3
worksheet.WriteNumber(3, 1, -1); // B4
sortParams := InitSortParams(true, 1);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[0].Order := ssoAscending;
worksheet.Sort(sortParams, 0, 0, 3, 1);
WriteLn(#9, 'A', #9, 'B');
for i:=0 to 3 do
begin
n1 := worksheet.ReadAsNumber(i, 0);
n2 := worksheet.ReadAsNumber(i, 1);
WriteLn(i, #9, FloatToStr(n1), #9, FloatToStr(n2));
end;
WriteLn;
finally
workbook.Free;
end;
end;
procedure SortTwoRows_OneKey;
var
i: Integer;
n1, n2: Double;
begin
WriteLn('Sorting of two rows using a single key column');
WriteLn('(The 2nd row must be the negative of 1st row)');
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Test');
worksheet.WriteNumber(0, 0, 10); // A1
worksheet.WriteNumber(0, 1, 2); // B1
worksheet.WriteNumber(0, 2, 5); // C1
worksheet.WriteNumber(0, 3, 1); // D1
worksheet.WriteNumber(1, 0, -10); // A2
worksheet.WriteNumber(1, 1, -2); // B2
worksheet.WriteNumber(1, 2, -5); // C2
worksheet.WriteNumber(1, 3, -1); // D2
sortParams := InitSortParams(false, 1);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[0].Order := ssoAscending;
worksheet.Sort(sortParams, 0, 0, 1, 3);
Write(#9);
for i:=0 to 3 do
Write(char(ord('A')+i) + '1', #9);
WriteLn;
Write('1', #9);
for i:=0 to 3 do begin
n1 := worksheet.ReadAsNumber(0, i);
Write(FloatToStr(n1), #9);
end;
WriteLn;
Write('2', #9);
for i:=0 to 3 do begin
n1 := worksheet.ReadAsNumber(1, i);
Write(FloatToStr(n1), #9);
end;
WriteLn;
WriteLn;
finally
workbook.Free;
end;
end;
procedure SortTwoColumns_TwoKeys;
var
i: Integer;
n1, n2: Double;
begin
WriteLn('Sorting of two columns on column "A" and "B"');
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Test');
worksheet.WriteNumber(0, 0, 10); // A1
worksheet.WriteNumber(1, 0, 1); // A2
worksheet.WriteNumber(2, 0, 1); // A3
worksheet.WriteNumber(3, 0, 1); // A4
worksheet.WriteNumber(0, 1, -10); // B1
worksheet.WriteNumber(1, 1, -2); // B2
worksheet.WriteNumber(2, 1, -5); // B3
worksheet.WriteNumber(3, 1, -1); // B4
sortParams := InitSortParams(true, 2);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[0].Order := ssoAscending;
sortParams.Keys[1].ColRowIndex := 1;
sortParams.Keys[1].Order := ssoAscending;
worksheet.Sort(sortParams, 0, 0, 3, 1);
WriteLn(#9, 'A', #9, 'B');
for i:=0 to 3 do
begin
n1 := worksheet.ReadAsNumber(i, 0);
n2 := worksheet.ReadAsNumber(i, 1);
WriteLn(i, #9, FloatToStr(n1), #9, FloatToStr(n2));
end;
WriteLn;
finally
workbook.Free;
end;
end;
procedure SortTwoRows_TwoKeys;
var
i: Integer;
n1, n2: Double;
begin
WriteLn('Sorting of two rows on row "1" and "2"');
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Test');
worksheet.WriteNumber(0, 0, 10); // A1
worksheet.WriteNumber(0, 1, 1); // B1
worksheet.WriteNumber(0, 2, 1); // C1
worksheet.WriteNumber(0, 3, 1); // D1
worksheet.WriteNumber(1, 0, -10); // A2
worksheet.WriteNumber(1, 1, -2); // B2
worksheet.WriteNumber(1, 2, -5); // C2
worksheet.WriteNumber(1, 3, -1); // D2
sortParams := InitSortParams(false, 2);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[0].Order := ssoAscending;
sortParams.Keys[1].ColRowIndex := 1;
sortParams.Keys[1].Order := ssoAscending;
worksheet.Sort(sortParams, 0, 0, 1, 3);
Write(#9);
for i:=0 to 3 do
Write(char(ord('A')+i) + '1', #9);
WriteLn;
Write('1', #9);
for i:=0 to 3 do begin
n1 := worksheet.ReadAsNumber(0, i);
Write(FloatToStr(n1), #9);
end;
WriteLn;
Write('2', #9);
for i:=0 to 3 do begin
n1 := worksheet.ReadAsNumber(1, i);
Write(FloatToStr(n1), #9);
end;
WriteLn;
WriteLn;
finally
workbook.Free;
end;
end;
procedure SortTwoColumns_TwoKeys_1;
var
i: Integer;
n: Double;
s: String;
begin
WriteLn('Sorting of two columns on column "A" and "B"');
WriteLn('(Expecting an ascending columns of characters and numbers)');
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Test');
worksheet.WriteUTF8Text(0, 0, 'E');
worksheet.WriteUTF8Text(1, 0, 'E');
worksheet.WriteUTF8Text(2, 0, 'C');
worksheet.WriteUTF8Text(3, 0, 'B');
worksheet.WriteUTF8Text(4, 0, 'D');
worksheet.WriteUTF8Text(5, 0, 'D');
worksheet.WriteUTF8Text(6, 0, 'A');
worksheet.WriteUTF8Text(7, 0, 'B');
worksheet.WriteUTF8Text(8, 0, 'C');
worksheet.WriteUTF8Text(9, 0, 'A');
worksheet.WriteNumber(0, 1, 9); // A2 --> E
worksheet.WriteNumber(1, 1, 8); // B2 --> E
worksheet.WriteNumber(2, 1, 5); // C2 --> C
worksheet.WriteNumber(3, 1, 2); // D2 --> B
worksheet.WriteNumber(4, 1, 6); // E2 --> D
worksheet.WriteNumber(5, 1, 7); // F2 --> D
worksheet.WriteNumber(6, 1, 1); // G2 --> A
worksheet.WriteNumber(7, 1, 3); // H2 --> B
worksheet.WriteNumber(8, 1, 4); // I2 --> C
worksheet.WriteNumber(9, 1, 0); // J2 --> A
sortParams := InitSortParams(true, 2);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[0].Order := ssoAscending;
sortParams.Keys[1].ColRowIndex := 1;
sortParams.Keys[1].Order := ssoAscending;
worksheet.Sort(sortParams, 0, 0, 9, 1);
WriteLn(#9, 'A', #9, 'B');
for i:=0 to 9 do
begin
s := worksheet.ReadAsUTF8Text(i, 0);
n := worksheet.ReadAsNumber(i, 1);
WriteLn(i, #9, s, #9, FloatToStr(n));
end;
WriteLn;
finally
workbook.Free;
end;
end;
procedure SortTwoRows_TwoKeys_1;
var
i: Integer;
n1, n2: Double;
begin
WriteLn('Sorting of two rows on row "1" and "2"');
WriteLn('(Expecting an ascending row of numbers)');
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Test');
worksheet.WriteUTF8Text(0, 0, 'E');
worksheet.WriteUTF8Text(0, 1, 'E');
worksheet.WriteUTF8Text(0, 2, 'C');
worksheet.WriteUTF8Text(0, 3, 'B');
worksheet.WriteUTF8Text(0, 4, 'D');
worksheet.WriteUTF8Text(0, 5, 'D');
worksheet.WriteUTF8Text(0, 6, 'A');
worksheet.WriteUTF8Text(0, 7, 'B');
worksheet.WriteUTF8Text(0, 8, 'C');
worksheet.WriteUTF8Text(0, 9, 'A');
worksheet.WriteNumber(1, 0, 9); // A2 --> E
worksheet.WriteNumber(1, 1, 8); // B2 --> E
worksheet.WriteNumber(1, 2, 5); // C2 --> C
worksheet.WriteNumber(1, 3, 2); // D2 --> B
worksheet.WriteNumber(1, 4, 6); // E2 --> D
worksheet.WriteNumber(1, 5, 7); // F2 --> D
worksheet.WriteNumber(1, 6, 1); // G2 --> A
worksheet.WriteNumber(1, 7, 3); // H2 --> B
worksheet.WriteNumber(1, 8, 4); // I2 --> C
worksheet.WriteNumber(1, 9, 0); // J2 --> A
sortParams := InitSortParams(false, 2);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[0].Order := ssoAscending;
sortParams.Keys[1].ColRowIndex := 1;
sortParams.Keys[1].Order := ssoAscending;
worksheet.Sort(sortParams, 0, 0, 1, 9);
Write(#9);
for i:=0 to 9 do
Write(char(ord('A')+i) + '1', #9);
WriteLn;
Write('1', #9);
for i:=0 to 9 do
Write(worksheet.ReadAsUTF8Text(0, i), #9);
WriteLn;
Write('2', #9);
for i:=0 to 9 do begin
n1 := worksheet.ReadAsNumber(1, i);
Write(FloatToStr(n1), #9);
end;
WriteLn;
WriteLn;
finally
workbook.Free;
end;
end;
begin
SortSingleColumn;
SortSingleRow;
SortTwoColumns_OneKey;
SortTwoRows_OneKey;
SortTwoColumns_TwoKeys;
SortTwoRows_TwoKeys;
SortTwoColumns_TwoKeys_1;
SortTwoRows_TwoKeys_1;
end.

View File

@ -822,6 +822,9 @@ procedure RegisterFunction(const AName: ShortString; const AResultType: Char;
procedure RegisterFunction(const AName: ShortString; const AResultType: Char;
const AParamTypes: String; const AExcelCode: Integer; ACallBack: TsExprFunctionEvent); overload;
var
ExprFormatSettings: TFormatSettings;
const
AllBuiltIns = [bcMath, bcStatistics, bcStrings, bcLogical, bcDateTime, bcLookup,
bcInfo, bcUser];
@ -830,7 +833,7 @@ const
implementation
uses
typinfo, math, lazutf8, dateutils, fpsutils, fpsfunc;
typinfo, math, lazutf8, dateutils, fpsutils; //, fpsfunc;
const
cNull = #0;
@ -4255,7 +4258,7 @@ initialization
ExprFormatSettings.DecimalSeparator := '.';
ExprFormatSettings.ListSeparator := ',';
RegisterStdBuiltins(BuiltinIdentifiers);
// RegisterStdBuiltins(BuiltinIdentifiers);
finalization
FreeBuiltins;

View File

@ -9,10 +9,7 @@ unit fpsfunc;
interface
uses
Classes, SysUtils, fpspreadsheet, fpsExprParser;
var
ExprFormatSettings: TFormatSettings;
Classes, SysUtils, fpspreadsheet, fpsexprparser;
procedure RegisterStdBuiltins(AManager : TsBuiltInExpressionManager);
@ -1895,5 +1892,6 @@ end;
*)
initialization
RegisterStdBuiltins(BuiltinIdentifiers);
end.

View File

@ -3341,11 +3341,87 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
repeat
I := L;
J := R;
P := (L+R) div 2;
P := (L + R) div 2;
repeat
{ original code from "grids.pas":
if ColSorting then begin
while DoCompareCells(index, P, index, I)>0 do I:=I+1;
while DoCompareCells(index, P, index, J)<0 do J:=J-1;
end else begin
while DoCompareCells(P, index, I, index)>0 do I:=I+1;
while DoCompareCells(P, index, J, index)<0 do J:=J-1;
end; }
if ASortParams.SortByCols then
begin
(*
// Sorting by columns
// The next "while" loop corresponds to grid's:
// while DoCompareCells(index, P, index, I) > 0 do I:=I+1;
while true do
begin
cell1 := FindCell(P, ASortParams.Keys[0].ColRowIndex);
cell2 := FindCell(I, ASortParams.Keys[0].ColRowIndex);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[0].Order);
if compareResult < 0 then
break
else
if compareResult > 0 then
inc(I)
else
begin
// equal --> check next condition
K := 1;
while (K <= High(ASortParams.Keys)) do
begin
cell1 := FindCell(P, ASortParams.Keys[K].ColRowIndex);
cell2 := FindCell(I, ASortParams.Keys[K].ColRowIndex);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
if compareResult < 0 then
break
else
if compareResult > 0 then begin
inc(I);
break;
end else
inc(K); // Still equal --> try next condition
end;
if compareResult <= 0 then
break;
end;
end;
// The next "while" loop corresponds to grid's:
// while DoCompareCells(index, P, index, J)<0 do J:=J-1;
while true do
begin
cell1 := FindCell(P, ASortParams.Keys[0].ColRowIndex);
cell2 := FindCell(J, ASortParams.Keys[0].ColRowIndex);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[0].Order);
if compareResult < 0 then
dec(J)
else
if compareResult > 0 then
break
else begin // equal --> check next condition
K := 1;
while (K <= High(ASortParams.Keys)) do
begin
cell1 := FindCell(P, ASortParams.Keys[K].ColRowIndex);
cell2 := FindCell(J, ASortParams.Keys[K].ColRowIndex);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
case abs(compareResult) of
-1: begin dec(J); break; end;
+1: break;
0: inc(K);
end;
end;
if compareResult >= 0 then
break;
end;
end;
*)
K := 0;
while true do
begin
@ -3355,9 +3431,10 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
case sign(compareResult) of
-1: break;
0: if K <= High(ASortParams.Keys) then inc(K) else break;
+1: inc(I);
+1: begin inc(I); K:= 0; end;
end;
end;
K := 0;
while true do
begin
@ -3365,7 +3442,7 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
cell2 := FindCell(J, ASortParams.Keys[K].ColRowIndex);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
case sign(compareResult) of
-1: dec(J);
-1: begin dec(J); K := 0; end;
0: if K <= High(ASortParams.Keys) then inc(K) else break;
+1: break;
end;
@ -3382,7 +3459,7 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
case sign(compareResult) of
-1: break;
0: if K <= High(ASortParams.Keys) then inc(K) else break;
+1: inc(I);
+1: begin inc(I); if K > 0 then K := 0; end;
end;
end;
K := 0;
@ -3392,11 +3469,65 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
cell2 := FindCell(ASortParams.Keys[K].ColRowIndex, J);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
case sign(compareResult) of
-1: dec(J);
-1: begin dec(J); if K > 0 then K := 0; end;
0: if K <= High(ASortParams.Keys) then inc(K) else break;
+1: break;
end;
end;
(*
while true do
begin
cell1 := FindCell(ASortParams.Keys[0].ColRowIndex, P);
cell2 := FindCell(ASortParams.Keys[0].ColRowIndex, I);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[0].Order);
case sign(compareresult) of
-1: break;
+1: inc(I);
0: begin
K := 1;
while (compareResult=0) and (K <= High(ASortParams.Keys)) do
begin
cell1 := FindCell(ASortParams.Keys[K].ColRowIndex, P);
cell2 := FindCell(ASortParams.Keys[K].ColRowIndex, I);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
if compareResult = 0 then
continue
else begin
if compareresult > 0 then inc(I);
break;
end;
end;
if compareResult < 0 then break;
end;
end;
end;
while true do
begin
cell1 := FindCell(ASortParams.Keys[0].ColRowIndex, P);
cell2 := FindCell(ASortParams.Keys[0].ColRowIndex, J);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[0].Order);
case sign(compareResult) of
-1: dec(J);
+1: break;
0: begin
K := 1;
while (compareResult=0) and (K <= High(ASortParams.Keys)) do
begin
cell1 := FindCell(ASortParams.Keys[0].ColRowIndex, P);
cell2 := FindCell(ASortParams.Keys[0].ColRowIndex, J);
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
if compareResult = 0 then
continue
else begin
if compareResult < 0 then dec(J);
break;
end;
end;
if compareResult > 0 then break;
end;
end;
end;
*)
end;
if I <= J then

View File

@ -272,8 +272,10 @@ var
begin
sortParams := InitSortParams(ASortByCols, 2);
sortParams.Keys[0].ColRowIndex := 0;
sortParams.Keys[1].ColRowIndex := 1;
sortParams.Keys[0].ColRowIndex := 0; // col/row 0 is primary key
sortParams.Keys[1].ColRowIndex := 1; // col/row 1 is second key
iLast := High(SollSortNumbers);
TempFile := GetTempFileName;
@ -285,18 +287,22 @@ begin
row := 0;
if ASortByCols then
begin
// Always 2 numbers in the first column are equal
for i:=0 to High(SollSortNumbers) do
MyWorksheet.WriteNumber(i, col, SollSortNumbers[(i mod 2)*2]);
// All strings in the second column are distinct
for i:=0 to High(SollSortStrings) do
MyWorksheet.WriteUTF8Text(i, col+1, SollSortStrings[i]);
// Write all randomized numbers to column B
for i:=0 to iLast do
MyWorksheet.WriteNumber(i, col+1, SollSortNumbers[i]);
// divide each number by 2 and calculate the character assigned to it
// and write it to column A
// We will sort primarily according to column A, and seconarily according
// to B. The construction allows us to determine if the sorting is correct.
for i:=0 to iLast do
MyWorksheet.WriteUTF8Text(i, col, char(ord('A')+round(SollSortNumbers[i div 2])));
end else
begin
for i:=0 to High(SollSortNumbers) do
MyWorksheet.WriteNumber(row, i, SollSortNumbers[(i mod 2)*2]);
for i:=0 to High(SollSortStrings) do
MyWorksheet.WriteUTF8Text(row+1, i, SollSortStrings[i]);
// The same with the rows...
for i:=0 to iLast do
MyWorksheet.WriteNumber(row+1, i+1, SollSortNumbers[i]);
for i:=0 to iLast do
MyWorksheet.WriteUTF8Text(row, i, char(ord('A')+round(SollSortNumbers[i div 2])));
end;
MyWorkBook.WriteToFile(TempFile, AFormat, true);
@ -319,7 +325,6 @@ begin
fail('Error in test code. Failed to get named worksheet');
// ... and sort it.
iLast := High(SollSortNumbers); //must be the same as for SollSortStrings
r1 := 0; c1 := 0;
if ASortByCols then begin
c2 := 1;
@ -338,31 +343,44 @@ begin
for i:=0 to iLast do
begin
row := 0;
col := 0;
if ASortByCols then
begin
// Read the number first, they must be in order 0...9 (if ascending).
col := 1;
case sortDir of
ssoAscending : row := i;
ssoDescending: row := iLast - i;
end
else
end;
actualNumber := MyWorksheet.ReadAsNumber(row, col); // col B is the number, must be 0...9 here
expectedNumber := i;
CheckEquals(expectednumber, actualnumber,
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
// Now read the string. It must be the character corresponding to the
// half of the number
col := 0;
actualString := MyWorksheet.ReadAsUTF8Text(row, col);
expectedString := char(ord('A') + round(expectedNumber) div 2);
CheckEquals(expectedstring, actualstring,
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
end else
begin
row := 1;
case sortDir of
ssoAscending : col := i;
ssoDescending: col := iLast - i;
end;
actualNumber := MyWorksheet.ReadAsNumber(row, col);
expectedNumber := (i mod 2) * 2;
CheckEquals(expectednumber, actualnumber,
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
actualNumber := MyWorksheet.ReadAsNumber(row, col);
expectedNumber := i;
CheckEquals(expectednumber, actualnumber,
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
if ASortByCols then
inc(col)
else
inc(row);
actualString := MyWorksheet.ReadAsUTF8Text(row, col);
expectedString := char(ord('A') + i);
CheckEquals(expectedstring, actualstring,
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
row := 0;
actualstring := MyWorksheet.ReadAsUTF8Text(row, col);
expectedString := char(ord('A') + round(expectedNumber) div 2);
CheckEquals(expectedstring, actualstring,
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
end;
end;
finally
MyWorkbook.Free;

View File

@ -48,7 +48,6 @@
<Unit1>
<Filename Value="datetests.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="datetests"/>
</Unit1>
<Unit2>
<Filename Value="stringtests.pas"/>
@ -76,6 +75,7 @@
<Unit7>
<Filename Value="formattests.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="formattests"/>
</Unit7>
<Unit8>
<Filename Value="colortests.pas"/>
@ -84,6 +84,7 @@
<Unit9>
<Filename Value="fonttests.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="fonttests"/>
</Unit9>
<Unit10>
<Filename Value="optiontests.pas"/>
@ -96,6 +97,7 @@
<Unit12>
<Filename Value="rpnformulaunit.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="rpnFormulaUnit"/>
</Unit12>
<Unit13>
<Filename Value="formulatests.pas"/>
@ -105,6 +107,7 @@
<Unit14>
<Filename Value="emptycelltests.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="emptycelltests"/>
</Unit14>
<Unit15>
<Filename Value="errortests.pas"/>