Delphi 音量
Delphi基础知识
Delphi是著名的Borland公司开发的可视化软件开发环境,自1995年问世以来,带来了程序设计中的一场重大变化。
Delphi作为第四代编程语言,具有简单、高效和功能强大等特点,这些特点使得它为广大程序开发者所青睐。
1.1 Delphi简介Delphi作为一种可视化的编程环境,提供了方便、快捷的Windows应用程序开发工具。
Delphi使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了可重复利用的完整的面向对象的程序语言(Object-Oriented Language)、是当今最快的编辑器、拥有领先的数据库技术。
对于广大的程序开发人员而言,使用Delphi开发应用软件,无疑会大大提高编程效率。
Delphi到今天已经历了7代产品的发展历程,每一代产品都是伴随Windows操作平台的升级而升级。
Borland公司从1983年推出Turbo Pascal 1.0开始,一直推动着Pascal向前发展,其间走过了艰苦创作的历程,最终完成了从DOS到Windows的质的飞跃。
进入Windows时代后,Borland公司在1995年推出了基于Windows平台的Delphi 1,成为Windows开发工具的新突破。
Delphi 1的出现,首次为使用Pascal语言的程序开发者提供了一个可视化开发环境。
其后,Borland公司以每年一个版本的速度对Delphi进行扩充功能和提高性能。
Delphi 2新增加的主要功能是对32位编程的支持。
除此之外,Delphi 2还增加了如数据模块等多种高效的数据重用功能。
随后出现的Delphi 3,不仅改进了集成开发环境(IDE)和“代码洞察”,还对其组件库进行了许多增强,并且完全支持ActiveX组件及其创建,大大巩固了Delphi作为Windows应用程序开发工具的地位。
对于Delphi 4,它提供了Object Pascal语言的扩展,使之更像C++。
delphi 键盘键值对照表
delphi 键盘键值对照表(2013-07-30 22:48:13)转载▼标签:delphi 键值it 分类:Delphi常数名称十六进制值十进制值对应按键VK_LBUTTON 01 1 鼠标的左键VK_RBUTTON 02 2 鼠标的右键VK-CANCEL 03 3 Ctrl+Break(通常不需要处理)VK_MBUTTON 04 4 鼠标的中键(三按键鼠标)VK_BACK 08 8 Backspace键VK_TAB 09 9 Tab键VK_CLEAR 0C 12 Clear键(Num Lock关闭时的数字键盘5)VK_RETURN 0D 13 Enter键VK_SHIFT 10 16 Shift键VK_CONTROL 11 17 Ctrl键VK_MENU 12 18 Alt键VK_PAUSE 13 19 Pause键VK_CAPITAL 14 20 Caps Lock键VK_ESCAPE 1B 27 Ese键VK_SPACE 20 32 Spacebar键VK_PRIOR 21 33 Page Up键VK_NEXT 22 34 Page Domw键VK_END 23 35 End键VK_HOME 24 36 Home键VK_LEFT 25 37 LEFT ARROW 键(←)VK_UP 26 38 UP ARROW键(↑)VK_RIGHT 27 39 RIGHT ARROW键(→)VK_DOWN 28 40 DOWN ARROW键(↓)VK_Select 29 41 Select键VK_PRINT 2A 42VK_EXECUTE 2B 43 EXECUTE键VK_SNAPSHOT 2C 44 Print Screen键(抓屏)VK_Insert 2D 45 Ins键(Num Lock关闭时的数字键盘0)VK_Delete 2E 46 Del键(Num Lock关闭时的数字键盘.)VK_HELP 2F 47 Help键VK_0 30 48 0键VK_1 31 49 1键VK_2 32 50 2键VK_3 33 51 3键VK_4 34 52 4键VK_5 35 53 5键VK_6 36 54 6键VK_7 37 55 7键VK_8 38 56 8键VK_9 39 57 9键VK_A 41 65 A键VK_C 43 67 C键VK_D 44 68 D键VK_E 45 69 E键VK_F 46 70 F键VK_G 47 71 G键VK_H 48 72 H键VK_I 49 73 I键VK_J 4A 74 J键VK_K 4B 75 K键VK_L 4C 76 L键VK_M 4D 77 M键VK_N 4E 78 N键VK_O 4F 79 O键VK_P 50 80 P键VK_Q 51 81 Q键VK_R 52 82 R键VK_S 53 83 S键VK_T 54 84 T键VK_U 55 85 U键VK_V 56 86 V键VK_W 57 87 W键VK_X 58 88 X键VK_Y 59 89 Y键VK_Z 5A 90 Z键VK_NUMPAD0 60 96 数字键0键VK_NUMPAD1 61 97 数字键1键VK_NUMPAD2 62 98 数字键2键VK_NUMPAD3 62 99 数字键3键VK_NUMPAD4 64 100 数字键4键VK_NUMPAD5 65 101 数字键5键VK_NUMPAD6 66 102 数字键6键VK_NUMPAD7 67 103 数字键7键VK_NUMPAD8 68 104 数字键8键VK_NUMPAD9 69 105 数字键9键VK_MULTIPLY 6A 106 数字键盘上的*键VK_ADD 6B 107 数字键盘上的+键VK_SEPARATOR 6C 108 Separator键VK_SUBTRACT 6D 109 数字键盘上的-键VK_DECIMAL 6E 110 数字键盘上的.键VK_DIVIDE 6F 111 数字键盘上的/键VK_F1 70 112 F1键VK_F2 71 113 F2键VK_F3 72 114 F3键VK_F5 74 116 F5键VK_F6 75 117 F6键VK_F7 76 118 F7键VK_F8 77 119 F8键VK_F9 78 120 F9键VK_F10 79 121 F10键VK_F11 7A 122 F11键VK_F12 7B 123 F12键VK_NUMLOCK 90 144 Num Lock 键VK_SCROLL 91 145 Scroll Lock键上面没有提到的:(都在大键盘)VK_LWIN 91 左win键VK_RWIN 92 右win键VK_APPS 93 右Ctrl左边键,点击相当于点击鼠标右键,会弹出快捷菜单186 ;(分号)187 =键188 ,键(逗号)189 -键(减号)190 .键(句号)191 /键192 `键(Esc下面)219 [键220 \键221 ]键222 ‘键(引号)delphi虚拟键码对应关键VK_LBUTTON鼠标左键VK_RBUTTON鼠标右键VK_CANCEL控制+休息VK_MBUTTON鼠标中键VK_BACK Backspace键VK_TAB Tab键VK_CLEAR清除主要VK_RETURN Enter键VK_SHIFT Shift键VK_CONTROL Ctrl键VK_MENU Alt键VK_PAUSE暂停关键VK_CAPITAL Caps Lock键VK_KANA可与输入法VK_HANGUL可与输入法VK_JUNJA可与输入法VK_FINAL可与输入法VK_HANJA可与输入法VK_KANJI可与输入法VK_CONVERT可与输入法VK_NONCONVERT可与输入法VK_ACCEPT可与输入法VK_MODECHANGE可与输入法VK_ESCAPE Esc键VK_SPACE空间酒吧VK_PRIOR页键VK_NEXT下一页关键VK_END END键VK_HOME主页关键VK_LEFT左箭头键VK_UP向上键VK_RIGHT右箭头键VK_DOWN下箭头键VK_SELECT选择关键VK_PRINT打印键(键盘的具体)VK_EXECUTE执行关键VK_SNAPSHOT Print Screen键VK_INSERT插入关键VK_DELETE Delete键VK_HELP帮助关键VK_LWIN左Windows键(微软键盘)VK_RWIN右Windows键(微软键盘)VK_APPS应用关键(微软键盘)VK_NUMPAD0 0键(数字键盘)VK_NUMPAD1 1键(数字键盘)VK_NUMPAD2 2键(数字键盘)VK_NUMPAD3 3键(数字键盘)VK_NUMPAD4 4键(数字键盘)VK_NUMPAD5 5键(数字键盘)VK_NUMPAD6 6键(数字键盘)VK_NUMPAD7 7键(数字键盘)VK_NUMPAD8 8键(数字键盘)VK_NUMPAD9 9键(数字键盘)VK_MULTIPLY多键(数字键盘)VK_ADD添加键(数字键盘)VK_SEPARATOR分离键(数字键盘)VK_SUBTRACT减去键(数字键盘)VK_DECIMAL小数点键(数字键盘)VK_DIVIDE鸿沟键(数字键盘)VK_F1 F1键VK_F2 F2键VK_F3 F3的关键VK_F4 F4键VK_F5 F5键VK_F6 F6键VK_F7 F7键VK_F8 F8键VK_F9 F9键VK_F10 F10键关键VK_F11 F11键VK_F12 F12键VK_F13 F13键VK_F14 F14键VK_F15 F15键VK_F16 F16键VK_F17 F17键VK_F18 F18键VK_F19 F19键VK_F20 F20键VK_F21 F21键VK_F22 F22键VK_F23 F23键VK_F24 F24键VK_NUMLOCK数Lock键VK_SCROLL滚动Lock键VK_LSHIFT左Shift键(仅用于GetAsyncKeyState和GetKeyState )VK_RSHIFT右Shift键(仅用于GetAsyncKeyState和GetKeyState )VK_LCONTROL左Ctrl键(仅用于GetAsyncKeyState和GetKeyState )VK_RCONTROL右Ctrl键(仅用于GetAsyncKeyState和GetKeyState )VK_LMENU左Alt键(仅用于GetAsyncKeyState和GetKeyState )VK_RMENU右Alt键(仅用于GetAsyncKeyState和GetKeyState )VK_PROCESSKEY工艺关键VK_ATTN经办关键VK_CRSEL CrSel关键VK_EXSEL ExSel关键VK_EREOF擦除EOF分析关键VK_PLAY发挥关键VK_ZOOM变焦关键VK_NONAME保留以供将来使用VK_PA1 PA1关键VK_OEM_CLEAR清除主要标签数:1 “F14键VK_F15 F15键VK_F16 F16键VK_F17 F17键VK_F18 F18键VK_F19 F19键VK_F20 F20键VK_F21 F21键VK_F22 F22键VK_F23 F23键VK_F24 F24键VK_NUMLOCK数Lock键VK_SCROLL滚动Lock键VK_LSHIFT左Shift键(仅用于GetAsyncKeyState和GetKeyState )VK_RSHIFT右Shift键(仅用于GetAsyncKeyState和GetKeyState )VK_LCONTROL左Ctrl键(仅用于GetAsyncKeyState和GetKeyState )VK_RCONTROL右Ctrl键(仅用于GetAsyncKeyState和GetKeyState )VK_LMENU左Alt键(仅用于GetAsyncKeyState和GetKeyState )VK_RMENU右Alt键(仅用于GetAsyncKeyState和GetKeyState )VK_PROCESSKEY工艺关键VK_ATTN经办关键VK_CRSEL CrSel关键VK_EXSEL ExSel关键VK_EREOF擦除EOF分析关键VK_PLAY发挥关键VK_ZOOM变焦关键VK_NONAME保留以供将来使用VK_PA1 PA1关键VK_OEM_CLEAR清除主要。
DELPHI零基础 打造自己的播放器
1.MEDIAPLAYER在DELPHI中我们可以用MEDIAPLAYER来管理媒体控件界面外部设备,如声卡,MIDI 乐器,CD-ROM驱动器等.MEDIAPLAYER组件位于SYSTEM选项卡上.它是一组按钮的组合,其上有播放(PLAY),暂停(PAUSE),停止(STOP),下一标记(NEXT),上一标记(PREVIOUS),快进(STEP),快退(BACK),录制(STARTRECODING)与弹出(EJECT)等9个按钮.其主要属性有:DEVICETYPE属性:用来指定或改变被MEDIAPLAYER组件控制的设备类型,选DTAUTOSELECT最合适为自动测试.DISPLAY:用来指定一个窗口控制来显示播放时的视屏输出.一般为PANEL元件,若缺省则自动打开一个窗体显示.FILENAME:用来指定或改变即将播放或录制的媒体文件名.LENGTH:指定在打开的多媒体设备中的媒体长度.STARTPOS:指定播放起始点.ENDPOS:指定播放中止点.AUTOOPEN:是否自动打开在DEVICETYPE属性中指定的多媒体设备.主要方法有:BACK:调用该方法将使当前正在播放的媒体回退一定数量的帧.回退的帧数决定于FRAMES属性的值.CLOSE:用于关闭打开的多媒体设备.EJECT:用于弹出打开的多媒体设备中国的媒体.NEXT:用于移动当前位置到下一帧的开始处.OPEN:用于打开一个多媒体设备,在调用该方法之前必须在DEVICETYPE属性中指明所用的多媒体设备.PLAY:用于播放已经载入打开的多媒体设备中媒体.PAUSE:设置暂停或播放状态.PREVIOUS:前进到,前一帧开始处.REWIND:回到文件首部.STEP:前进一定数据量的帧STOP:停止播放.例:制作超级播放器(WVD)首先在SYSTEM选项卡上选择MEDIPLAYER在窗体上画出来.设置属性.设置MEDIPLAER的FILENAME属性指向某一个具体文件路径.例如:设置DEVICETYPE为DTAUTOSELECT设置AUTOOPEN为TRUE也可以在窗体画出一个PANEL如图.设置MEDIAPLAER的DISPLAY为PANEL12.实现”全屏播放”与”窗口播放”改form1的BorderStyle属性值为:bsnone;procedure TForm1.Button1Click(Sender:TObject);beginbutton1.Visible:=false;form1.Left:=0;form1.top:=0;form1.Width:=screen.Width;form1.Height:=screen.Height;panel1.Left:=form1.Left;panel1.Top:=form1.top;panel1.Width:=form1.Width;panel1.Height:=form1.Height;mediaplayer1.DisplayRect:=rect(0,0,panel1.Width,panel1.Height);end;procedure TForm1.Formclick(Sender:TObject);beginclose;end;如要实现窗口可直接实现:mediaplayer1.DisplayRect:=rect(0,0,panel1.Width,panel1.Height);如要实现窗口与全屏之间转换可直接定义PANEL1的宽度与高度,及边界。
Delphi XE8开发入门~致Delphi XE8初学者介绍
Firemonkey 是 Embarcadero 公司推出的基于 CPU/GPU 混合架构的业务应用平台, 能够帮助开发人员设计出 Windows、Android、Mac 和 iOS 设备上的视觉绚丽的本 地应用程序。 Firemonkey 允许开发人员创建具有快速的本地性能、动画和图像效果、企业级 的数据连接以及交互式数据可视化的富 HD 和 3D 的图形应用程序,并且可以使用 亚马逊和 Azure 云服务。 Firemonkey 包括 Delphi XE5、C++ Builder XE5,以及 RAD Studio XE5 工具套 件,后者中包含了 RadPHP 和 Embarcadero 的 Prism。
3.Teechart 控件
Teechart 是 Teechart for .NET、TeeChart Pro ActiveX V2010 等控件的简称, 是由 Steema 公司研发的一系列图表控件的简称。
4.VCL 组件
VCL(Visual Component Libray)VCL 是应用在 Win32 上的应用程序。 VCL 是可视化组件库,是 Delphi,C++Builder 等编程语言的基本类库,拥有封装 纯粹,可扩展性强,操作方便等特点,如果是一个非常繁杂的 Win32API,在经 过 VCL 封装后,使用也是非常简便的。VCL 支持类的嵌套,过程及函数的嵌套, 如果你想在一个过程里声明一个类,或是声明另一个过程,那是完全可行的。过 程内部的过程或是函数被称为局部过程或是局部函数。 VCL 对事件的支持及封装也是非常完整的,通过事件对象的声明,可以将任意的 外部事件源绑定到 VCL 控件。 在 Delphi 的 VCL 中,还提供了非常多的伪 API(应用程序编程接口),它们可以 对软件开发提供进一步的支持。 VCL 的可扩展性使得编写控件变得非常简单,并且可以任意导入导出 ActiveX 控 件。同时,它也是平台无关的,可以在 windows,linux,MaxOS 或是其他操作系统 下直接使用。
Delphi之头文件及类的使用(1) 基础知识
Delphi之头文件及类的使用(1)基础知识2008/01/23 14:39今天在菜新(cxwr)的耐心教导下. 学习了Delphi中使用模块(头文件pas)和类模块的方法,再次向可爱的菜新菜老师致敬和感谢。
相信有部分刚接触到delphi的朋友可能也会和我一样,对此基本的东西不太明白。
为了共同学习也为了自已加深影像,所以决定写这一篇菜文。
类与对象?在面向对象的编程中,经常听说和用到类,但什么是类?使用类有什么好处?为什么要使用类?可能并不是每一个人都有深刻的理解。
尤其是像我这样从VB转行过来学习Delphi的人来说。
幸运的是偶曾经肯过一些C和C++的书,虽然并没有完全学会C或是C++的来编写软件,但对类的影像却是形像起来了。
说到类就自然的要说到对象和继承,还有封装、多态。
什么是类?引用我买的一本教学书中话:“从一般意义上讲,类是对具有相似特征和行为事物的一种抽象,即抓住事物的相似性,定义它们的共同性。
”例如计算机可以定义为一个类,因为它具有CPU、主板、内存、硬盘、电源等特性,并且还具有能够计算、上网、运行软件等行为的一种抽象。
在面向对象的编程中我们把它称为对象。
“从程序设计的角度来讲,类是一种数据类型,严格地说,这是一种用户定义的数据类型,它有自己的说明和一些操作,它定义了一种由数据成员、属性和方法组成的数据结构。
”数据成员:数据成员(也称之为字段或域)的使用类似于记录的域,是一些在类中定义好了的变量。
在面向对像的编程中,数据成员一般都定义成私有变量(Private)或受保护的变量(Protected)。
少数情况下定义为公有变量(Public)。
这样有利于数据的封装。
方法:方法是类中定义的且包装在类中的子程序,用于执行类的操作,完成类的任务。
一个类的方法决定了通过这个类创建的实例行为,一个类的所有方法决定了这个实例所执行的功能。
Delhpi中分有6种方法,分别是过程方法、函数方法、类过程、类函数、构造器和析构器,对于这六种方法的声明格式在此略过不说。
关于DELPHI程序多语言支持的问题
----------------仅供学习参考---------------- 关于DELPHI程序多语言支持的问题写DELPHI程序,是如何实现繁体化的?是如何开发英文版的?是通过外挂语言包吗?我完整地说一下我的问题:我写一个DELPHI程序,开发环境是是简体中文版本win xp系统+ Delphi 7的。
现在想做一个繁体版本以及其他非简体中文版本的出来。
此时遇到这几个问题:1、在非简体中文系统中均出现乱码或界面文字错位。
2、而且语言包速度太慢了,每次启动要预读一下语言文件进行界面翻译,工程量大的时候明显感到启动速度下降了3、因为工程量比较大,逐一设置“提示内容”及“界面内容”的语言包比较麻烦,所以不想用ini文件或dll资源库的语言包形式请问各位DELPHI高手你们是怎么做的?有没有一劳永逸的方法?听说DELPHI内置的多国语言功能,有没有用法帮助?还有没有其他一些好用简单强大的Unicode语言包控件?---------------------------------------------------------------------Delphi的多语言是这么用的,但是添加多语言后编译连接速度很慢,有时候10来分钟。
可以把你的Delphi的窗体文件分给翻译来翻译,如果是Delphi7,需要先用Conver.exe来转换为文本格式。
1、Project-New Application 创建你的中文版软件。
2、Project-Language-Add 添加你的语言,比如美国英语(ENU)。
或者File-New-Others-Dll Wizard3、保存后生成多个文件夹。
4、Project-Build All5、程序目录下生成和工程文件同名的语言文件:MyExe.ENU;MyExe.CHN,软件发布需要带这些文件。
6、把软件里面所有字符串定义为资源字符串。
resourcestringC_AppTitle = 'xx管理系统';C_Error = '错误';C_Warning = '警告';7、在软件中用如下代码切换语言:const//定义你得多语言:ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;CHINESE = (SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE;usesReInit;...if LoadNewResourceModule(ENGLISH) <> 0 thenbeginReInitializeForms();end;更多请参考Delphi帮助,里面写得更清楚。
delphi大全
窗体基本属性
1. BorderStyle 控制窗体边框的类型,它是一个集合类型的属性。
设定值 BiDialog BsSingle 内容 不可改变大小,标准对话框边框 设定值 BsSizeable BsToolWindo w BsSizeToolWi n 内容 可改变大小,标准边框 类似BeSingle
(6) Font属性
Font设置组件上显示文字的字体。
公共属性
(1) Align属性
Align决定了具有该属性的组件在窗体或它的父组件界面上的位置和尺 寸,例如若希望某组件总是填充满上一级组件或窗体,则可将该属性设为 alClient。
(2) Autosize属性
Autosize指定组件是否随其所包容物的大小而调整尺寸,其默认值是 False。 例,单击按钮时,编辑框组件(Edit1)的字体变大,编辑框组件也随 字体增大到相应的尺寸。
3.1 窗体与组件
窗体是程序界面的框架,菜单和组件 置于ቤተ መጻሕፍቲ ባይዱ上。窗体是一种对象,类名是TForm。
窗体对象有属性、方法和事件。可以只设计
一个窗体的界面,也可以设计多个窗体的界
面,甚至可以是多文档窗体。
3.1.1
主窗体与应用窗体
Delphi中,窗体分为两类:主窗体和应用窗体。主窗体是 整个应用程序的核心,程序从主窗体开始运行,一旦主窗体关 闭,应用程序也就结束了。除了主窗体其他都是应用窗体。 一个应用程序只有一个主窗体,它是应用程序的起点, Delphi总是会在程序的开始自动创建主窗体,然后由工程或主 窗体来创建其他的应用窗体。关闭主窗体时,Delphi会先关闭 其他应用窗体,最后关闭主窗体,结束程序。
公共事件
(4) OnMouseDown,OnMouseMove,OnMouseUp事件
电子商务师模拟习题含参考答案
电子商务师模拟习题含参考答案一、单选题(共57题,每题1分,共57分)1.网络稿件传送到栏目编辑等待审核的状态是[ ]。
A、待签发审核B、待编辑审核C、未传稿D、签发退回正确答案:B2.[ ]是连接数据库的通用驱动程序。
A、APIB、ASPC、ADOD、ODB正确答案:D3.字体标记符为[ ]。
A、“”B、“”C、“<a>”D、“<!--…-->”正确答案:A4.评价供应商[ ],要运用价值工程方法。
A、交付B、服务C、质量D、成本正确答案:D5.( )是对系统日志的定期检查、审核,及时发现对系统有安全隐患的记录,监控各种安全事故,维护和管理系统日志。
A、审计制度B、跟踪制度C、保密制度D、人员管理制度正确答案:A6.不属于网页中常见元素的是( )。
A、文字B、视频C、软件D、图片正确答案:C7.店铺动态评分取连续( )个月内所有买家给予评分的算术平均值。
A、6B、12C、2D、1正确答案:A8.在信息发布工作流程中,[ ]负责筛选并上传每个子栏目收集的相关内容。
A、信息发布员B、栏目负责人C、内容总监D、团队负责人正确答案:B9.下列关于勤劳节俭的论述中,正确的选项是( )A、勤劳节俭才能致富B、勤劳节俭有利于企业增产增效C、勤劳节俭只能开源节流,无法创造效益D、勤劳节俭是人生美德,但是阻碍了企业可持续发展正确答案:B10.在商务网站内容管理系统管理角色中,可以在源稿件库中撰写、导入、编辑稿件的是[ ]。
A、签发编辑B、系统管理员C、栏目编辑D、记者编辑正确答案:D11.[ ]即生产商和销售商共同制订生产预测。
A、协同供应B、协同市场C、协同规划D、协同开发正确答案:C12.依据电子采购合同当事人之间的关系,分为B-C合同、B-B合同和[ ]合同。
A、C-CB、C-BC、B-GD、G-B正确答案:C13.我国社会主义道德建设的原则是( )A、合理利己主义B、集体主义C、功利主义D、人道主义正确答案:B14.[ ]用于编辑有序列表。
delphi对res的操作
4。存取资源文件中的AVI
在工程中添加一TAnimate控件(在Win32控件面板上),在需要的地方加入:
procedure TfrMain.LoadIconClick(Sender: TObject);
begin
Animate1.ResName :='MyAvi' ; //资源标识
7。其他资源的调用:
可以把资源文件中的源文件分离出来,建立一个临时的物理文件存在于应用程序路径下,然后可以用相应类型的组件来或方法来使用该文件。当程序退出时再不忘把该临时文件删除掉。
例如:
var
tmpDirectory : string;
myres : TResourceStream;
1.首先创建一个.Rc的纯文本文件。格式如下:
资源标识符 关键字 资源文件名
格式说明:
① 资源标识符:程序中调用资源时的特定标号;
② 关键字:标识资源文件类型;例如:
Wave : 资源文件是声音文件;
RCDATA: JPEG文件;
注意转换前需要把Sample.RC文件中指定的未带全路径名的文件Copy进当前目录C:\Program Files\Borland\Delphi7\Bin中来,才可保证转成.RES文件不出错。如果转换过程没有报错,则成功。
三、引用资源文件
把上一步骤生成的资源文件Sample.RES放到要建立的工程的同一个目录中来。
CD\ //退回根目录
CD\Program Files\Borland\Delphi7\Bin //进入BRCC32.EXE的所在目录
Brcc32 Sample.Rc //把Sample.RC转换成资源文件Sample.RES
delphi中的按键说明
Delphi中一些常用的组合键值CTRL+A:#1 CTRL+B:#2 CTRL+C:#3 CTRL+D:#4 CTRL+E:#5 CTRL+F:#6 CTRL+G:#7CTRL+H:#8 CTRL+I:#9 CTRL+J:#10 CTRL+K:#11 CTRL+L:#12 CR:#13 CTRL+N:#14CTRL+O:#15 CTRL+P:#16 CTRL+Q:#17 CTRL+R:#18 CTRL+S:#19 CTRL+T:#20CTRL+U:#21 CTRL+V:#22 CTRL+W:#23 CTRL+X:#24 CTRL+Y:#25 CTRL+Z:#26 ESC:#27CTRL+:#28 CTRL+]:#29 SHIFT+CTRL+-:#30 DEL:#127一般用在keydown、keyup、keypress事件中。
OnKeyDown和OnKeyUp事件中的Key是Word型的,表示用户按的是键盘上的哪个键,OnKeyPress中的Key是Char型,表示用户输入什么字符。
一个产生8位(char)常规健值,一个产生16位(word)功能健健值。
1.KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜单键}、{开始键}和方向键外的ANSI字符,KeyDown和KeyUp 通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键)2.KeyPress 只能捕获单个字符KeyDown 和KeyUp 可以捕获组合键。
3.KeyPress 可以捕获单个字符的大小写4.KeyDown和KeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。
操作 Wave 文件_Delphi
/del/category/123296.html操作 Wave 文件(1): 关于 Wave 文件的基础知识与文件格式最近准备学习 DirectSound、DirectMusic、DirectShow, 但刚一接触就碰到了关于 Wave 文件的诸多问题, 只好先回头学学 Wave 文件. Wave 文件的基础知识经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.44100HZ 16bit stereo : 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);22050HZ 8bit mono : 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道;当然也可以有 16bit 的单声道或 8bit 的立体声, 等等.人对频率的识别范围是 20HZ - 20000HZ, 如果每秒钟能对声音做 20000 个采样, 回放时就足可以满足人耳的需求. 所以 22050 的采样频率是常用的, 44100 已是 CD 音质, 超过 48000 的采样对人耳已经没有意义. 这和电影的每秒 24 帧图片的道理差不多.每个采样数据记录的是振幅, 采样精度取决于储存空间的大小:1 字节(也就是8bit) 只能记录 256 个数, 也就是只能对振幅做 256 种识别;2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;4 字节(也就是32bit) 能把振幅细化到 4294967296 种可能性, 实在是没必要了.如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍.这样我们就可以根据一个 wav 文件的大小、采样频率和采样大小估算出一个 wav 文件的长度; 譬如 "Windows XP 启动.wav" 的文件长度是 424,644 字节, 它是 "22050HZ / 16bit / 立体声" 格式(这可以从其"属性->摘要" 里看到).它的每秒的传输速率是 22050*16*2 = 705600(bit), 换算成字节是 705600/8 = 88200(字节);424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒).这还不够精确, 在标准的 PCM 格式的 WAVE 文件中还有 44 个字节是采样数据之外的内容, 应该去掉:(424644-44) / (22050*16*2/8) ≈ 4.8140589(秒). 这比较精确了.关于声音文件还有一个概念: "位速", 也有叫做比特率、取样率, 譬如上面文件的位速是 705.6kbps 或 705600bps, 其中的 b 是 bit, ps 是每秒的意思; 压缩的音频文件常常用位速来表示, 譬如达到 CD 音质的 mp3 是: 128kbps / 44100HZ.Wave 文件的文件格式微软的多媒体文件(wav、avi、tif 等)都有一个 RIFF 头, Wave 文件基本是这个样子:RIFF 头fmt 子块data 子块Wave 文件的编码方式有好多, 最常用最简单的就是 PCM 编码.其他编码会包含更多的"块", 但至少会包含上面的块, PCM 编码只包含上面的块.下面是 PCM 编码的祥表:ckid 4"RIFF" 标识 cksize 4 文件大小; 这个大小不包括 ckid 和 cksize 本身, 下面的子块大小也是这样RIFF 头 fccType 4 类型, 这里是 "WAVE" 标识ckid 4 "fmt " 标识cksize 4 块大小; 对 PCM 编码这里是 16, 其他编码也不小于 16 wFormatTag 2 编码格式; 1 表示是 PCM 编码 nChannels 2 声道数; 1 是单声道、2 是立体声nSamplesPerSec 4 采样频率(每秒的样本数); 譬如 44100nAvgBytesPerSec 4 传输速率 = 采样频率 * 每次采样大小, 单位是字节nBlockAlign 2每次采样的大小 = 采样精度 * 声道数 / 8(因单位是字节所以要/8);这也是字节对齐的最小单位, 譬如 16bit 立体声在这里的值是 4 字节 24 fmt 子块 wBitsPerSample 2 采样精度; 譬如 16bit 在这里的值就是 16 ckid 4 "data" 标识cksize 4 块大小?data 子块 采样数据? 双声道数据排列: 左右左右...; 8bit: 0-255, 16bit: -32768-32767其他编码可能会包含的块有: 事实块(Fact)、提示块(Cue)、标签块(Label)、注释块(Note)、标签文本块(Labeled Text)、采样器块(Sampl er)、乐器块(Instrument)、列表块(List)等等, 如果有 List 块, 它还会包含更多子块.接下来要存取、播放、录制, 说来容易, 操作起来都挺麻烦.操作 Wave 文件(2): 判断一个文件是否是 Wave 文件Wave 文件的前 12 个字节可以这样描述: TRiff = recordckId : DWORD; {'RIFF'}ckSize : DWORD; {文件大小, 不包括前 8 个字节} fccType : DWORD; {'WAVE'} end ;我们读出文件的前 12 个字节进行判断, 就基本可以确认它是不是 Wave 文件.uses MMSystem, IOUtils; {这里准备用 IOUtils.TFile.OpenRead 方便地建立文件流}procedure TForm1.FormCreate(Sender: TObject); varriff: record ckId, ckSize, fccType: DWORD; end ; {可以同时定义结构并声明结构变量} beginwith TFile.OpenRead('C:\WINDOWS\Media\Windows XP 启动.wav') do beginRead(riff, SizeOf(riff)); Free;end;if (riff.ckId = FOURCC_RIFF) and (riff.fccType = mmioStringToFOURCC('WAVE',0)) thenShowMessageFmt('这是个 Wave 文件, 其大小是 %d 字节', [riff.ckSize + 8]);end;还是把它写成一个函数吧, 最好也别再引用 MMSystem 单元.{如果是 Wave 文件则返回文件大小, 不是则返回 0}function IsWave(FilePath: string): Integer;function mmioFOURCC(Chr0,Chr1,Chr2,Chr3: AnsiChar): DWORD;beginResult := DWORD(Chr0) + DWORD(Chr1) shl8 + DWORD(Chr2) shl16 + DWORD(Chr3) shl24; end;varriff: record ckId, ckSize, fccType: DWORD; end;beginResult := 0;with TFileStream.Create(FilePath, fmOpenRead) do beginRead(riff, SizeOf(riff));Free;end;if (riff.ckId = mmioFOURCC('R', 'I', 'F', 'F')) and(riff.fccType = mmioFOURCC('W', 'A', 'V', 'E')) thenResult := riff.ckSize + 8;end;依次道理, 也可以判断一个 RIFF 文件具体是什么格式.{返回 RIFF 文件格式的函数, 如果不是 RIFF 文件, 则返回 'noneRIFF'}function GetRiffType(FilePath: string): String;function mmioFOURCC(Chr0,Chr1,Chr2,Chr3: AnsiChar): DWORD;beginResult := DWORD(Chr0) + DWORD(Chr1) shl8 + DWORD(Chr2) shl16 + DWORD(Chr3) shl24; end;varriff: record ckId, ckSize, fccType: DWORD; end;typeTChars = array[0..3] of AnsiChar; {用于类型转换}beginResult := 'noneRIFF';with TFileStream.Create(FilePath, fmOpenRead) do beginRead(riff, SizeOf(riff));Free;end;if (riff.ckId = mmioFOURCC('R', 'I', 'F', 'F')) then Result := TChars(riff.fccType); end;//测试:beginShowMessage(GetRiffType('C:\WINDOWS\Media\Windows XP 启动.wav')); {WAVE}ShowMessage(GetRiffType('C:\WINDOWS\clock.avi')); {AVI }ShowMessage(GetRiffType('C:\WINDOWS\notepad.exe')); {noneRIFF}end;操作 Wave 文件(3): 接触 mmio 系列函数mmio 系列函数用于 Wave 等多媒体文件的 I/O 操作, 相关函数有:mmioOpenmmioClosemmioReadmmioWritemmioFlushmmioSeekmmioRenamemmioGetInfommioSetInfommioCreateChunkmmioAscendmmioDescendmmioAdvancemmioSetBuffermmioStringToFOURCCmmioSendMessagemmioInstallIOProcmmio 系列函数比一般的 I/O 函数更适合操作 RIFF 格式的多媒体文件, 主要是能更方便地操作 RIFF 的文件块, 官方还说它们更优化.和其他 I/O 函数一样, 它们也是要 Open 获取句柄, 然后读写, 最后关闭; 但它们文件句柄和其他 I/O 函数的句柄并不兼容, 不过部分函数(上面前 7 个)也可以用于一般文件的操作.就先操作个一般文件吧.uses MMSystem;procedure TForm1.FormCreate(Sender: TObject);constFilePath = 'C:\Temp\mm.txt';varhFile: HMMIO;str: RawByteString;beginhFile := mmioOpen(PChar(FilePath), {要打开的文件}nil, {接受 TMMIOInfo 结构信息的指针, 暂时没用到}MMIO_CREATE or MMIO_READWRITE {打开选项; 这是建立并以读写权限打开});mmioWrite(hFile, 'Delphi', 6); {写入 6 个字符}mmioSeek(hFile, 0, SEEK_SET); {把读写指针移动到文件头}SetLength(str, 6);mmioRead(hFile, PAnsiChar(str), 6); {读出 6 个字符}ShowMessage(str); {Delphi}mmioClose(hFile, 0); {关闭文件; 第二个参数还可以是 MMIO_FHOPEN, 另有它用}{最后再删除这个文件, 既然已删除就无需 Close 了}mmioOpen(PChar(FilePath), nil, MMIO_DELETE);end;操作 Wave 文件(4): 获取 Wave 文件主块与子块的信息有两个相关的结构体: TMMIOInfo、TMMCKInfo.TMMIOInfo 是多媒体文件打开后的状态信息, mmioOpen 函数的第二个参数就是这个结构的指针.现在先用到了 TMMCKInfo, 这是文件内部"块" 的信息, 构成如下:TMMCKInfo = recordckid: FOURCC; {块标识}cksize: DWORD; {块大小}fccType: FOURCC; {格式类型标识}dwDataOffset: DWORD; {偏移地址}dwFlags: DWORD; {附加信息}end;查找"块" 需要通过 mmioDescend、mmioAscend 两个函数.mmioAscend 是从子块跳出;mmioDescend 是进入到子块; 进入子块是需要指定子块的 ckid 和父块信息;mmioDescend 也用来查找主块(RIFF), 此时需要很少的信息就可以找到主块.测试代码:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;const FilePath = 'C:\WINDOWS\Media\Windows XP 启动.wav';//获取 RIFF 块的信息procedure TForm1.Button1Click(Sender: TObject);varhFile: HMMIO;ckiRIFF: TMMCKInfo;begin//清空 ckiRIFF 结构体; 有些函数使用前要求必须清空, 即使不要求也还是清空的好.FillChar(ckiRIFF, SizeOf(TMMCKInfo), 0); {局部变量在清空前有垃圾数据}//打开文件, 获取句柄hFile := mmioOpen(PChar(FilePath), nil, MMIO_READ);//获取 RIFF 块的信息mmioDescend(hFile, {文件句柄}@ckiRIFF, {块信息结构的指针, 用于获取块的信息}nil, {这父块的结构信息, RIFF 没有父块, 无需指定}MMIO_FINDRIFF {如果是查询子块这里的标志是 MMIO_FINDCHUNK}); {返回 0 表示查找成功, 这里忽略了验证}//以下是查证获取到的信息ShowMessageFmt('%d, %d, %d, %d, %d', [ckiRIFF.ckid, ckiRIFF.cksize, ckiRIFF.fccType, ckiRIFF.dwDataOffset, ckiRIFF.dwFlags ]); {1179011410, 424636, 1163280727, 8, 0}if ckiRIFF.ckid = FOURCC_RIFF then ShowMessage('是 RIFF');if ckiRIFF.fccType = mmioStringToFOURCC('WAVE',0) then ShowMessage('是 WAVE');//关闭mmioClose(hFile, 0);end;//获取子块的信息procedure TForm1.Button2Click(Sender: TObject);varhFile: HMMIO;ckiRIFF,ckiSub: TMMCKInfo;n: Integer;begin//清空准备接受信息的结构FillChar(ckiRIFF, SizeOf(TMMCKInfo), 0);FillChar(ckiSub, SizeOf(TMMCKInfo), 0);hFile := mmioOpen(PChar(FilePath), nil, MMIO_READ);//先获取主块(RIFF)信息mmioDescend(hFile, @ckiRIFF, nil, MMIO_FINDRIFF);//获取 fmt 子块信息ckiSub.ckid := mmioStringToFOURCC('fmt', 0);if mmioDescend(hFile, @ckiSub, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR then beginShowMessageFmt('%d, %d, %d, %d, %d', [ckiSub.ckid, ckiSub.cksize, ckiSub.fccType, ckiSub.dwDataOffset, ckiSub.dwFlags]);end;//如果继续查找需要跳出子块; 下面将从偏移地址 20 跳到 36 处mmioAscend(hFile, @ckiSub, 0); {其第三个参数一直是 0, 是备用参数}//获取 data 子块信息ckiSub.ckid := mmioStringToFOURCC('data', 0);if mmioDescend(hFile, @ckiSub, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR then beginShowMessageFmt('%d, %d, %d, %d, %d', [ckiSub.ckid, ckiSub.cksize, ckiSub.fccType, ckiSub.dwDataOffset, ckiSub.dwFlags]);end;mmioClose(hFile, 0);end;end.操作 Wave 文件(5): 获取 Wave 文件的格式信息装载格式信息的结构有:TWaveFormat = packed recordwFormatTag: Word;nChannels: Word;nSamplesPerSec: DWORD;nAvgBytesPerSec: DWORD;nBlockAlign: Word;end;TPCMWaveFormat = recordwf: TWaveFormat;wBitsPerSample: Word;end;TWaveFormatEx = packed recordwFormatTag: Word; {格式类型; 主要使用的是 WAVE_FORMAT_PCM}nChannels: Word; {声道数; 1 是单声道、2 是立体声}nSamplesPerSec: DWORD; {采样频率}nAvgBytesPerSec: DWORD; {传输速率}nBlockAlign: Word; {每次采样的大小}wBitsPerSample: Word; {采样精度}cbSize: Word; {附加数据的大小; PCM 编码的文件没这个字段}end;能看出它们是依次递增一个字段, 并且也是 Wave 文件的一个构成部分; 现在要做的就是从 Wave 文件中把它们取出来. 获取函数及测试代码:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo;Button1: TButton;procedure Button1Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;//获取 Wave 中格式数据的函数; 常用的是 TWaveFormatEx, 但 PCM 缺它一个字段function GetWaveFmt(FilePath: string; var fmt: TWaveFormatEx): Boolean;varhFile: HMMIO;ckiRIFF,ckiFmt: TMMCKInfo;beginResult := False;hFile := mmioOpen(PChar(FilePath), nil, MMIO_READ);if hFile = 0then Exit;ZeroMemory(@ckiRIFF, SizeOf(TMMCKInfo));ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));ZeroMemory(@fmt, SizeOf(TWaveFormatEx)); {也先清空准备接受数据的结构体}ckiFmt.ckid := mmioStringToFOURCC('fmt', 0); {给查找格式块准备}//先获取主块的信息mmioDescend(hFile, @ckiRIFF, nil, MMIO_FINDRIFF);//再获取 fmt 块的信息后, 指针将自动指向格式数据起点; 然后读出格式数据if (ckiRIFF.ckid = FOURCC_RIFF) and(ckiRIFF.fccType = mmioStringToFOURCC('WAVE',0)) and(mmioDescend(hFile, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then Result := (mmioRead(hFile, @fmt, ckiFmt.cksize) = ckiFmt.cksize);end;//调用测试procedure TForm1.Button1Click(Sender: TObject);constFilePath = 'C:\WINDOWS\Media\Windows XP 启动.wav';varWaveFormat: TWaveFormatEx;beginif GetWaveFmt(FilePath, WaveFormat) then with Memo1.Lines dobeginClear;Add(Format('wFormatTag: %d', [WaveFormat.wFormatTag]));Add(Format('nChannels: %d', [WaveFormat.nChannels]));Add(Format('nSamplesPerSec: %d', [WaveFormat.nSamplesPerSec]));Add(Format('nAvgBytesPerSec: %d', [WaveFormat.nAvgBytesPerSec]));Add(Format('nBlockAlign: %d', [WaveFormat.nBlockAlign]));Add(Format('wBitsPerSample: %d', [WaveFormat.wBitsPerSample]));Add(Format('cbSize: %d', [WaveFormat.cbSize]));end;{ 显示结果:wFormatTag: 1nChannels: 2nSamplesPerSec: 22050nAvgBytesPerSec: 88200nBlockAlign: 4wBitsPerSample: 16cbSize: 0}end;end.操作 Wave 文件(6): 获取 Wave 文件的波形数据读取函数及测试代码:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;function GetWaveData(FilePath: string; var stream: TMemoryStream): Boolean;varhFile: HMMIO;ckiRIFF,ckiData: TMMCKInfo;beginResult := False;hFile := mmioOpen(PChar(FilePath), nil, MMIO_READ);if hFile = 0then Exit;ZeroMemory(@ckiRIFF, SizeOf(TMMCKInfo));ZeroMemory(@ckiData, SizeOf(TMMCKInfo));ckiData.ckid := mmioStringToFOURCC('data', 0);//先获取主块的信息mmioDescend(hFile, @ckiRIFF, nil, MMIO_FINDRIFF);//再获取 data 块的信息后, 指针将自动指向 data 数据的起点; 然后读出数据if (ckiRIFF.ckid = FOURCC_RIFF) and(ckiRIFF.fccType = mmioStringToFOURCC('WAVE',0)) and(mmioDescend(hFile, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then beginstream.Size := ckiData.cksize;Result := (mmioRead(hFile, stream.Memory, ckiData.cksize) = ckiData.cksize);end;mmioClose(hFile, 0);end;//调用测试procedure TForm1.Button1Click(Sender: TObject);constFilePath = 'C:\WINDOWS\Media\Windows XP 启动.wav';varstream: TMemoryStream;beginstream := TMemoryStream.Create;if GetWaveData(FilePath, stream) thenShowMessageFmt('读出的数据大小是: %d', [stream.Size]); {424600}stream.Free;end;end.操作 Wave 文件(7): 建立一个空的 Wave 文件(三种方法)unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;typeTForm1 = class(TForm)procedure FormCreate(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;//chan: 1 单声道、2 立体声;//freq: 频率, 取值: 11025, 22050, 44100//bit : 每个样本的大小, 取值 8、16function CreateWav1(chan, freq, bit: Word; const FilePath: string): Boolean; varh: HMMIO;ckiRiff, ckiFmt, ckiData: TMMCKInfo;fmt: TPCMWaveFormat;begin//此函数是使用 mmioCreateChunk 函数来分别建立 Wave 文件的每个块.{初识化相关结构}ZeroMemory(@ckiRiff, SizeOf(TMMCKInfo));ckiRiff.cksize := 36; {mmioCreateChunk 函数会自动写上 ckid, 但其 cksize 需要手动给}ckiRiff.fccType := mmioStringToFOURCC('WAVE', 0);ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);ZeroMemory(@ckiData, SizeOf(TMMCKInfo));ckiData.ckid := mmioStringToFOURCC('data', 0);{指定 Wave 格式}fmt.wf.wFormatTag := WAVE_FORMAT_PCM;fmt.wf.nChannels := chan;fmt.wf.nSamplesPerSec := freq;fmt.wf.nAvgBytesPerSec := freq * chan * bit div8;fmt.wf.nBlockAlign := chan * bit div8;fmt.wBitsPerSample := bit;h := mmioOpen(PChar(FilePath), nil, MMIO_CREATE or MMIO_WRITE);if h = 0then Exit(False);{分别建立 RIFF、fmt、data 块}if (mmioCreateChunk(h, @ckiRiff, MMIO_CREATERIFF) = MMSYSERR_NOERROR) and(mmioCreateChunk(h, @ckiFmt, 0) = MMSYSERR_NOERROR) and(mmioWrite(h, PAnsiChar(@fmt), SizeOf(TPCMWaveFormat)) = SizeOf(TPCMWaveFormat)) and (mmioAscend(h, @ckiFmt, 0) = MMSYSERR_NOERROR) and(mmioCreateChunk(h, @ckiData, 0) = MMSYSERR_NOERROR) then Result := True;mmioClose(h, 0);end;//把 PCM 编码的 WAVE 文件的前 44 个字节看成一个结构来操作:function CreateWav2(chan, freq, bit: Word; const FilePath: string): Boolean;typeTWaveHeader = recordRiff_ckid : DWORD;Riff_cksize : DWORD;Riff_fccType : DWORD;fmt_ckid : DWORD;fmt_cksize : DWORD;wFormatTag : Word;nChannels : Word;nSamplesPerSec : DWORD;nAvgBytesPerSec: DWORD;nBlockAlign : Word;wBitsPerSample : Word;data_ckid : DWORD;data_cksize : DWORD;end;varwh: TWaveHeader;hFile: Integer;beginwh.Riff_ckid := FOURCC_RIFF;wh.Riff_cksize := 36;wh.Riff_fccType := mmioStringToFOURCC('WAVE', 0);wh.fmt_ckid := mmioStringToFOURCC('fmt', 0);wh.fmt_cksize := 16;wh.wFormatTag := WAVE_FORMAT_PCM;wh.nChannels := chan;wh.nSamplesPerSec := freq;wh.nAvgBytesPerSec := freq * chan * bit div8;wh.nBlockAlign := chan * bit div8;wh.wBitsPerSample := bit;wh.data_ckid := mmioStringToFOURCC('data', 0);wh.data_cksize := 0;hFile := FileCreate(FilePath);Result := (FileWrite(hFile, wh, SizeOf(TWaveHeader)) <> -1);FileClose(hFile);end;//同上, 只是改用流来写文件function CreateWav3(chan, freq, bit: Word; const FilePath: string): Boolean; typeTWaveHeader = recordRiff_ckid : DWORD;Riff_cksize : DWORD;Riff_fccType : DWORD;fmt_ckid : DWORD;fmt_cksize : DWORD;wFormatTag : Word;nChannels : Word;nSamplesPerSec : DWORD;nAvgBytesPerSec: DWORD;nBlockAlign : Word;wBitsPerSample : Word;data_ckid : DWORD;data_cksize : DWORD;end;varwh: TWaveHeader;beginwh.Riff_ckid := FOURCC_RIFF;wh.Riff_cksize := 36;wh.Riff_fccType := mmioStringToFOURCC('WAVE', 0);wh.fmt_ckid := mmioStringToFOURCC('fmt', 0);wh.fmt_cksize := 16;wh.wFormatTag := WAVE_FORMAT_PCM;wh.nChannels := chan;wh.nSamplesPerSec := freq;wh.nAvgBytesPerSec := freq * chan * bit div8;wh.nBlockAlign := chan * bit div8;wh.wBitsPerSample := bit;wh.data_ckid := mmioStringToFOURCC('data', 0);wh.data_cksize := 0;with TFileStream.Create(FilePath, fmCreate) do beginResult := (Write(wh, SizeOf(TWaveHeader)) = SizeOf(TWaveHeader));Free;end;end;procedure TForm1.FormCreate(Sender: TObject);beginCreateWav1(1, 11025, 8, 'C:\Temp\X1.wav');CreateWav2(2, 22050, 16, 'C:\Temp\X2.wav');CreateWav3(2, 44100, 16, 'C:\Temp\X3.wav');end;end.操作 Wave 文件(8): 使用 TMediaPlayer 录制 wav 文件TMediaPlayer 录音是基于一个已存在的 wav 文件, 上次建立空白 wav 的函数可派上用场了.TMediaPlayer 的功能是基于 MCI 的, 都是该淘汰的东西了, 只是简单了解下.接下来还要学习用 waveIn...系列函数录音、用 DirectSound 录音.unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, MPlayer, StdCtrls;typeTForm1 = class(TForm)MediaPlayer1: TMediaPlayer;Button1: TButton;Button2: TButton;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;//建立一个空白 Wave 文件的函数function CreateWav(chan, freq, bit: Word; const FilePath: string): Boolean;varh: HMMIO;ckiRiff, ckiFmt, ckiData: TMMCKInfo;fmt: TPCMWaveFormat;beginZeroMemory(@ckiRiff, SizeOf(TMMCKInfo));ckiRiff.cksize := 36;ckiRiff.fccType := mmioStringToFOURCC('WAVE', 0);ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);ZeroMemory(@ckiData, SizeOf(TMMCKInfo));ckiData.ckid := mmioStringToFOURCC('data', 0);fmt.wf.wFormatTag := WAVE_FORMAT_PCM;fmt.wf.nChannels := chan;fmt.wf.nSamplesPerSec := freq;fmt.wf.nAvgBytesPerSec := freq * chan * bit div8;fmt.wf.nBlockAlign := chan * bit div8;fmt.wBitsPerSample := bit;h := mmioOpen(PChar(FilePath), nil, MMIO_CREATE or MMIO_WRITE);if h = 0then Exit(False);if (mmioCreateChunk(h, @ckiRiff, MMIO_CREATERIFF) = MMSYSERR_NOERROR) and(mmioCreateChunk(h, @ckiFmt, 0) = MMSYSERR_NOERROR) and(mmioWrite(h, PAnsiChar(@fmt), SizeOf(TPCMWaveFormat)) = SizeOf(TPCMWaveFormat)) and (mmioAscend(h, @ckiFmt, 0) = MMSYSERR_NOERROR) and(mmioCreateChunk(h, @ckiData, 0) = MMSYSERR_NOERROR) then Result := True;mmioClose(h, 0);end;//文件路径const path = 'C:\Temp\Test.wav';//开始录音procedure TForm1.Button1Click(Sender: TObject);beginCreateWav(2, 22050, 16, path);MediaPlayer1.FileName := path;MediaPlayer1.Open;MediaPlayer1.StartRecording;Button2.Enabled := True;end;//停止录音并播放procedure TForm1.Button2Click(Sender: TObject);beginMediaPlayer1.Stop;MediaPlayer1.Play;end;procedure TForm1.FormCreate(Sender: TObject);beginMediaPlayer1.Visible := False;Button2.Enabled := FileExists(path);end;end.操作 Wave 文件(9): 使用 waveOut... 函数播放 wav 文件下面是使用低级音频函数播放 wav 的两个方法, 对这个感兴趣的人恐怕很少, 免注释了.使用窗口接受音频输出设备的消息:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);privateprotectedprocedure WndProc(var Message: TMessage); override;publicend;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;//获取文件格式和波形数据的函数function GetWaveFmtData(path: string; var fmt: TWaveFormatEx; var buf: TBytes): Boolean; varhFile: HMMIO;ckiRIFF,ckiFmt,ckiData: TMMCKInfo;beginResult := False;hFile := mmioOpen(PChar(path), nil, MMIO_READ);if hFile = 0then Exit;ZeroMemory(@ckiRIFF, SizeOf(TMMCKInfo));ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));ZeroMemory(@ckiData, SizeOf(TMMCKInfo));ckiRIFF.fccType := mmioStringToFOURCC('WAVE', 0);ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);ckiData.ckid := mmioStringToFOURCC('data', 0);ZeroMemory(@fmt, SizeOf(TWaveFormatEx));mmioDescend(hFile, @ckiRIFF, nil, MMIO_FINDRIFF);if (ckiRIFF.ckid = FOURCC_RIFF) and (ckiRIFF.fccType = mmioStringToFOURCC('WAVE',0)) and (mmioDescend(hFile, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) and(mmioRead(hFile, @fmt, ckiFmt.cksize) = ckiFmt.cksize) and(mmioAscend(hFile, @ckiFmt, 0) = MMSYSERR_NOERROR) and(mmioDescend(hFile, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) thenbeginSetLength(buf, ckiData.cksize);Result := (mmioRead(hFile, PAnsiChar(buf), ckiData.cksize) = ckiData.cksize);end;mmioClose(hFile, 0);end;//------------------------------------------------------------------------------varwh: TWaveHdr;hOut: HWAVEOUT;fmt: TWaveFormatEx;buf: TBytes;procedure TForm1.Button1Click(Sender: TObject);constpath = 'C:\WINDOWS\Media\Windows XP 启动.wav';beginGetWaveFmtData(path, fmt, buf);wh.lpData := PAnsiChar(buf);wh.dwBufferLength := Length(buf);wh.dwBytesRecorded := 0;wh.dwUser := 0;wh.dwFlags := 0;wh.dwLoops := 1;wh.lpNext := nil;wh.reserved := 0;waveOutOpen(@hOut, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW);waveOutPrepareHeader(hOut, @wh, SizeOf(TWaveHdr));waveOutWrite(hOut, @wh, SizeOf(TWaveHdr));end;procedure TForm1.WndProc(var Message: TMessage);begininherited;case Message.Msg ofMM_WOM_OPEN: ;MM_WOM_CLOSE: ;MM_WOM_DONE: beginwaveOutUnprepareHeader(hOut, @wh, SizeOf(TWaveHdr));waveOutClose(hOut);end;end;end;end.使用回调函数:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Button3: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;function GetWaveFmtData(path: string; var fmt: TWaveFormatEx; var buf: TBytes): Boolean; varhFile: HMMIO;ckiRIFF,ckiFmt,ckiData: TMMCKInfo;beginResult := False;hFile := mmioOpen(PChar(path), nil, MMIO_READ);if hFile = 0then Exit;ZeroMemory(@ckiRIFF, SizeOf(TMMCKInfo));ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));ZeroMemory(@ckiData, SizeOf(TMMCKInfo));ckiRIFF.fccType := mmioStringToFOURCC('WAVE', 0);ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);ckiData.ckid := mmioStringToFOURCC('data', 0);ZeroMemory(@fmt, SizeOf(TWaveFormatEx));mmioDescend(hFile, @ckiRIFF, nil, MMIO_FINDRIFF);if (ckiRIFF.ckid = FOURCC_RIFF) and (ckiRIFF.fccType = mmioStringToFOURCC('WAVE',0)) and (mmioDescend(hFile, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) and(mmioRead(hFile, @fmt, ckiFmt.cksize) = ckiFmt.cksize) and(mmioAscend(hFile, @ckiFmt, 0) = MMSYSERR_NOERROR) and(mmioDescend(hFile, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) thenbeginSetLength(buf, ckiData.cksize);Result := (mmioRead(hFile, PAnsiChar(buf), ckiData.cksize) = ckiData.cksize);end;mmioClose(hFile, 0);end;//------------------------------------------------------------------------------varwh: TWaveHdr;hOut: HWAVEOUT;fmt: TWaveFormatEx;buf: TBytes;procedure WaveProc(hWave: HWAVE; uMsg, dwInstance, dwParam1, dwParam2: DWORD); stdcall; begincase uMsg ofMM_WOM_OPEN: ;MM_WOM_CLOSE: ;MM_WOM_DONE: beginwaveOutUnprepareHeader(hWave, PWaveHdr(dwParam1), SizeOf(TWaveHdr));waveOutClose(hWave);end;end;end;procedure TForm1.Button1Click(Sender: TObject);constpath = 'C:\WINDOWS\Media\Windows XP 启动.wav';beginGetWaveFmtData(path, fmt, buf);wh.lpData := PAnsiChar(buf);wh.dwBufferLength := Length(buf);wh.dwBytesRecorded := 0;wh.dwUser := 0;wh.dwFlags := 0;wh.dwLoops := 1;wh.lpNext := nil;wh.reserved := 0;waveOutOpen(@hOut, WAVE_MAPPER, @fmt, DWORD(@WaveProc), 0, CALLBACK_FUNCTION); waveOutPrepareHeader(hOut, @wh, SizeOf(TWaveHdr));waveOutWrite(hOut, @wh, SizeOf(TWaveHdr));end;//暂停procedure TForm1.Button2Click(Sender: TObject);beginwaveOutPause(hOut);end;//继续procedure TForm1.Button3Click(Sender: TObject);beginwaveOutRestart(hOut);end;end.操作 Wave 文件(10): 输入输出设备与格式支持unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)ListBox1: TListBox;ListBox2: TListBox;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;//设备列表; 指定设备时经常使用 WAVE_MAPPER 参数, 这样会自动选用合适的设备. procedure TForm1.Button1Click(Sender: TObject);vari: Integer;waveOutCaps: TWaveOutCaps;waveInCaps: TWaveInCaps;beginListBox1.Items.Add('音频输出设备列表:');for i := 0to waveOutGetNumDevs dobeginZeroMemory(@waveOutCaps, SizeOf(TWaveOutCaps));waveOutGetDevCaps(i, @waveOutCaps, SizeOf(TWaveOutCaps));ListBox1.Items.Add(waveOutCaps.szPname);end;ListBox2.Items.Add('音频输入设备列表:');for i := 0to waveInGetNumDevs dobeginZeroMemory(@waveInCaps, SizeOf(TWaveInCaps));waveOutGetDevCaps(i, @waveInCaps, SizeOf(TWaveInCaps));ListBox2.Items.Add(waveInCaps.szPname);end;end;//判断是否支持指定的 Wave 格式procedure TForm1.Button2Click(Sender: TObject);varfmt: TPCMWaveFormat;beginfmt.wf.wFormatTag := WAVE_FORMAT_PCM;fmt.wf.nAvgBytesPerSec := 88200;fmt.wf.nBlockAlign := 4;fmt.wBitsPerSample := 16;if waveOutOpen(nil, 0, PWaveFormatEx(@fmt), 0, 0, WAVE_FORMAT_QUERY) = 0thenShowMessage('第一个输出设备支持此格式');if waveInOpen(nil, 0, PWaveFormatEx(@fmt), 0, 0, WAVE_FORMAT_QUERY) = 0thenShowMessage('第一个输入设备支持此格式');end;end.有把格式支持的判断写成函数的, 如:function IsFormatSupported(fmt: Pointer; DeviceId: DWORD): Boolean;beginResult := (waveOutOpen(nil, DeviceId, PWaveFormatEx(fmt), 0, 0, WAVE_FORMAT_QUERY) = 0); end;操作 Wave 文件(11): 使用 waveIn...函数录制 wav 文件使用窗口接受音频设备发出的消息:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Button3: TButton;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);protectedprocedure WndProc(var m: TMessage); override;end;varForm1: TForm1;{$R *.dfm}uses MMSystem;varwhIn1,whIn2, whOut: TWaveHdr;hWaveIn,hWaveOut: HWAVE;fmt: TWaveFormatEx;buf1,buf2,SaveBuf: TBytes;procedure TForm1.FormCreate(Sender: TObject);beginButton1.Caption := '开始录音';Button2.Caption := '停止录音';Button3.Caption := '播放录音';end;//开始录音procedure TForm1.Button1Click(Sender: TObject);begin{指定要录制的格式}fmt.wFormatTag := WAVE_FORMAT_PCM;fmt.nChannels := 2;fmt.nSamplesPerSec := 22050;fmt.nAvgBytesPerSec := 88200;fmt.nBlockAlign := 4;fmt.wBitsPerSample := 16;fmt.cbSize := 0;SaveBuf := nil; {清除已录制的内容}if waveInOpen(@hWaveIn, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW) = 0then beginSetLength(buf1, 1024*8);SetLength(buf2, 1024*8);whIn1.lpData := PAnsiChar(buf1);whIn1.dwBufferLength := Length(buf1);whIn1.dwBytesRecorded := 0;whIn1.dwUser := 0;whIn1.dwFlags := 0;whIn1.dwLoops := 0;whIn1.lpNext := nil;whIn1.reserved := 0;whIn2.lpData := PAnsiChar(buf2);whIn2.dwBufferLength := Length(buf2);whIn2.dwBytesRecorded := 0;whIn2.dwUser := 0;。
Delphi7的开发调试技巧及快捷键.
(转 Delphi7的开发调试技巧及快捷键Delphi 开发的调试技巧1、设置调试选项Delphi 主菜单。
【 Project 】 ->【 Options 】 , 或单击工程管理器中的【 Project Options 】按钮。
显示 Project Options,选择 Complier<1>选中 Debug Information :把调试信息嵌入到 DCU 单元文件,会加大编译后的DCU 文件,但不会影响最后生成的 exe 的大小和执行速度。
同时激活【 Search 】菜单中的【 Find Error 】命令。
当文件中包含调试信息并得到一个运行时错误 (run-time error, 记录下 Delphi 提供的 16进制地址,在【 Search 】->【 Find Error 】中输入, Delphi 将重新编译程序,并停留在产生错误的命令行。
<2>Local symbols:决定调试器能否看到在 Implementation 中定义的局部变量。
<3>Reference infoj选项 /Definition Only选项是否产生应用程序中对象标识符的引用信息。
信息和对象代码存在 dcu 文件中, 可以使用对象浏览器查看。
如果 Definition Only 选项同时选中,编译器将生成标识符定义位置的信息,能够激活对象浏览器的 Refenrence 页。
如果不选, Dcu 文件更小。
编辑器命令{$D} Debug Information{$L} Local Information{$Y} Symbol Information{$C} Assertions2、使用内部调试器<1> 命令行参数在【 Run 】->【 Parameters 】中设置<2>断点条件断点使源代码断点只有在满足某个条件时才有效。
在【 View 】->[Debug windows]->【 BreakPoints 】打开“BreakPoint List”对话框, 右击断点,从弹出菜单中选择属性。
Delphi教程(完整版)
◆Delphi 3对其组件库进行增强 ,完全支持 ActiveX组件及其创建 。
◆Delphi 4提供了Object Pascal语言的扩展 ,但 系统稳定性较差 。
◆1999年推出Delphi 5增强了数据库的功能
◆2001年6月推出Delphi 6 ,增加了大量的新 组件,使组件数目达350多个,以满足网络开 发的需要。
Delphi教程(完整版)
3.对象观察器 利用对象观察器,可以修改窗体或组件的
属性,或者使它们能够响应不同的事件 。
属性(Property)是一些数据,如高度、颜色、 字体等,它们决定了组件在屏幕上的外观。 事件(Event)则是一种消息处理机制,它能够 捕捉某种情况的发生并做出反应,像鼠标单 击和窗口打开就是两种典型的事件。
Delphi教程
Delphi教程(完整版)
课程介绍
▪ Delphi是著名的Borland公司开发的可 视化软件开发环境,自1995年问世以 来,带来了程序设计中的一场重大变 化。Delphi作为第四代编程语言,具 有简单、高效和功能强大等特点,这 些特点使得它为广大程序开发者所青 睐。
Delphi教程(完整版)
第1章 Delphi基础知识
1.1 Delphi简介
Delphi作为一种可视化的编程环境,经 历了7代产品的发展历程: ◆ Borland公司在1995年推出了基于 Windows平台的Delphi 1。 ◆ Delphi 2新增加的主要功能是对32位编 程的支持。还增加了如数据模块等多种高 效的数据重用功能。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, DFelophri教m程s(完,整D版i)alogs;
DelphiX
DelphiXDelphiX是对DirectX接口的封装,它将DirectX接口封装成Delphi组件,便于Delphi 下的使用。
它由12个可视组件组成,有针对Delphi3.0、4.0、5.0、7.0版的支持。
它是由Hiroyuki Hori编写的。
DelphiX支持DirectX的所有技术(DirectDraw, Direct3D, DirectPlay, DirectInput等等……),使Delphi能编写出高质量的图像显示程序。
这些组件是:TDXDraw - DirectDraw surface for graphic outputTDXDIB - DIB-ImageTDXImageList - Imagelist of DIB-ImagesTDX3D - Direct3D support for TDXDraw surfaceTDXSound - DirectSound supportTDXWave - Soundfile-component for DirectSoundTDXWaveList - Soundfile-listTDXInput - DirectInput, controller supportTDXPlay - DirectPlay, for multiplayer network gamesTDXSpriteEngine - Spriteengine for DirectDraw-surfaceTDXTimer - High-performance TimerTDXPaintBox - Like TPaintbox but fasterDelphiX 是用Delphi 编写游戏的最好帮手!!DelphiX教程系列 1 - 使用键盘和摇杆用到的组件(TDXInput、TTimer):原文链接:/tutorials/dxtut1.htm在这一教程里,我们将会学习如何使用键盘来移动我们的角色(在DelphiX的组件的帮助下)。
delphi-MediaPlayer组件常用属性方法
MediaPlayer组件常用属性MediaPlayer组件位于组件板的System页中,其功能比Animate组件强大,不仅可以播放A VI文件,还可以通过MCI(Media Control Interface,媒体控制接口)播放多种多媒体文件,如各种AVI文件、W A V、MIDI、CD音乐文件和DA T文件等。
MediaPlayer组件具有一组执行MCI命令的下压式按钮。
这些命令与通常的cD机、录像机上的按钮很相似。
从左到右,这些按钮的功能依次是Play(播放)、Pause(暂停)、Stop(停止)、Next(下一个)、Prev(上一个)、Step(向前步进)、Back(向后步进)、Record(开始录制)和Eject(退出)。
(1)AutoEnable属性当属性值为True时,媒体播放器在运行过程中能够自动控制哪些按钮当前可用,哪些按钮当前不可用(以灰色显示)。
判断的依据是Mode特性返回的设备状态以及I)eviceType特性设置的设备类型。
如果没有打开文件,所有按钮都无效。
当属性值为False时,媒体播放器不能自动控制哪些按钮是当前可用的,哪些按钮是当前不能用的。
每个按钮是否允许或禁止操作需要设置EnableButtons属性。
(2)AutoRewind属性该属性用于设置是否具有自动返回功能。
若属性值设为True,则当需要播放或录制时将自动返回到媒体文件头部;当多媒体文件播放完毕后,也会自动返回到媒体文件头部。
如果该属性设为False,只有当用户按下Prey或在程序中调用了Previous方法后才能返回到媒体文件头部。
(3)ColoredButton属性该属性是TButtonSet集合类型,用于设置哪些按钮用彩色显示,哪些按钮用黑白显示,缺省时全部按钮均用彩色显示。
(4)DeviceType属性该属性是TMPDeviceType类型,用于指定设备类型。
该属性的缺省值是dtAutoSelect,此时根据FileName属性指定的媒体文件的扩展名来判断设备类型,每种扩展名对应着一种设备类型。
DELPHI常见属性说明【二】
DELPHI常见属性说明【⼆】常⽤DELPHI控件属性设置说明⽬录TForm ClassTPanel组件TToolBar ClassTToolButton ClassTTimer ClassTADOConnection ClassTADOQuery ClassTADODataSet ClassTDBGrid ClassTADOStoredProc ClassTButton ClassTBitBtn ClassTComboBox ClassTStaticText ClassTLabel ClassTEdit ClassTGroupBox ClassTRadioGroup ClassTListbox ClassTTreeView ClassTDataModule ClassVC++使⽤串⼝I. Open 16II. ConfigurationIII. ReadIV. WriteV. CloseConclusionLicenseTForm ClassTForm代表⼀个标准的应⽤程序窗⼝。
在设计阶段,当你在窗体设计器内创建窗体时,他们作为窗体类的⼦节点被执⾏。
窗体能代表应⽤程序的主窗⼝,或者对话框,或MDI的children。
⼀个窗体能包含其它对象,如TButton, TCheckBox和TComboBox对象等。
ArrangeIcons:安排最⼩化MDI⼦窗体的图标;Cascade:排列MDI⼦窗体,使他们重叠;Next:激活在窗体队列中的下⼀个⼦窗体;Previous:激活在窗体队列中的前⼀个MDI⼦窗体;Title:排列MDI⼦窗体,使他们都是⼀样的⼤⼩。
Action:指定与控件有关的活动;ActiveControl:指定以窗体为焦点的控件;Align:控件如何停靠在容器(⽗控件)中;AlphaBlend:指定窗体是否透明;AlphaBlendValue:指定⼀个透明窗体的半透明度;Anchors:指定控件如何固定到其⽗控件上;AutoScroll:如果窗⼝不⾜以显⽰它内部的所有控件时,滚动条是否⾃动显⽰在滚动窗⼝控件中;AutoSize:指定控件是否⾃动调节其⼤⼩去容纳⾃⾝内容;BiDiMode:指定控件的双向风格;BorderIcons:指定显⽰在窗体标题栏的图标;BorderStyle:指定窗体边框的外表和⾏为;BorderWidth:指定控件边框的宽度;Caption:指定⽤户辨别控件的⽂本字符串;ClientHeight:指定窗体客户区域的⾼度(像素);ClientWidth:指定窗体客户区域的宽度(像素);Clore:指定控件的背景⾊;Constraints:指定控件的尺⼨约束。
用Delphi实现录音程序
cc柳咖,∞耐B啦删乃啪∞蚴电嚣知识与技术第5卷第10期《2009年4月)重如何引导学生开展研究性、探索性学习。
同时课件制作应注意简洁,以免影响学生注意力。
5结论多媒体教学有利有弊,我们只有尽力做到因时制宜,因材施教,趋利除弊,扬长避短。
才能达到较为满意的教学效果。
参考文献:【l】刘育涛,安素平.试论多媒体课件在教学中的作用[J】.河北师范大学学报,2002,4,(1):62一“.【2】周中云.基于个别化教学多媒体课件设计的反思【J】.中国电化教育,2003,(1):49~51.【3】黄秋生.谈谈多媒体教学课件制作中的几个问题【J】.中国电化教育,2002,(7):45—垢.郭若飞(1982一),女,内蒙古商都人,助教,本科,主要研究方向:教学研究。
(上接第2669页)在“开始录音”的Butfon控件中编写功能代码,实现录音功能;在“停止录音”的Butt伽控件中添加功能代码,实现停止录音的功能.核心代码如下:乱开启录音代码trycreatewaV(1,8,ll025,(ExtractFilePa山(Applicati明.ExeN明le)+1remp.wav,);·MediaPlayerl.DeviceType:=dtAutoSelect;MediaPIayerl.FileN8me:-(ExtractFilePath(Applicat疏ExeN砌e)+仉mp.wav,;MediaPlByerl.0pen;MediaPIayerl.StartRec刊in簖exceptApplication.MessageBox(’媒体设备初始化失败!j’错误:MB-ICONERROR+MB._oK);end二end:b.停止录音代码田MediaPlayerl.Stop;MediaPlayerl.Save;MediaPlayerl.CJo∞;Application.MessageBox(’声音录制完毕!,’7信息’,MB-ICONINFORMATl0N+MB—0Kk靠ceptApp“cali咖.MessageBox(7保存声音文件出错!,'7错误jMB_Ic0NERROR+MB—OK);end:保存并运行该程序,在计算机上安装好麦克等音频输入设备。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
var
v:longint;
begin
waveoutgetvolume(0,@v);//得到现在音量
trackbar1.Position:=hi(v);//设置左滑块的正确位置
trackbar2.Position:=hi(v shr 16);//设置右声道滑块的正确位置
3.为trackbar1的Onchange事件编写如下代码:
procedure Tform1.TrackBar1change(Sender:Tobject);
var
t,v:longint;
// t的最大值为8位的二进制:11111111;
//用v来表示音量的大小,这是个32位的整数,高16位表示右声道的音量,低16位表示左声道的音量
end;
注:函数hi(v)的作用为:返回一个16位无符号整数的高8位值。如果v为32位,则高16位自动被忽略了。
2.只使用高8位时,可使调节效果更明显。
3.对波形文件可以用waveoutgetvolume函数,对cd文件可以用auxgetvolume函数。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^本文为转载
procedure Tform1.TrackBar2change(Sender:Tobject);
var
t,v:longint;//它的原理同上
begin
t:=trackbar2.Positபைடு நூலகம்on;
waveoutgetvolume(0,@v);
v:=v and $0000ffff or (t shl 24);
//@表示指向变量v的指针(32位),调用此函数的用意就是得到右声道的值,做到在调节左声道的时候,不改变右声道
v:=v and $ffff0000 or (t shl 8);
//数字前面加$表示是十六进制数字
waveoutsetvolume(0,v);
end;
2.控制右声道
Delphi应用之调节音量
一、调节全部音量
1.先在窗体中添加一个trackbar控件,
可通过改变它的位置来调节音量,
在trackbar1的属性中,
我们把Max属性修改成255,
改成这个值是为了便于进行二进制的音量调节操作。
2.为了调用一个Windows函数,在uses子句里加上Mmsystem。
二、分别控制两个声道的方法
1.控制左声道
procedure Tform1.TrackBar1change(Sender:Tobject);
var
t,v:longint;
begin
t:=trackbar1.Position;
waveoutgetvolume(0,@v);
begin
t:=trackbar1.Position;
//得到Trackbar的位置,可用这个值来表示音量的大小
v:=(t shl 8) or (t shl 24);//将t左移8位、24位
waveoutsetvolume(0,v);//设置音量
end;
waveoutsetvolume(0,v);
end;
三、设置滑块的初始位置
1.程序开始执行时,缺省情况下,Trackbar的位置在0,但我们希望程序开始执行时,这两个滑块能自动得到当前的音量,而处在相应
的位置。
procedure TForm1.FormCreate(Sender: TObject);