unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
SortNumericalButton: TButton;
procedure FormCreate(Sender: TObject);
procedure SortNumericalButtonClick(Sender: TObject);
private
procedure PopulateMemo;
procedure SortMemoNumerically(aMemo: TMemo);
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
PopulateMemo;
end;
procedure TForm1.PopulateMemo;
begin
Memo1.Clear;
Memo1.Append('4516');
Memo1.Append('4547');
Memo1.Append('4534');
Memo1.Append('4523');
Memo1.Append('45');
Memo1.Append('547');
Memo1.Append('999');
Memo1.Append('111');
end;
procedure TForm1.SortMemoNumerically(aMemo: TMemo);
var
mn, mx, si: SizeInt;
arr: array of SizeInt;
sl: TStringList;
i, hi, tmp: Integer;
function InArray: Boolean;
var
j: Integer;
begin
for j := 0 to hi do
case (arr[j] = si) of
True: Exit(True);
False: ;
end;
Result := False;
end;
begin
SetLength(arr{%H-}, aMemo.Lines.Count);
hi := High(arr);
sl := TStringList.Create;
mn := MaxInt;
mx := -MaxInt;
try
for i := 0 to hi do
case TryStrToInt(aMemo.Lines[i], tmp) of
True: begin
arr[i] := tmp;
if mn > tmp then
mn := tmp
else
if mx < tmp then
mx := tmp;
end;
False: arr[i] := -MaxInt;
end;
i := 0;
for si := mn to mx do
if InArray then
begin
sl.Add(si.ToString);
Inc(i);
end;
aMemo.Lines.Assign(sl);
finally
sl.Free;
end;
end;
procedure TForm1.SortNumericalButtonClick(Sender: TObject);
begin
SortMemoNumerically(Memo1);
end;
end.