program study_class;

uses
  SysUtils,
  LCLProc, LazUTF8;    //プロジェクトインスペクタでパッケージLCLを追加

type
  TAnimal = class
  private
    FNickname: string;
  public
    constructor Create(AName: string);
    destructor Destroy; override;
    procedure Speak;
    property Nickname: string read FNickname;
  end;

function C(const S: string): string;
begin
  {$IFDEF Windows}
  Result := UTF8ToConsole(S);
  {$ELSE}
  Result := S;
  {$ENDIF}
end;

constructor TAnimal.Create(AName: string);
begin
  FNickname := AName;
  WriteLn(C(FNickname), C(' が生まれたよ!'));
end;

destructor TAnimal.Destroy;
begin
  WriteLn(C(FNickname), C(' は去っていった…'));
  inherited Destroy;
end;

procedure TAnimal.Speak;
begin
  WriteLn(C(FNickname), C(' が鳴いてるよ!'));
end;

var
  Fox: TAnimal;
begin
  Fox := TAnimal.Create('ミカ');
  Fox.Speak;
  FreeAndNil(Fox);
end.