unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, Contnrs,
  Unit1;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    btnStart: TBitBtn;
    btnSORT: TBitBtn;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure btnSORTClick(Sender: TObject);
    procedure btnStartClick(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private

  public

  end;

function CompareNames(Item1 : Pointer; Item2 : Pointer) : Integer;

var
  Form2: TForm2;

implementation
{$R *.dfm}
{------------------------------------------------------------------------------}
function CompareNames(Item1 : Pointer; Item2 : Pointer) : Integer;
begin
   Result := CompareText(Osoba(Item1).nazwisko, Osoba(Item2).nazwisko);
end;

procedure TForm2.BitBtn1Click(Sender: TObject);
begin
	Close();
end;

procedure TForm2.btnStartClick(Sender: TObject);
var
	ilEL         : Integer;
	komunikat    : String;
   idx          : Integer;

	Lista        : TObjectList;

	ob_osoba     : Osoba;
	ob_prostokat : Prostokat;
	ob_int       : MojInt;

	wsk          : TObject;

begin
	Lista        := Nil;
	ob_osoba     := Nil;
	ob_prostokat := Nil;
	ob_int       := Nil;

   // nowa lista
   Lista := TObjectList.Create(true);

   ob_osoba := Osoba.Create();
   ob_osoba.nazwisko := 'Kowalski';

   ob_prostokat := Prostokat.Create();
   ob_prostokat.x1 :=  10;
   ob_prostokat.y1 :=  20;
   ob_prostokat.x2 := 100;
   ob_prostokat.y2 := 200;

	ob_int := MojInt.Create();
	ob_int.cyfra := 321;
	// Aby wstawić elementy do listy możemy to zadanie wykonać posługując się metodą Add:
	Lista.Add(ob_osoba);
	Lista.Add(ob_prostokat);
	// lub Insert
	Lista.Insert(1, ob_int);

	ilEL := Lista.Count;
   ShowMessage('Ilość elementów listy: ' + IntToStr(ilEL));

	idx := Lista.IndexOf(ob_osoba);
   komunikat := 'Wskaźnik na osobę na pozycji: ' + IntToStr(idx) + #10#13;
   idx := Lista.IndexOf(ob_int);
   komunikat := komunikat + 'wskaźnik na int na pozycji: ' + IntToStr(idx) + #10#13;
   idx := Lista.IndexOf(ob_prostokat);
   komunikat := komunikat + 'wskaźnik na prostokąt na pozycji: ' + IntToStr(idx);
   ShowMessage(komunikat);


   {
	Lista.Remove(ob_int);
	ilEL := Lista.Count;
	komunikat := 'Teraz lista ma elementów: ' + IntToStr(ilEL);
	ShowMessage(komunikat);
   }

	wsk := Lista.Last();
   if(wsk = ob_prostokat) then
   begin
   	komunikat := 'pierwszym elementem listy jest: prostokąt';
      ShowMessage(komunikat);
   end;


	// usuwamy elementy listy:
	Lista.Remove(ob_osoba);
   Lista.Remove(ob_prostokat);
   Lista.Remove(ob_int);
   // lub
   // ponowne wywołanie nie spowoduje błedu
   Lista.Clear();

	ilEL := Lista.Count;
	komunikat := 'Teraz lista ma elementów: ' + IntToStr(ilEL);
	ShowMessage(komunikat);

   if Assigned(Lista) then
   begin
	   FreeAndNil(Lista);
   end;
end;

procedure TForm2.btnSORTClick(Sender: TObject);
var
   txt      : String;
   ilEL     : Integer;
   lp       : Integer;
   Lista    : TObjectList;
   ob_osoba : Osoba;

begin
   Memo1.Clear();
   Memo2.Clear();

   // tworzymy listę
   Lista := TObjectList.Create(true);

   // wstawiamy do niej nazwiska osób w dowolnej kolejności
   ob_osoba := Osoba.Create();
   ob_osoba.nazwisko := 'Komorecki';
   Lista.Add(ob_osoba);

   ob_osoba := Osoba.Create();
   ob_osoba.nazwisko := 'Warzęcha';
   Lista.Add(ob_osoba);

   ob_osoba := Osoba.Create();
   ob_osoba.nazwisko := 'Zelwerowicz';
   Lista.Add(ob_osoba);

   ob_osoba := Osoba.Create();
   ob_osoba.nazwisko := 'Kowalski';
   Lista.Add(ob_osoba);

   ob_osoba := Osoba.Create();
   ob_osoba.nazwisko := 'Bartecki';
   Lista.Add(ob_osoba);

   ilEL := Lista.Count;

   Memo1.Lines.Add('Ilość elementów listy: ' + IntToStr(ilEL));
   for lp := 0 to ilEL-1 do
   begin
   	txt := Osoba(Lista.Items[lp]).nazwisko;
      Memo1.Lines.Add(txt);
   end;



   // wywołujemy sortowanie
   Lista.Sort(CompareNames);

   // oraz wyświetlamy zawartość listy, tym razem już posortowanej
   Memo2.Lines.Add('Posortowana zawartość listy:');
 	for lp := 0 to Lista.Count - 1 do
   begin
   	txt := Osoba(Lista.Items[lp]).nazwisko;
      Memo2.Lines.Add(txt);
   end;

   // robimy porządek:
	if Assigned(Lista) then
   begin
      Lista.Clear();
      FreeAndNil(Lista);
	end;

	ob_osoba := Nil;
end;

end.


