用 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

智能推荐

第三方免费加固横向对比_JackieZhengChina的博客-程序员宅基地_加固对比

前言基于java开发的android应用由于其语言的特性,所以很容易被反编译,虽然android提供了proguard,但是也只是增加了源码阅读的难度,其中业务逻辑依旧可以分析得出。有些人通过各种破解手段将apk文件破解、反编译,然后加入广告、病毒代码,重新打包投入市场,不明真相的用户将带病毒广告的apk下载下来,甚至因此造成利益损失。一些个人开发者,小企业等并不会有这么多的资源精力投入在...

Floyd算法(一)之 C语言详解_poins的博客-程序员宅基地

本章介绍弗洛伊德算法。和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现。后续再分别给出C++和Java版本的实现。目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/更多内容:数据结...

多机调度问题-贪心算法_ts_Maple的博客-程序员宅基地

设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽可能短的时间内由m台机器加工处理完成。 多机调度问题是一个NP完全问题,到目前为止还没有完全有效的解法。对于这类问题,用贪心选择策略有时可以设

Cocos2d-x简单的Demo_LeeJuen的博客-程序员宅基地_cocos2dx demo

和很多游戏引擎一样Cocos2dx有导游、场景、层、菜单、精灵这些概念。

【题解】洛谷P5588 小猪佩奇爬树_JokerJim的博客-程序员宅基地

题意传送门题解这里是一种时空复杂度均为O(nlog⁡n)O(n\log n)O(nlogn)的暴力做法。感觉这道题顺着思路想下去还是挺简单的。题目的要求实际上是对于同种颜色的点,都必须在同一条链上。那么我们自然想到把每一种颜色单独处理,先找到每种颜色中深度最大的那个点,显然如果这种颜色能符合一条链的条件,那么这个最深的点一定是链的一端,我们设它为xxx。接着我们考虑另一端的位置。这里出...

文本溢出截断省略_马优晨的博客-程序员宅基地

(1)单行文本溢出省略&lt;style&gt; .demo { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }&lt;/style&gt;&lt;body&gt; &lt;div class="demo"&gt;这是一段很长的文本&lt;/...

随便推点

操作系统学习笔记——第十三讲——I/O系统(13.1 I/O基本概念)_预见未来to50的博客-程序员宅基地

1. 概述2. I/O系统的对象和任务3. I/O系统的基本功能4. 设备独立性5. 内核I/O结构6. I/O应用接口7. I/O硬件8. I/O硬件控制9. PC中的设备I/O端口位置(部分)10. I/O设备的特点11. I/O设备的类型...

win10+ubuntu16.04双系统安装总结_Kol_mogorov的博客-程序员宅基地

虽然之前装过几次双系统,这次还是记录一下比较好,说不定下次还得装双系统1。装双系统和重装系统的有些步骤是一样的,但重装系统首先得磁盘分区,我直接分了50G,反正我也不懂2,然后把ubuntu16.04的iso镜像文件写入U盘,用ultroIso就可以了,很简单的3,然后就改下启动项,按提示进行安装,用UEFI启动项就行。安装提示,这里记得选择汉语,不要选英语,否则到时候连个汉字输入法都...

dubbo+zookeeper与提供者、消费者之间端口通信问题(No provider available for the service)_王树民的博客-程序员宅基地

2016年08月23日 14:32:50阅读数:195821、先来一段异常看看:No provider available for the service16:05:25.755 [localhost-startStop-1] WARN o.s.w.c.s.XmlWebApplicationContext - Exception encountered during context initia...

dircms宽字节注入漏洞_Yatere的博客-程序员宅基地

//------------------------------------Name: dircmsSite: www.dircms.netDesc: 宽字节带来的注入问题Author: tojen (tojen.me at gmail.com)Date: 2010/3/8//--------------------------------------描述:无意间黑盒发现dircms存在宽字节带来的注入问题,虽然流行过一段时间,貌似现在人们都不太关注这个问题。测试了下发现有俩个地方存在问题:1.http:/

android view 存值,使用ViewModel保存数据_weixin_39542093的博客-程序员宅基地

使用viewModel保存数据,使App被系统kill后,再次启动依然可以恢复被kill前的数据下面的model = ViewModelProviders.of(this,new SavedStateViewModelFactory(this)).get(MyViewModel.class);api过时了,没有此方法了,仅记录下实现保存数据的思路1.导入implementation 'androi...

Nginx超简单教程,小白都能看得懂_Java旅途的博客-程序员宅基地

一 Nginx简介1.1 什么是NginxNginx是一个高性能的http和反向代理服务器,其特点是占用内存小,并发能力强。Nginx专为性能优化而开发,性能是其最重要的考量,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。1.2 反向代理正向代理:在浏览器中配置代理服务器,通过代理服务器进行互联网访问。反向代理:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴漏的是代理服务器地址。1.3

推荐文章

热门文章

相关标签