Advertisement
Egor_Vakar

(Delphi) lab 6.1

Apr 27th, 2022
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.69 KB | None | 0 0
  1. unit MainKuKuha;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ExtCtrls, StdCtrls, Vcl.Buttons, System.Actions, Vcl.ActnList,
  8.   Vcl.PlatformDefaultStyleActnCtrls, Vcl.ActnMan, Vcl.Menus, Winapi.MMSystem,
  9.   Vcl.Imaging.pngimage, Vcl.MPlayer;
  10.  
  11. type
  12.   TKukuhaForm = class(TForm)
  13.     Clocks: TImage;
  14.     KuKuHa: TImage;
  15.     MainMenu1: TMainMenu;
  16.     N1: TMenuItem;
  17.     N2: TMenuItem;
  18.     Timer: TTimer;
  19.     PaintBox1: TPaintBox;
  20.     MediaPlayer1: TMediaPlayer;
  21.     ModeLabel: TLabel;
  22.     N3: TMenuItem;
  23.     N4: TMenuItem;
  24.     N5: TMenuItem;
  25.   procedure DrawArrows(DrawColor: TColor);
  26.     procedure AboutClick(Sender: TObject);
  27.     procedure DeveloperInfoClick(Sender: TObject);
  28.     procedure TimerTimer(Sender: TObject);
  29.     procedure PaintBox1Paint(Sender: TObject);
  30.     procedure FormCreate(Sender: TObject);
  31.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  32.     procedure Button1Click(Sender: TObject);
  33.     procedure N4Click(Sender: TObject);
  34.     procedure N5Click(Sender: TObject);
  35.  
  36.  
  37.   private
  38.     { Private declarations }
  39.   public
  40.     { Public declarations }
  41.   end;
  42.  
  43. var
  44.   KukuhaForm: TKukuhaForm;
  45.   Counter, MaxCount: integer;
  46.   HourArrow,MinArrow, SecArrow: Integer;
  47.   Hour, min, sec, msec: word;
  48.   HourAngle, MinAngle, SecAngle: real;
  49.  
  50. implementation
  51.  
  52. {$R *.dfm}
  53.  
  54. procedure TKukuhaForm.AboutClick(Sender: TObject);
  55. begin
  56.     application.MessageBox('Данная программа реализует часы с кукушкой, работающие в двух режимах:'#13#10'1. По системеному времени.'#13#10'2. x540 режим (полный оборот минутной стрелки за 80 сек).', 'О программе');
  57. end;
  58.  
  59. procedure TKukuhaForm.Button1Click(Sender: TObject);
  60. begin
  61.     PlaySound('3KyKy.wav',0, SND_ASYNC);
  62. end;
  63.  
  64. procedure TKukuhaForm.DeveloperInfoClick(Sender: TObject);
  65. begin
  66.     application.MessageBox('Данная программа написана Вакарём Егором'#13#10'студентом группы 151002.','О разработчике');
  67. end;
  68.  
  69. procedure TKukuhaForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  70. var
  71.     WND: HWND;
  72.     lpCaption, lpText: PChar;
  73.     Tip: Integer;
  74. begin
  75.     WND := KuKuHaForm.Handle;
  76.     lpCaption := 'Выход';
  77.     lpText := 'Вы уверены, что хотите выйти?';
  78.     Tip := MB_YESNO + MB_ICONINFORMATION + MB_DEFBUTTON2;
  79.     case MessageBox(WND, lpText, lpCaption, Tip) Of
  80.         IDYES : CanClose := True;
  81.         IDNO : CanClose := False;
  82.     end
  83. end;
  84.  
  85. procedure TKukuhaForm.FormCreate(Sender: TObject);
  86. begin
  87.     Counter := 1501;
  88.     DecodeTime(Time,Hour,min,sec,msec);
  89.     HourAngle := Hour;
  90.     MinAngle := Min;
  91.     SecAngle := Sec;
  92. end;
  93.  
  94. procedure TKukuhaForm.N4Click(Sender: TObject);
  95. begin
  96.     ModeLabel.Caption :='';
  97. end;
  98.  
  99. procedure TKukuhaForm.N5Click(Sender: TObject);
  100. begin
  101.     ModeLabel.Caption :='1';
  102. end;
  103.  
  104. procedure TKukuhaForm.PaintBox1Paint(Sender: TObject);
  105. var
  106.   i: byte;
  107. begin
  108.     PaintBox1.Canvas.Pen.Width:=5;
  109.     PaintBox1.Canvas.MoveTo(PaintBox1.Width div 2,PaintBox1.Height div 2);
  110.     PaintBox1.Canvas.LineTo((PaintBox1.Width div 2)+round(35*sin(2*pi*(HourAngle + MinAngle/60)/12)),(PaintBox1.Height div 2)-round(35*cos(2*pi*(HourAngle + MinAngle/60)/12)));
  111.  
  112.     PaintBox1.Canvas.Pen.Width:=3;
  113.     PaintBox1.Canvas.MoveTo(PaintBox1.Width div 2,PaintBox1.Height div 2);
  114.     PaintBox1.Canvas.LineTo((PaintBox1.Width div 2)+round(45*sin(2*pi*(MinAngle + SecAngle/60)/60)),(PaintBox1.Height div 2)-round(45*cos(2*pi*(MinAngle + SecAngle/60)/60)));
  115.  
  116.     PaintBox1.Canvas.Pen.Width:=2;
  117.     PaintBox1.Canvas.MoveTo(PaintBox1.Width div 2,PaintBox1.Height div 2);
  118.     PaintBox1.Canvas.LineTo((PaintBox1.Width div 2)+round(60*sin(SecAngle/60*(2*pi))),(PaintBox1.Height div 2)-round(60*cos(SecAngle/60*(2*pi))));
  119. end;
  120. procedure TKukuhaForm.TimerTimer(Sender: TObject);
  121. begin
  122.     DrawArrows(clWhite);
  123.     if ModeLabel.Caption = '' then
  124.     begin
  125.         DecodeTime(Time,Hour,min,sec,msec);
  126.         HourAngle := Hour;
  127.         MinAngle := Min;
  128.         SecAngle := Sec;
  129.     end
  130.     else
  131.     begin
  132.         SecAngle := SecAngle + 1;
  133.         MinAngle:= MinAngle +  0.08;
  134.         HourAngle := HourAngle + 0.001;
  135.     end;
  136.     DrawArrows(clBlack);
  137. end;
  138.  
  139. procedure TKukuhaForm.DrawArrows(DrawColor: TColor);
  140. var
  141.     TempHourX, TempHourY: Real;
  142. begin
  143.     with PaintBox1.Canvas do
  144.     begin
  145.         PaintBox1.Canvas.Pen.Color := DrawColor;
  146.         PaintBox1.Canvas.Pen.Width:=5;
  147.         PaintBox1.Canvas.MoveTo(PaintBox1.Width div 2,PaintBox1.Height div 2);
  148.         TempHourX := 35*sin(2*pi*(HourAngle + MinAngle/60)/12);
  149.         TempHourY := 35*cos(2*pi*(HourAngle + MinAngle/60)/12);
  150.         PaintBox1.Canvas.LineTo((PaintBox1.Width div 2)+round(TempHourX),(PaintBox1.Height div 2)-round(TempHourY));
  151.  
  152.         PaintBox1.Canvas.Pen.Width:=3;
  153.         PaintBox1.Canvas.MoveTo(PaintBox1.Width div 2,PaintBox1.Height div 2);
  154.         PaintBox1.Canvas.LineTo((PaintBox1.Width div 2)+round(45*sin(2*pi*(MinAngle + SecAngle/60)/60)),(PaintBox1.Height div 2)-round(45*cos(2*pi*(MinAngle + SecAngle/60)/60)));
  155.  
  156.         PaintBox1.Canvas.Pen.Width:=2;
  157.         PaintBox1.Canvas.MoveTo(PaintBox1.Width div 2,PaintBox1.Height div 2);
  158.         PaintBox1.Canvas.LineTo((PaintBox1.Width div 2)+round(60*sin(SecAngle/60*(2*pi))),(PaintBox1.Height div 2)-round(60*cos(SecAngle/60*(2*pi))));
  159.     end;
  160.     if (Counter > 1500) then
  161.     begin
  162.         if (Abs(TempHourX) < 0.1) then
  163.         begin
  164.             Counter := 0;
  165.             KuKuHa.Visible := True;
  166.             if (Abs(TempHourY + 35) < 0.1) then
  167.             begin
  168.                 MaxCount := 1400;
  169.                 MediaPlayer1.FileName := '..\..\ku_6​.mp3';
  170.             end
  171.             else
  172.             begin
  173.                 MaxCount := 840;
  174.                 MediaPlayer1.FileName := '..\..\ku_12.mp3'
  175.             end;
  176.             MediaPlayer1.Open;
  177.             MediaPlayer1.Play;
  178.         end;
  179.         if (Abs(TempHourX + 35) < 0.1) then
  180.         begin
  181.             MaxCount := 1230;
  182.             Counter := 0;
  183.             KuKuHa.Visible := True;
  184.             MediaPlayer1.FileName := '..\..\ku_9.mp3';
  185.             MediaPlayer1.Open;
  186.             MediaPlayer1.Play;
  187.         end;
  188.         if (Abs(TempHourX - 35) < 0.1) then
  189.         begin
  190.             MaxCount := 1400;
  191.             Counter := 0;
  192.             KuKuHa.Visible := True;
  193.             MediaPlayer1.FileName := '..\..\ku_3.mp3';
  194.             MediaPlayer1.Open;
  195.             MediaPlayer1.Play;
  196.         end;
  197.     end;
  198.     if counter > MaxCount then
  199.     begin
  200.         KuKuHa.Visible := False;
  201.     end;
  202.  
  203.     Inc(counter);
  204. end;
  205. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement