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:
parent
2f6bc3c183
commit
4a1a99044b
416
components/fpspreadsheet/examples/other/demo_sorting.pas
Normal file
416
components/fpspreadsheet/examples/other/demo_sorting.pas
Normal 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.
|
||||||
|
|
@ -822,6 +822,9 @@ procedure RegisterFunction(const AName: ShortString; const AResultType: Char;
|
|||||||
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;
|
const AParamTypes: String; const AExcelCode: Integer; ACallBack: TsExprFunctionEvent); overload;
|
||||||
|
|
||||||
|
var
|
||||||
|
ExprFormatSettings: TFormatSettings;
|
||||||
|
|
||||||
const
|
const
|
||||||
AllBuiltIns = [bcMath, bcStatistics, bcStrings, bcLogical, bcDateTime, bcLookup,
|
AllBuiltIns = [bcMath, bcStatistics, bcStrings, bcLogical, bcDateTime, bcLookup,
|
||||||
bcInfo, bcUser];
|
bcInfo, bcUser];
|
||||||
@ -830,7 +833,7 @@ const
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
typinfo, math, lazutf8, dateutils, fpsutils, fpsfunc;
|
typinfo, math, lazutf8, dateutils, fpsutils; //, fpsfunc;
|
||||||
|
|
||||||
const
|
const
|
||||||
cNull = #0;
|
cNull = #0;
|
||||||
@ -4255,7 +4258,7 @@ initialization
|
|||||||
ExprFormatSettings.DecimalSeparator := '.';
|
ExprFormatSettings.DecimalSeparator := '.';
|
||||||
ExprFormatSettings.ListSeparator := ',';
|
ExprFormatSettings.ListSeparator := ',';
|
||||||
|
|
||||||
RegisterStdBuiltins(BuiltinIdentifiers);
|
// RegisterStdBuiltins(BuiltinIdentifiers);
|
||||||
|
|
||||||
finalization
|
finalization
|
||||||
FreeBuiltins;
|
FreeBuiltins;
|
||||||
|
@ -9,10 +9,7 @@ unit fpsfunc;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, fpspreadsheet, fpsExprParser;
|
Classes, SysUtils, fpspreadsheet, fpsexprparser;
|
||||||
|
|
||||||
var
|
|
||||||
ExprFormatSettings: TFormatSettings;
|
|
||||||
|
|
||||||
procedure RegisterStdBuiltins(AManager : TsBuiltInExpressionManager);
|
procedure RegisterStdBuiltins(AManager : TsBuiltInExpressionManager);
|
||||||
|
|
||||||
@ -1895,5 +1892,6 @@ end;
|
|||||||
*)
|
*)
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
|
RegisterStdBuiltins(BuiltinIdentifiers);
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -3341,11 +3341,87 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
|
|||||||
repeat
|
repeat
|
||||||
I := L;
|
I := L;
|
||||||
J := R;
|
J := R;
|
||||||
P := (L+R) div 2;
|
P := (L + R) div 2;
|
||||||
repeat
|
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
|
if ASortParams.SortByCols then
|
||||||
begin
|
begin
|
||||||
|
(*
|
||||||
// Sorting by columns
|
// 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;
|
K := 0;
|
||||||
while true do
|
while true do
|
||||||
begin
|
begin
|
||||||
@ -3355,9 +3431,10 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
|
|||||||
case sign(compareResult) of
|
case sign(compareResult) of
|
||||||
-1: break;
|
-1: break;
|
||||||
0: if K <= High(ASortParams.Keys) then inc(K) else break;
|
0: if K <= High(ASortParams.Keys) then inc(K) else break;
|
||||||
+1: inc(I);
|
+1: begin inc(I); K:= 0; end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
K := 0;
|
K := 0;
|
||||||
while true do
|
while true do
|
||||||
begin
|
begin
|
||||||
@ -3365,7 +3442,7 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
|
|||||||
cell2 := FindCell(J, ASortParams.Keys[K].ColRowIndex);
|
cell2 := FindCell(J, ASortParams.Keys[K].ColRowIndex);
|
||||||
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
|
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
|
||||||
case sign(compareResult) of
|
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;
|
0: if K <= High(ASortParams.Keys) then inc(K) else break;
|
||||||
+1: break;
|
+1: break;
|
||||||
end;
|
end;
|
||||||
@ -3382,7 +3459,7 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
|
|||||||
case sign(compareResult) of
|
case sign(compareResult) of
|
||||||
-1: break;
|
-1: break;
|
||||||
0: if K <= High(ASortParams.Keys) then inc(K) else 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;
|
||||||
end;
|
end;
|
||||||
K := 0;
|
K := 0;
|
||||||
@ -3392,11 +3469,65 @@ procedure TsWorksheet.Sort(const ASortParams: TsSortParams;
|
|||||||
cell2 := FindCell(ASortParams.Keys[K].ColRowIndex, J);
|
cell2 := FindCell(ASortParams.Keys[K].ColRowIndex, J);
|
||||||
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
|
compareResult := DoCompareCells(cell1, cell2, ASortParams.Keys[K].Order);
|
||||||
case sign(compareResult) of
|
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;
|
0: if K <= High(ASortParams.Keys) then inc(K) else break;
|
||||||
+1: break;
|
+1: break;
|
||||||
end;
|
end;
|
||||||
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;
|
end;
|
||||||
|
|
||||||
if I <= J then
|
if I <= J then
|
||||||
|
@ -272,8 +272,10 @@ var
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
sortParams := InitSortParams(ASortByCols, 2);
|
sortParams := InitSortParams(ASortByCols, 2);
|
||||||
sortParams.Keys[0].ColRowIndex := 0;
|
sortParams.Keys[0].ColRowIndex := 0; // col/row 0 is primary key
|
||||||
sortParams.Keys[1].ColRowIndex := 1;
|
sortParams.Keys[1].ColRowIndex := 1; // col/row 1 is second key
|
||||||
|
|
||||||
|
iLast := High(SollSortNumbers);
|
||||||
|
|
||||||
TempFile := GetTempFileName;
|
TempFile := GetTempFileName;
|
||||||
|
|
||||||
@ -285,18 +287,22 @@ begin
|
|||||||
row := 0;
|
row := 0;
|
||||||
if ASortByCols then
|
if ASortByCols then
|
||||||
begin
|
begin
|
||||||
// Always 2 numbers in the first column are equal
|
// Write all randomized numbers to column B
|
||||||
for i:=0 to High(SollSortNumbers) do
|
for i:=0 to iLast do
|
||||||
MyWorksheet.WriteNumber(i, col, SollSortNumbers[(i mod 2)*2]);
|
MyWorksheet.WriteNumber(i, col+1, SollSortNumbers[i]);
|
||||||
// All strings in the second column are distinct
|
// divide each number by 2 and calculate the character assigned to it
|
||||||
for i:=0 to High(SollSortStrings) do
|
// and write it to column A
|
||||||
MyWorksheet.WriteUTF8Text(i, col+1, SollSortStrings[i]);
|
// 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
|
end else
|
||||||
begin
|
begin
|
||||||
for i:=0 to High(SollSortNumbers) do
|
// The same with the rows...
|
||||||
MyWorksheet.WriteNumber(row, i, SollSortNumbers[(i mod 2)*2]);
|
for i:=0 to iLast do
|
||||||
for i:=0 to High(SollSortStrings) do
|
MyWorksheet.WriteNumber(row+1, i+1, SollSortNumbers[i]);
|
||||||
MyWorksheet.WriteUTF8Text(row+1, i, SollSortStrings[i]);
|
for i:=0 to iLast do
|
||||||
|
MyWorksheet.WriteUTF8Text(row, i, char(ord('A')+round(SollSortNumbers[i div 2])));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
MyWorkBook.WriteToFile(TempFile, AFormat, true);
|
MyWorkBook.WriteToFile(TempFile, AFormat, true);
|
||||||
@ -319,7 +325,6 @@ begin
|
|||||||
fail('Error in test code. Failed to get named worksheet');
|
fail('Error in test code. Failed to get named worksheet');
|
||||||
|
|
||||||
// ... and sort it.
|
// ... and sort it.
|
||||||
iLast := High(SollSortNumbers); //must be the same as for SollSortStrings
|
|
||||||
r1 := 0; c1 := 0;
|
r1 := 0; c1 := 0;
|
||||||
if ASortByCols then begin
|
if ASortByCols then begin
|
||||||
c2 := 1;
|
c2 := 1;
|
||||||
@ -338,31 +343,44 @@ begin
|
|||||||
|
|
||||||
for i:=0 to iLast do
|
for i:=0 to iLast do
|
||||||
begin
|
begin
|
||||||
row := 0;
|
|
||||||
col := 0;
|
|
||||||
if ASortByCols then
|
if ASortByCols then
|
||||||
|
begin
|
||||||
|
// Read the number first, they must be in order 0...9 (if ascending).
|
||||||
|
col := 1;
|
||||||
case sortDir of
|
case sortDir of
|
||||||
ssoAscending : row := i;
|
ssoAscending : row := i;
|
||||||
ssoDescending: row := iLast - i;
|
ssoDescending: row := iLast - i;
|
||||||
end
|
end;
|
||||||
else
|
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
|
case sortDir of
|
||||||
ssoAscending : col := i;
|
ssoAscending : col := i;
|
||||||
ssoDescending: col := iLast - i;
|
ssoDescending: col := iLast - i;
|
||||||
end;
|
end;
|
||||||
actualNumber := MyWorksheet.ReadAsNumber(row, col);
|
actualNumber := MyWorksheet.ReadAsNumber(row, col);
|
||||||
expectedNumber := (i mod 2) * 2;
|
expectedNumber := i;
|
||||||
CheckEquals(expectednumber, actualnumber,
|
CheckEquals(expectednumber, actualnumber,
|
||||||
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
||||||
|
|
||||||
if ASortByCols then
|
row := 0;
|
||||||
inc(col)
|
actualstring := MyWorksheet.ReadAsUTF8Text(row, col);
|
||||||
else
|
expectedString := char(ord('A') + round(expectedNumber) div 2);
|
||||||
inc(row);
|
CheckEquals(expectedstring, actualstring,
|
||||||
actualString := MyWorksheet.ReadAsUTF8Text(row, col);
|
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
||||||
expectedString := char(ord('A') + i);
|
end;
|
||||||
CheckEquals(expectedstring, actualstring,
|
|
||||||
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
MyWorkbook.Free;
|
MyWorkbook.Free;
|
||||||
|
@ -48,7 +48,6 @@
|
|||||||
<Unit1>
|
<Unit1>
|
||||||
<Filename Value="datetests.pas"/>
|
<Filename Value="datetests.pas"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
<UnitName Value="datetests"/>
|
|
||||||
</Unit1>
|
</Unit1>
|
||||||
<Unit2>
|
<Unit2>
|
||||||
<Filename Value="stringtests.pas"/>
|
<Filename Value="stringtests.pas"/>
|
||||||
@ -76,6 +75,7 @@
|
|||||||
<Unit7>
|
<Unit7>
|
||||||
<Filename Value="formattests.pas"/>
|
<Filename Value="formattests.pas"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
|
<UnitName Value="formattests"/>
|
||||||
</Unit7>
|
</Unit7>
|
||||||
<Unit8>
|
<Unit8>
|
||||||
<Filename Value="colortests.pas"/>
|
<Filename Value="colortests.pas"/>
|
||||||
@ -84,6 +84,7 @@
|
|||||||
<Unit9>
|
<Unit9>
|
||||||
<Filename Value="fonttests.pas"/>
|
<Filename Value="fonttests.pas"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
|
<UnitName Value="fonttests"/>
|
||||||
</Unit9>
|
</Unit9>
|
||||||
<Unit10>
|
<Unit10>
|
||||||
<Filename Value="optiontests.pas"/>
|
<Filename Value="optiontests.pas"/>
|
||||||
@ -96,6 +97,7 @@
|
|||||||
<Unit12>
|
<Unit12>
|
||||||
<Filename Value="rpnformulaunit.pas"/>
|
<Filename Value="rpnformulaunit.pas"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
|
<UnitName Value="rpnFormulaUnit"/>
|
||||||
</Unit12>
|
</Unit12>
|
||||||
<Unit13>
|
<Unit13>
|
||||||
<Filename Value="formulatests.pas"/>
|
<Filename Value="formulatests.pas"/>
|
||||||
@ -105,6 +107,7 @@
|
|||||||
<Unit14>
|
<Unit14>
|
||||||
<Filename Value="emptycelltests.pas"/>
|
<Filename Value="emptycelltests.pas"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
|
<UnitName Value="emptycelltests"/>
|
||||||
</Unit14>
|
</Unit14>
|
||||||
<Unit15>
|
<Unit15>
|
||||||
<Filename Value="errortests.pas"/>
|
<Filename Value="errortests.pas"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user