- Код: Выделить всё
implementation
{ TForm1 }
function CustomSorter(List: TStringList; Index1, Index2: integer): integer;
var
s1,s2,
as1, as2: string;
a,b: integer;
begin
{debug}
writeln(index1, ' ', index2);
as1:= '';
as2:= '';
s1:= List[Index1];
s2:= List[Index2];
{сравниваем число до знака %}
for a:= 1 to length(s1) do if s1[a] <> '%' then as1:= as1 + s1[a] else break;
for a:= 1 to length(s2) do if s2[a] <> '%' then as2:= as2 + s2[a] else break;
a:= strtoint(as1);
b:= strtoint(as2);
if (a < b) then exit(1) else
if (a > b) then exit(-1) else
exit(0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
OSL: TStringList;
begin
OSL:= TStringList.Create;
OSL.Sorted:= True;
OSL.Duplicates := dupIgnore;
for ... {куча циклов}
OSL.Add(ous + '#');
{добовляем строки и пропускаем дубликаты}
end;
writeln('Strings count:',OSL.Count, ' Sorting... ');
Application.ProcessMessages;
OSL.Sorted:= False;
OSL.CustomSort(@CustomSorter) ;
...
OSL.Free;
end;
Типичная длинна строки - менее 100 символов.
Если получилось мало строк, то OSL.CustomSort(@CustomSorter) ; отработает нормально.
Если более 10 тыс, то:
- Код: Выделить всё
10692 10709
10693 10709
10694 10709
10695 10709
10696 10709
10697 10709
10698 10709
10699 10709
10700 10709
10701 10709
10702 10709
10703 10709
10704 10709
10705 10709
10706 10709
10707 10709
10708 10709
TApplication.HandleException Unknown Run-Time error : 202
Stack trace:
$00403DFF
$0040E817
$0041BA19
$00426873
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
$004268D6
Опции оптимизации -O1 -CX - XX -Xs (Манипулирование не дало результата) Lazarus 0.9.26 Release
Неужели 10709 строк много?