用 DELPHI 为 WINDOWS 做一个带声音的模拟闹钟_zgqtxwd的博客-程序员宅基地

技术标签: delphi  image  timer  action  integer  windows  

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

   嗨,大家好。我是梦寻,这是我的第一次发帖子,请大家多多鼓励、多多
支持,毕竟嘛,予人方便予己方便。OK,转入正题,现在就来讲如何做一个带
响声的表盘式的 CLOCK。
   首先我们应选择新建一个程序,并在窗体中加入以下元件:
    Timer1: TTimer;
    Image1: TImage;//时钟的表盘
    Edit1: TEdit;  //日期框
    Label1: TLabel;
    PopupMenu1: TPopupMenu;
   而后在 {$R *.DFM} 下面加入这么一句 {$R CLOCKSOU.RES} <--时钟的声音文件,
  (注:CLOCKSOU.RES 是先用WINDOWS的记事本新建一个文件,并加入以下几行
        CLICKBEL  WAVE "CLICKBEL.WAV"
        TIMEBELL  WAVE "TIMEBELL.WAV"
    并存为文件 CLOCKSOU.RC 然后在 DOS解面下用BRCC32.exe 将 CLOCKSOU.RC 编译
 为 DELPHI 格式的资源文件 CLOCOSOU.RES,当然,您如果嫌步骤太烦,那吗最简单的,
 到我的主页 http://www.suye.8u8.com 下载完整的程序代码)
   OK,在完成上面的步骤后我们就可以在窗体的代码筐中输入以下代码。
 
unit Unit1;

interface

uses
  WINDOWS, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls,unit2, StdCtrls,inifiles,MMSystem, Menus;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    Edit1: TEdit;
    Label1: TLabel;
    PopupMenu1: TPopupMenu;
    pop1: TMenuItem;
    pop2: TMenuItem;
    pop4: TMenuItem;
    pop3: TMenuItem;
    pop5: TMenuItem;
    N1: TMenuItem;
    procedure Timer1Timer(Sender: TObject);
    procedure timdrow(tim:real;long,col:integer);
    procedure FormCreate(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure pop1Click(Sender: TObject);
    procedure pop2Click(Sender: TObject);
    procedure pop4Click(Sender: TObject);
    procedure pop5Click(Sender: TObject);
    procedure pop3Click(Sender: TObject);
    procedure tiniwr();
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  CLOCKBELL,wid,pofse:integer;
  tim1,tim2,tim3,tim4:real;
  dtme: TDateTime;
  timini:tinifile;
  dtim,textdef,tmfilename:string;
implementation

{$R *.DFM}
{$R LL1.RES}  //时钟的发声文件
procedure tform1.tiniwr();
 begin
timini:=TIniFile.Create(tmfilename);
with timini do
begin
WriteString('内容','文字',textdef);
Writestring('参数','时间',dtim);
WriteBool('参数','报时允许',pop1.checked);
WriteBool('参数','秒响允许',pop2.checked);
WriteBool('参数','定时允许',pop3.checked);
end;
 timini.free;
 end;

procedure tform1.timdrow(tim:real;long,col:integer); //指针的过程函数。
var
   xx,yy:integer;
   vtt,vt:real;
begin
IF (TIM2=59) AND (TIM3=0) THEN TIM:=TIM-1;
IF (COL=3)or (col=6) THEN
  if col=3 then VT:=TIM1*5+(TIM2/720)
    else begin
          VT:=TIM1*5+((TIM2-1)/720);
          col:=5;
          end
     ELSE vt:=tim;
vt:=Pi-pi*vt/30-2*pi*(vt-15);  //得出指针末端的 Y 坐标
vtt:=int(long*sin(vt))+45;     //得出指针末端的 X 坐标
xx:=strtoint(floattostr(vtt));
vtt:=int(long*cos(vt))+45;
yy:=strtoint(floattostr(vtt));
case col of                    //判断所要画的指针是 分针、秒针或时针
0:begin
image1.Canvas.pen.Color:=clgray;
image1.Canvas.pen.Width:=1;       
END;
1:BEGIN
image1.Canvas.pen.Color:=clRed;
image1.Canvas.pen.Width:=1;
END;
2:BEGIN
image1.Canvas.pen.color:=clblue;
image1.Canvas.pen.Width:=2;
END;
3:BEGIN
image1.canvas.pen.color:=clgreen;
image1.Canvas.pen.Width:=2;
END;
4:begin
image1.canvas.pen.color:=clblack;
image1.Canvas.pen.Width:=1;
END;
5:begin
image1.canvas.pen.color:=clgray;
image1.Canvas.pen.Width:=3;
END;
end;
IMAGE1.Canvas.Ellipse(43,43,47,47);
image1.Canvas.MoveTo(45,45);
image1.Canvas.Lineto(xx,yy);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  str1,str2:string;
begin
str1:=timetostr(time());
STR2:=COPY(STR1,2,1);
if str2=':' then pofse:=0 else pofse:=1;
EDIT1.TEXT:='   '+DATETOSTR(DATE());     //日期盘上的日期数据
str2:=copy(str1,pofse+6,2);
tim4:=strtofloat(str2);
if tim4<>tim3 then                      //判断是否到了移动指针的时间
begin
if (tim3=0) or (tim3=15) or (tim3=30)
  or (tim3=45) then timdrow(tim3,39,4) else timdrow(tim3,39,0);
 tim3:=tim4;
if pop2.checked then PlaySound(PChar('CLICKBEL'),
          hInstance, snd_ASync or snd_Resource); //秒针的“滴答”发声
 str2:=copy(str1,1,pofse+1);

IF(TIM3=0)AND(TIM2=59)THEN  //判断是否到了发出整点报时“钟声”的时间
    BEGIN
     CLOCKBELL:=STRTOINT(STR2);
     IF CLOCKBELL=0 THEN CLOCKBELL:=12;
     END;
     IF CLOCKBELL>12 THEN CLOCKBELL:=CLOCKBELL-12;
 timdrow(tim1,26,6);
 tim1:=strtofloat(str2);
 timdrow(tim2,33,5);
 str2:=copy(str1,pofse+3,2);
 tim2:=strtofloat(str2);
 timdrow(tim2,33,2);
 IF (TIM2<>59) AND (TIM4<>0) THEN timdrow(tim1-1,26,3) ELSE TIMDROW(TIM1,26,3);
 tim2:=strtofloat(str2);
 str2:=copy(str1,pofse+3,2);
 timdrow(tim3,39,1);
IF CLOCKBELL>-1 THEN 
      BEGIN
      IF (CLOCKBELL<>0)and(pop2.checked) THEN
             PlaySound(PChar('TIMEBELL'), hInstance,
                       snd_ASync or snd_Resource);//时钟的整点“钟声”发声
      DEC(CLOCKBELL);
      END;
if (pop3.checked)and(strtotime(dtim)<=time()) then//判断是否到了定时的时间
   begin
     form2.Button2.Caption:='取消';
     clockbell:=120;
     form2.Show;   //显示给自己的提示。
    end;
END;
end;


procedure TForm1.FormCreate(Sender: TObject); //读入程序开始的初始化设定
var
   str1,str2:string;
begin
tmfilename:=ExtractFilePath(Application.EXEName)+'clock1.ini';
timini:=TIniFile.Create(tmfilename);
with timini do
begin
Textdef:=readString('内容','文字','在这里输入您给自己的提醒');
dtim:=readstring('参数','时间','23:59:59');
pop1.checked:=readBool('参数','报时允许',true);
pop2.checked:=readBool('参数','秒响允许',true);
pop3.checked:=readBool('参数','定时允许',false);
form1.Left:=readinteger('位置','X坐标',566);
form1.top:=readinteger('位置','Y坐标',8);
end;
 timini.free;
dtme:=time();
 pop2.checked:=true;
 pop1.Checked:=true;
 str1:=timetostr(time());
 STR2:=COPY(STR1,2,1);
 If str2=':' then pofse:=0 else pofse:=1;
 image1.Canvas.BRUSH.COLOR:=CLBLACK;;
 str2:=copy(str1,pofse+6,2);
 tim3:=strtofloat(str2);
 str2:=copy(str1,pofse+3,2);
 tim2:=strtofloat(str2);
 str2:=copy(str1,1,pofse+1);
 tim1:=strtofloat(str2);
 CLOCKBELL:=-1;
end;

procedure TForm1.Image1Click(Sender: TObject);//表盘鼠标点击时的的处理
begin
PopupMenu1.Popup(FORM1.LEFT+40,FORM1.TOP+150);
end;

procedure TForm1.pop1Click(Sender: TObject);
begin
if pop1.checked then pop1.checked:=false else pop1.checked:=true;
form1.tiniwr();
end;

procedure TForm1.pop2Click(Sender: TObject);
begin
if pop2.checked then pop2.checked:=false else pop2.checked:=true;
form1.tiniwr();
end;

procedure TForm1.pop4Click(Sender: TObject);
begin
form2.show;
form1.tiniwr();
end;

procedure TForm1.pop5Click(Sender: TObject);
begin
close;
end;

procedure TForm1.pop3Click(Sender: TObject);
begin
if pop3.Checked then
begin
pop3.Checked:=false;
form2.Button2.Caption:='取消';
end
   else
     begin
     pop3.Checked:=true;
     form2.Button2.Caption:='关闭';
     end;
form1.tiniwr();
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
timini:=TIniFile.Create('tmfilename');
with timini do
begin
Writeinteger('位置','X坐标',form1.Left);//保存时钟窗口的初始 X 坐标
Writeinteger('位置','Y坐标',form1.top);//保存时钟窗口的初始 Y 坐标
end;
 timini.free;

end;

procedure TForm1.N1Click(Sender: TObject);
begin
showmessage('模拟闹钟 0.1,'+#13+'  Copy(R)ight by Suye.2001');;
end;

end.
    好了,经过以上的一些操作后,我们的一个闹钟就几呼完成了,您只要做一些
小变化就全部完成了,OK,就聊到这,您如果还有什么问题,欢迎到我的主页
http://www.suye.8u8.com 询问,说不定您将会得到不错的收获哦。
                                 梦寻,2001.02.04

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zgqtxwd/article/details/2350245

智能推荐

java实现获取微信公众服务号消息_java获取微信公众号私信内容_yaerfeng的博客-程序员宅基地

java实现获取微信公众服务号消息源代码下载地址:http://www.zuidaima.com/share/1823698247126016.htm_java获取微信公众号私信内容

数据库(mysql oracle)学习小结_#码道老刘#的博客-程序员宅基地

数据库概念oracle数据库一组:数据文件、控制文件、日志文件oracle实例,它与数据库的关系oracle实例:实例就是数据库启动后分配的内存和建立的后台进程. 数据库关闭后,物理上的文件还存在,但实例(分配的内存和建立的进程)就没有了数据库:物理操作系统文件或磁盘(disk)的集合。关系: 实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进

Netcdf4.4的安装过程(附netcdf4.1.3的安装过程)_netcdf安装包历史版本_黄学智的博客-程序员宅基地

写这个文章,主要有两个目的:一个是自己备忘;另一个是分享. 方便自己也帮助他人.NetCDF全称为network Common Data Format,中文译法为“网络通用数据格式”,对程序员来说,它和zip、jpeg、bmp文件格式类似,都是一种文件格式的标准。netcdf文件开始的目的是用于存储气象科学中的数据,现在已经成为许多数据采集软件的生成文件的格式。 注:netcdf4.2..._netcdf安装包历史版本

C语言如何解释a<b<c_跟包叔一起学习的博客-程序员宅基地

C语言如何解释aint main(void){ int a=1,b=2,c=2; while(a { int t; t=a; a=b; b=t; c--; } printf("%d\n",c); return 0;}这段代码,有些人认为不会执行,结果应该是2,正确的结果是:0运行结果原因:a给大家推荐一本书《C语言编程之道》这本书我个人觉得不错。_a

Kotlin实现垃圾分类系统_振华OPPO的博客-程序员宅基地

为了加强居民的生活垃圾分类意识,提高居民垃圾分类的参与度,促进文明社会的建设,推进低碳城市的进步,设计和开发了这款垃圾分类APP。用户可以先注册账号,然后进行登录,可以选择记住密码,下次就不需要重新输入了。进入主界面,是三个底部导航栏:首页、分类百科、设置,首页可以进行垃圾类别搜索,输入垃圾名称即可查到类别,还有宣传视频可以观看。分类百科中,有顶部导航栏,可以进行滑动页面,介绍可回收物、干垃圾、湿垃圾和有害垃圾的百科。设置中有六大功能,比如切换地区和用户协议等。先来看下源代码文件,activity包下是主要

随便推点

/proc/sys/net/bridge/bridge-nf-call- iptables does not exist_/proc/sys/net/bridge/bridge-nf-call-iptables does -程序员宅基地

关于kubeadm init时报错"/proc/sys/net/bridge/bridge-nf-call- iptables does not exist"执行这条命令即可$ modprobe br_ netfilter_/proc/sys/net/bridge/bridge-nf-call-iptables does not exist

华为升级android 8,华为Mate 10获史诗级更新 升级到Android 8.1_淑女不是姐的范er的博客-程序员宅基地

原标题:华为Mate 10获史诗级更新 升级到Android 8.17月16日下午,华为花粉俱乐部宣布消息,华为面向Mate 10和Mate 10 Pro用户开放各5万个名额,可以升级到体验版EMUI 8.1.0.321。这是基于Android 8.1的系统版本,同时还将加入960帧超级慢动作,智能图库等功能。 华为Mate 10和Mate 10 Pro是去年年底推出的旗舰手机,搭载了麒麟970 ..._华为mate10可以升级多少系统

webpack第3章 -- 资源解析_csdn资源解析_想上天的小鱼的博客-程序员宅基地

在了解webpack基本核心概念之后,来看一下webpack是怎么对资源进行解析的:一、解析es6webpack原生代码是支持对js的解析的,但如果有es6的语法,就需要借助babel-loader来实现了。需要做的配置如下:babel-loader babel的配置文件.babelrc(babel-loader依赖babel) 增加babel preset配置1、安装依赖npm i @babel/core @babel/preset-env babel-loader --sav_csdn资源解析

echarts map_Claroja的博客-程序员宅基地

var myChart = echarts.init(document.getElementById('main'));// 基于准备好的dom,初始化echarts实例data1=[//自动将第一维度和第二维度数据映射为坐标 [121.15,31.89,9], [109.781327,39.608266,12], ];data2=[//添加了名称可以在地图上显示,这个

PHP 零基础入门笔记(1):PHP 基础_php项目基础_彭世瑜的博客-程序员宅基地

PHP 基础1、简介PHP: 服务器端脚本编程语言,书写动态网页PHP: Personal HomePage 个人主页,使用 Perl 语言PHP: PHP Hypertext Preprosessor 超文本预处理器,底层使用 C 语言2、发展历史1994 1.0 perl1996 2.0 C 语言1998 3.0 zendEngine2000 4.0 session2004 5.0 zend2 代,面向对象,命名空间,异常2015 7.0 新版 zendEngine3、生_php项目基础

推荐文章

热门文章

相关标签