Delphi常用技巧
在网上行走时,经常会看到弹出的桌面小窗体,有时做广告,有时向你致以节日的问候;人们称其为桌面小精灵;有的桌面小精灵会自动移动,有的固定在屏幕的某一角落,动画闪烁,煞是迷人。本人用Delphi制作了一款桌面小精灵,愿与大家共享。
桌面小精灵的实现功能:当运行时,在屏幕的左下角显示一无边框、无标题栏的小窗体,并自动向屏幕的右上角移动,窗体上的小精灵——可爱的马先生,一会跃起,高呼“马
到成功!”,一会含情脉脉地向你招手“再见”;同时,还不断地闪烁显示当前时间,时刻提醒你抓紧时间呦!当你嫌它碍事时,你可以按下鼠标左键,将它拖到任意位置。如果你厌烦它不停移动,你可以双击鼠标左键,它会老老实实地呆在原地不动,只要你用鼠标轻轻一点,它又会高高兴兴地上路,当你单击“再见”时,桌面小精灵就会消失,你不想一试身手吗?请跟我来!
运行后效果图
生成一窗体,设置窗体属性如下:Name属性为Form1,BorderStyle属性为bsNone,FormStyle属性为StyOnTop,Height属性值240,Width属性值209。
窗体上分别添加组件,设置属性如下:
(1)添加两个Image组件,Name属性分别设为Image1、Image2,Align属性均设为alClient (以使Image组件充满整个窗体),Image1的Enabled为False,Image2的Enabled为True,然后通过Picture属性为Image1、Image2添加图片(适合的图片格式:BMP、JPG )。
(2)在Image上再添加两个Timer组件,Name属性分别为Timer1、Timer2,Enabled属性均为True,Interval属性均为1000毫秒。
(3)在Image上再添加一个Label组件,Name:=Label1,Caption:=“马到成功!”,Enabled:=True,Font属性为“华文行楷,粗斜体,三号字,红色”(根据你的图片设置适当的字体、字号、字体颜色)。
(4)在Image上再添加一个Panel组件,设置属性:Name:=Panel1。
Caption:=时间;Color:=clBlue ; Font设为:华文彩云、三号、黄色。
添加源代码如下:
//用Timer1控制两图片、标签及时间的显示
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (form1.Image1.Visible =true) then
begin
Image1.Visible :=false ;
Image2.Visible :=true ;
Label1.Visible :=false;
panel1.Caption :='再见!';
end
else
begin
Image1.Visible :=true;
Image2.Visible :=false;
Label1.visible:=true;
panel1.caption :=timetostr(time());
end;
end;
//用Timer2控制窗体的移动
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if form1.Left>=750 then
begin
form1.Top :=350;
form1.Left:=0;
end
else
form1.Left:=form1.Left+5;
form1.Top :=form1.Top -3;
end;
procedure TForm1.Panel1Click(Sender: TObject);
begin
close;
end;
//实现用鼠标点住窗体的任意位置,拖动窗体
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND,,0)
end;
//设置窗体的初始化位置
procedure TForm1.FormCreate(Sender: TObject);
begin
left:=0;
top:=350;
end;
//单击Image1、Image2时,Timer2重新开始工作,实现窗体的再移动
procedure TForm1.Image1Click(Sender: TObject);
begin
timer2.Enabled :=true;
end;
procedure TForm1.Image2Click(Sender: TObject);
begin
timer2.Enabled :=true;
end;
//双击Image1、Image2时,Timer2停止工作,实现窗体的固定不动效果
procedure TForm1.Image1DblClick(Sender: TObject);
begin
timer2.Enabled :=false;
end;
procedure TForm1.Image2DblClick(Sender: TObject);
begin
timer2.Enabled :=false;
end;
end.
用Delphi 5.0编写在线播放器
--------------------------------------------------------------------------------
对于RealPlayer网络播放软件大家一定不会陌生。其强大的网络视频、音频等媒体播放功能让人很是羡慕。如果自己也能做一个,心里肯定感觉不错。
RealPlayer软件本身有一个RealPlayer插件。由于它采用的是Active技术,这就为我们创建自己的RealPlayer播放器创造了条件。因为应用ActiveX技术做成的插件,可以很方便地应用到任何支持ActiveX技术的开发语言中,并作为一个普通组件加以使用。我们在下面
就以Delphi 5.0为例,制作一个属于自己的RealPlayer网络影视播放器。
添加RealPlayerActive插件到组件栏ActiveX项中,以备使用。选择主菜单Component→Import ActiveX Control项,将出现一个Import ActiveX窗口,该窗口的上部选择列表中存放了本计算机系统中已经拥有的各种Active插件。如果你安装了RealPlayer软件,就从中找到RealPlayer ActiveX Control Library一项并选定,然后选择窗口下部的Install...按钮,出现Install窗口,保持默认值,选择OK,即可添加完成。回到组件栏ActiveX项中,你会发现RealPlayer软件的图标。这样,RealPlayer就可当作一个普通组件使用。
图1 RealPlayer Active
新建一个Delphi应用程序,然后在窗口中把组件栏ActiveX项中的RealPlayer组件拉入窗口中,命名为RealAudio1,出现一个简化的RealPlayer界面。但它只有控制界面,没有视频图像界面。这不要紧,在RealPlayer组件的Controls属性中加入“ImageWindow”,然后点击下面的窗口,视频图像开始出现,在“ImageWindow”后接着添加“ControlPanel”属性值(用逗号分开)。这样控制界面出现,还可以在后面继续添加“Statuabar”值,出现状态条。
将RealPlayer组件拉动到适当大小,在窗口中添加一命令按钮并命名为Play。然后在按钮的单击事件中添加以下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
RealAudio1.source=' c:A.rm' ; //播放的电影源。
RealAudio1.doplay; //开始播放电影
end;
一个RealPlayer播放器就做完了,简单吧!不过本文只是简单介绍RealPlayer组件,它还拥有许多属性和方法,诸君可以自由发挥想像力,设计一个更加完善的播放器。
用Delphi再现Windows纸牌游戏
--------------------------------------------------------------------------------
使用过Windows 98的用户对其自带的纸牌游戏一定不会陌生,在您的鼠标点击、拖动等操作之下,扑克牌上下翻飞、腾挪组合;在您不经意的操作中,其实您已经触发了一系列预设事件,这些事件过程的响应最终让您体会到成功的喜悦和失败的痛苦。但您想不想体会一下借助于某种开发工具自己去编程实现的感觉呢,充分体会Delphi的事件驱动机制,这将是另外一番享受,并且理解了事件驱动机制后,再作其他更深层次的开发,这样您会变得更加得心应手。
一、单张牌的实现
Delphi编程环境中提供了图形按钮控件,设计时采用了一个按钮就是一张牌,我们可以将选定的图形(如BMP图形,大小合适)作为其背面和前面。在Delphi中,图形的装入显示的方法为:
图形按钮.glyph.loadfromfile('图形文件路径+文件名')
在设计中可以事先准备52张扑克正面图形和几张背景图形,用控件(控件数组)动态生成的方法(Create(Self))逐一调用。
二、关于图形按钮
在游戏中要对扑克牌进行正确的操作还要借助在其图形按钮上增加几个属性(如图1)
图1
HS:标识一张牌的花色(方块、黑桃、红心或梅花)。
DS:标识一张牌的点数(1-13即A-K)。
HB:标识一张牌的黑色和红色。
Over:标识本张牌上面是否有牌压着。
Look:标识本张牌的正面或背面。
Area:指定本张牌的操作区域,在设计中将各操作区定义为如图2所示各操作区。
发牌源区(Source):即左上角两叠牌。
回归区(Home):即右上角四门回收处。
操作拖放区(Operate):即下排(7叠)主要拖放区。
PTR属性:用于支持多张扑克牌的拖动操作,为一指针,指向单张牌。笔者用此属性来实现一叠牌的拉单向链表。也可以再加一属性拉双向链表方便操作。
三、扑克牌的操作
扑克牌的操作多数是通过Delphi提供的事件驱动编程实现的,开始一个拖动牌操作:Delphi是从OnMouseDown事件开始。请参考OnMouseDown模块。
接受/拒绝被拖动的牌:这里由OnDragOver事件决定,要接受被拖动的牌,必须把图形按钮的Accept属性设为TRUE。
释放处理被拖动的牌:这里由EndDrag和DragDrop事件被激发来处理,这里选用了DragDrop事件来处理,因为该事件只有当DragOver事件的Accept设为TRUE时,只有这个事件被激发。
图2
另外,扑克牌的位置改动是通过Top和Left属性实现的。
这里在设计时,52个控件共享Click、OnMouseDown、OnDragOver、OnDragDrop事件。
在运行时是动态赋予的。程序中如下例赋予事件代码:
Mainpk[i].OnMouseDown:=pk1mousedown;
Mainpk[i].OnDragOver:=pk1DragOver;
Mainpk[i].OnDragDrop:=pk1Dragdrop;
Mainpk[i].OnClick:=pk1Click;
四、程序的实现
程序开始时先动态生成52张牌(图形按钮),赋予花色、点数、正面图形等,接着利用Delphi提供的随机函数RANDOM(), 将52张牌次序打乱,完成洗牌。接着开始发牌,动态赋予事件代码。之后由接受用户选择进入游戏,游戏处理过程实际上就是相应事件代码在运作。
游戏调试通过后,笔者还查阅了其他相关资料,有的系统还提供了专门的关于扑克牌方面类库或API函数供程序员直接调用,减少了程序员的设计复杂性,有兴趣的读者也可以不妨一试。
在Delphi里播放Flash动画
--------------------------------------------------------------------------------
在Flash大行其道的今天,是否想过在你的程序里也加入几幅Flash动画炫一炫呢?OK,心动不如行动,让我们现在就开始吧!
首先,你的机器里要装有Flash播放软件(你的IE能显示Flash)。IE之所以能显示Flash是安装了由Macromedia公司提供的sw#{3tech.sina.com.cn/introduction/focus/flash.shtml target=_blank>flash3}#.ocx控件,我们可以在Win98的SystemMacromed Flash中或在W
in2000中的System32 MacromedFlash中找到它。ActiveX控件在Windows里是通用的,Delphi也同样支持。
运行Delphi后,选择选单Component→Import ActiveX Control,找到SWFlash.OCX 文件进行安装。安装完成后,ActiveX面板里出现TShockwaveFlash控件,这是Delphi对SWFlash.OCX的封装,现在我们就可以用这个控件来播放Flash了。拖一个Flash过来,放在Form上,指定其Movie属性为d: est.SWF,并按F9键加以运行即可。怎么样,运行效果不错吧?下面,笔者将具体介绍TShockwaveFlash主要属性、方法和事件,以便于读者开发。
TShockwaveFlash主要属性如下:
ReadyState:读一个flash文件时的状态,其中包括0=Loading、1=Uninitialized、2=Loaded、3=Interactive和4=Complete;
TotalFrames:总帧数,只有当ReadyState = 4时才能访问该属性;
FrameNum:当前播放的帧;
Playing:播放或暂停一个flash;
Quality:指定当前渲染的质量,包括0=Low, 1=High、2=AutoLow、3=AutoHigh;
ScaleMode:缩放模式,0=ShowAll、1= NoBorder、2 = ExactFit;
AlignMode:对齐模式,Left=+1、Right=+2、Top=+4、Bottom=+8;
BackgroundColor:背景色,-1为默认颜色;
Loop:是否循环;
Movie:指定播放的flash文件路径,可以为一个URL。
TShockwaveFlash主要方法如下:
Play():开始播放动画;
Stop();停止播放动画;
Back();播放前一帧动画;
Forward():播放后一帧动画;
Rewind():播放第一帧动画;
SetZoomRect(int left, int top, int right, int bottom):设置缩放的区域;
Zoom(int percent):按百分比缩放;
Pan(int x, int y, int mode):缩放播放面板,其中模式0为按像数、1为按窗口百分比。
TShockwaveFlash主要事件如下:
OnProgress(int percent):读取一个flash时触发;
OnReadyStateChange(int state):状态改变时触发。states的值可以为0=Loading、1=Uninitialized、2=Loaded、3=Interactive和4=Complete。
利用Delphi实现系统状态栏图标
--------------------------------------------------------------------------------
下面以一个具体的例子,详细介绍一下利用Delphi实现系统状态栏图标的步骤和方法。
1.创建一个应用程序,在主窗体上增加一个TpopupMenu组件。并为该弹出选单组件增加选单项Exit,标题为“退出”。
2.在Uses中添加ShellAPI,因为在系统状态栏中增加图标时需调用ShellAPI中的函数
Shell_NotifyIconA。该函数需要两个参数,其中一个是TnotifyIconDataA结构,需在主窗体中增加TnotifyIconDataA类型的全局变量ntida。
3.定义消息mousemsg,并编写主窗体的mousemessage消息处理函数,此函数说明在图标上用鼠标左键单击时,会打开应用程序窗口;用鼠标右键单击时,会弹出一个选单。
下面给出步骤2和3的实现代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, shellapi;
const
mousemsg = wm_user + 1; //自定义消息,用于处理用户在图标上点击鼠标的事件
iid = 100; //用户自定义数值,在TnotifyIconDataA类型全局变量ntida中使用
type
TForm1 = class(TForm)
......
private
//自定义消息处理函数,处理鼠标点击图标事件
procedure mousemessage(var message: tmessage); message mousemsg;
public
{ Public declarations }
end;
var
Form1: TForm1;
ntida: TNotifyIcondataA;
//用于增加和删除系统状态图标
implementation
{.DFM}
procedure TForm1.mousemessage(var message: tmessage);
var
mousept: TPoint; //鼠标点击位置
begin
inherited;
if message.LParam = wm_rbuttonup then begin //用鼠标右键点击图标
getcursorpos(mousept); //获取光标位置
popupmenu1.popup(mousept.x, mousept.y);
//在光标位置弹出选单
end;
if message.LParam = wm_lbuttonup then begin //用鼠标左键点击图标
//显示应用程序窗口
ShowWindow(Handle, SW_SHOW);
//在任务栏上显示应用程序窗口
ShowWindow(Application.handle, SW_SHOW);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
not (GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW));
end;
message.Result := 0;
end
4.编写FormCreate的代码如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
ntida.cbSize := sizeof(tnotifyicondataa); //指定ntida的长度
ntida.Wnd := handle; //取应用程序主窗体的句柄
ntida.uID := iid; //用户自定义的一个数值,在uCallbackMessage参数指定的消息中使
ntida.uFlags := nif_icon + nif_tip + nif_message;//指定在该结构中uCallbackMessage、hIcon和szTip参数都有效
ntida.uCallbackMessage := mousemsg;
//指定的窗口消息
ntida.hIcon := Application.Icon.handle;
//指定系统状态栏显示应用程序的图标句柄
ntida.szTip := 'Icon';
//当鼠标停留在系统状态栏该图标上时,出现该提示信息
shell_notifyicona(NIM_ADD, @ntida);
//在系统状态栏增加一个新图标
end;
5.编写Tform1.OnClose的代码如下:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone; //不对窗体进行任何操作
ShowWindow(Handle, SW_HIDE); //隐藏主窗体
//隐藏应用程序窗口在任务栏上的显示
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW AND NOT WS_EX _APPWINDOW);
end;
6.编写Exit代码如下:
当用户点击Exit时实现完全退出应用程序。具体代码如下:
procedure TForm1.ExitClick(Sender: TObject);
begin
//为ntida赋值,指定各项参数
ntida.cbSize := sizeof(tnotifyicondataa);
ntida.wnd := handle;
ntida.uID := iid;
ntida.uFlags := nif_icon + nif_tip + nif_message;
ntida.uCallbackMessage := mousemsg;
ntida.hIcon := Application.Icon.handle;
ntida.szTip := 'Icon';
shell_notifyicona(NIM_DELETE, @ntida);
//删除已有的应用程序图标
Application.Terminate;
//中断应用程序运行,退出应用程序
end
通过以上步骤,我们即可用Delphi轻松实现系统状态栏图标。
用Delphi编写SMTP邮件发送程序
--------------------------------------------------------------------------------
Delphi 5构件板的FastNet页中,提供了TNMSmtp构件,它的功能就在于将邮件发送到指定的邮件服务器。其最常用的属性和方法如下:
Host:SMTP邮件服务器的地址,如SMTP.SINA.COM.CN
Port:SMTP邮件服务器的端口号,一般用其默认值25即可
UserID:用户名,当与邮件服务器建立连接时,需验证用户名
PostMessage.FromAddress:发件人地址
PostMessage.ToAddress:收件人地址
PostMessage.Attachments:邮件附件的文件列表
PostMessage.Body:邮件的正文
PostMessage.Subject:邮件的主题
Connect方法:建立与SMTP服务器的连接,连接前需指定Host和UserID
Disconnect方法:断开与服务器之间的连接
SendMail方法:将当前邮件发送到服务器
当然,TNMSmtp构件还有很多其它的属性、方法、事件,在这里我们不作介绍,需要时大家可以查阅相关资料或Delphi的帮助信息。
实现方式
首先在Form1中加入相应的TLabel、TEdit、TMemo、TButton、TListBox、TOpenDialog和TNMSmtp构件。其中,TMemo用于书写邮件内容,TListBox显示附件项目,TOpenDialog(文件打开对话框)用于选择附件文件,按钮Button1添加附件,按钮Button2连接服务器并发送邮件。程序的具体代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then ListBox1.Items.Add(OpenDialog1.FileName);
//将选择的文件项添加到ListBox1中,作为附件
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
NMSmtp1.Host:=Edit3.Text; //SMTP服务器地址
NMSmtp1.UserID:=Edit4.Text; //你在对应服务器上的注册用户名
NMSmtp1.Connect; //与服务器建立连接
NMSmtp1.PostMessage.FromAddress:=Edit5.Text; //发件人的邮件地址
NMSmtp1.PostMessage.Subject:=Edit2.Text; //邮件主题
NMSmtp1.PostMessage.ToAddress.Add(Edit1.Text); //收件人的邮件地址
NMSmtp1.PostMessage.Attachments.AddStrings(ListBox1.Items); //附件
NMSmtp1.PostMessage.Body.Assign(Memo1.Lines); //邮件的正文
NMSmtp1.SendMail; //发送邮件
NMSmtp1.Disconnect; //断开连接
ShowMessage('发送完毕!'); //发送完时显示提示信息
end;
以作者为例:我的一个邮箱为[email][email protected][/email],利用SMTP.163.com邮件服务器向《中国电脑教育报》编辑部发信时,在Edit1中填入编辑部的地址[email][email protected][/email],Edit2中写上主题,Edit3中填入SMTP.163.com,Edit4中填入用户名dyhuyz,Edit5中填入我的地址[email][email protected][/email],添加附件后,单击发送按钮,一切OK了!
注意事项
需要特别说明的是:目前部分网站的SMTP邮件服务器要对发送邮件的用户进行身份验证,即要求给出用户名和密码信息,否则无法发送,包括163.net,263.net,sina.com,sohu.com等均在此列。而Delphi 5的TNMSmtp构件本身未提供“密码”属性,采用以上简单方法,不能利用这些服务器发送邮件,否则会出现错误信息;Delphi 6中用Indy构件组取代了Delphi 5中的FastNet构件组,其中的SMTP包含有身份验证的相关信息,可以很方便地解决这个问题。另一部分网站,如China.com,163.com等,则不要求身份验证,利用本程序,尽可畅通无阻。
如何在Delphi中使用资源文件
--------------------------------------------------------------------------------
资源也是数据,它相当于我们熟悉的只读数据。在应用程序的可执行代码中,它是单独存储的,当其被调用时才载入程序,在程序执行完后又退出。Delphi中的资源有很多类型,适用于不同的地方,大致有以下几类:
●图标资源:是一种小型位图,用户常常用不同的图标代替不同的应用程序。
●光标资源:也是小型的位图,不过它适用的颜色不多。Delphi已经给光标指定了一个光标图案集,就是我们操作中常用到的Cursor属性,同时用户也可自定义光标图案。
●位图资源:Delphi只是将位图资源存入资源文件中,在使用时从资源文件中调出。
●字符串资源:将字串符文件存储于资源文件中。
本文通过实例程序来说明资源在Delphi中的用法,所有示例程序均在Delphi 4中调试通过。
1、生成资源文件
在Delphi中提供了一个图形编辑器(Image Editor),通过该编辑器可以编辑生产Bitmap、Icon和Cursor三种资源文件,也可以直接绘制ICO、CUR和BMP文件。该编辑器不能进行文字处理,具体文字处理在后面介绍。编辑图形类资源文件时,首先启动Image Editor,选择:File->New->Resource File;在弹出的窗口中用鼠键右键单击“Contents”,再弹出的菜单中单击:New;选择需要编辑的资源文件的类型(Bitmap、Icon或Cursor)。
2、装载与使用资源文件
资源文件编辑生成后(文件名后缀为.res),要使用这些资源文件,首先要通过添加代在表单文件的implementation关键字中加入:
{ *.DFM}
{资源文件名.RES}
定义了资源文件并且在单元文件中包括了资源文件名,需要调用Windows的API函数调用资源文件里的内容,如:LoadIcon,LoadString,LoadBitmap,LoadResource等。
例如:下面的语句装入了一个名为mybmp.bmp的文件:
Bmp.Handle := LoadBitmap(Hinstance , 'mybmp.bmp');
下面示例程序说明了图标、光标和位图资源的使用方法,在资源文件TEST.RES中定义了两个光标(cur1和cur2)、两个位图(bmp1和bmp2)以及两个图标(in1和in2),在程序中对这些资源都进行了调用。并利用定时器使位图和图标的显示有类似动画的感觉。当鼠标移动到Ladel1上时,光标会变成你定义的第一个光标形状;当单击Button1后,再把光标移到Ladel1上时,光标会变成你定义的第二个光标形状。
unit testtes;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Image1: TImage;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
bmp12 : Integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{ *.DFM}
{ TEST.RES}
const
crMycur1 = 1;
crMycur2 = 2;
procedure TForm1.FormCreate(Sender: TObject);
var
bmp : TBitmap;
ico : TIcon;
begin
Screen.Cursors[crMycur1] := LoadCursor(Hinstance,'CUR1');
Screen.Cursors[crMycur2] := LoadCursor(Hinstance,'CUR2');
Label1.Cursor := crMycur1;
bmp := TBitmap.Create ;
bmp.Handle := LoadBitmap(Hinstance,'BMP1');
Image1.Width := bmp.Width + 10;
Image1.Height := bmp.Height + 10;
Image1.Canvas.Draw(4,8,bmp);
bmp12 := 1;
ico := TIcon.Create ;
ico.Handle := LoadIcon(Hinstance,'IN1');
Icon := ico;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Cursor := crMycur2;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
bmp:TBitmap;
ico : TIcon;
begin
bmp := TBitmap.Create ;
ico := TIcon.Create ;
if bmp12=1 then bmp12 := 2 else bmp12 :=1;
bmp.Handle := LoadBitmap(Hinstance,PChar('BMP'+IntToStr(bmp12)));
ico.Handle := LoadIcon(Hinstance,PChar('IN'+IntToStr(bmp12)));
Image1.Width := bmp.Width + 10;
Image1.Height := bmp.Height + 10;
Image1.Canvas.Draw(4,6,bmp);
Icon := ico;
end;
end.
3、字符串资源的定义与使用
字符串的存储在应用程序中是独立的,应用程序只有在使用资源时载入,使用完之后清除,从而节省内存,同时字符串也可以用于翻译,一些汉化软件都利用了字符串。编辑的字符串放在一个文本文件中,可以使用Delphi中的:File->New->Text,编辑字符串文件,字符串文件的格式如下:
stringtable
begin
1,"book"
2,"apple"
3,"desk"
4,"pen"
5,"computer"
end
编辑完字符串文件后,选择Save as,注意要将文件类型改为资源编译文件(.RC),这还不是资源文件,它还必须经过编译才能成为资源文件(.RES)。编译命令为Dos提示符下的BRCC32,其路径为:D:Program FilesBorlandDelphi4Binrcc32.exe;例如上面的字符串资源编译文件名为:StrRes.rc,在DOS提示符下输入:brcc32 mydirStrRes.rc;则编译后会生成一个名为:StrRes.res的资源文件,使用该文件即可访问字符串资源。具体使用见下例:
unit teststr;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
count : integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{ *.DFM}
{ StrRes.RES}
const
wordcount = 5;
procedure TForm1.Button1Click(Sender: TObject);
var
strword : string;
begin
if count>wordcount then count := 1;
strword := LoadStr(count);
label1.Caption := strword;
count := count + 1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
label1.Caption := LoadStr(1);
count := 2;
end;
end.
程序中常量wordcount用来记录字符串资源文件中字符串的数量,变量count用来记录显示的字符串编号。程序运行后单击Button1按钮,则将循环显示字符串资源文件中的每一个字符串。
Delphi开发用DOA运行存储过程
--------------------------------------------------------------------------------
用Delphi开发C/S结构的Oracle数据库软件时,为提高效率,通常将大批量的数据处理交给后台存储过程来完成。由于Delphi需通过BDE才能操作和处理各种数据库文件,这样不仅效率低,而且存在一定局限性,所以考虑采用第三方工具DOA来提高交互效率,方便前后台信息的传递。
DOA(即Direct Oracle Access的缩写)是荷兰Allround Automations公司开发的访问O
racle的工具,运用DOA构件可以在Delphi或C++Builder开发环境下跳过BDE,而直接通过SQLNet访问Oracle。初次接触DOA,一些编程人员对怎样运用DOA调用存储过程感到困惑,笔者将结合电信综合管理系统中数据加工审核这一具体实例,详细阐述其具体的方法和步骤。
实现方法
1.用TOraclePackage的CallProcedure / CallXXXFunction
用TOraclePackage的CallProcedure方法,我们就可简单地调用Oracle存储过程,该方法中参数以数组的形式传递。当TOraclePackage的ParameterMode属性为pmNamed时要按照名称传递参数,每个参数前面必须有指定名称的字符串,其格式为:
CallProcedure(ProcedureName, [ParameterName1, Parameter1, ParameterName2, Parameter2…]);
当TOraclePackage的ParameterMode属性为pmPositional时,要按照位置传递参数:
CallProcedure(ProcedureName,[Parameter1, Parameter2,…]);
输出参数通过传递parString、parInteger、parFloat、parDate或parBoolean常数来定义,输出参数值在过程调用后用GetParameter方法获得,格式为:
PackageName.CallProcedure('ProcedureName',[parString]);
GetParameter(ParameterId);
如果没有参数,则用parNone获得:
PackageName.CallProcedure('ProcedureName', parNone);
与上面类似,我们用TOraclePackage的Call...Function方法也可简单地调用Oracle函数,只是根据返回值的不同,调用相应的方法CallBooleanFunction、CallDateFunction、CallFloatFunction、CallIntegerFunction或CallStringFunction。
2.用TOracleQuery或TOracleDataSet的Execute
用TOracleQuery或TOracleDataSet执行存储过程的步骤为:
(1)设置SQL属性
将TOracleQuery或TOracleDataSet的SQL属性设为:
begin
ProcedureName (:Parameter1, : Parameter2,…);
end;
(2)定义参数
定义参数的方式有两种,一是在对象查看器Properties选项卡的Variables属性中,单击省略号按钮,打开变量属性编辑器;二是用DeclareVariable方法。DOA支持PL/SQL表,它可以作为输入/输出参数传递给后台存储过程和函数,通过一次调用即可传递大量信息,使得在C/S结构中,网络通信量显著减少。在TOracleQuery或TOracleDataSet中定义PL/SQL表既可使用变量属性编辑器(选中PL/SQL Table复选框,然后定义表的大小,如果是字符串型的,还需定义字符串大小),也可在运行时定义PL/SQL表(先调用DeclareVariable方法定义变量,再调用DimPLSQLTable方法定义表大小)。
(3)参数赋值
给输入参数赋值用SetVariable方法,给PL/SQL表赋值首先要创建数组变量,分别赋值数组的各元素,再通过该数组用SetVariable方法给PL/SQL表赋值。
ArrayName := VarArrayCreate([LowBounds, UpBounds], VarType);
Table[LowBounds] := value1;
…
Table[UpBounds] := valuen;
OracleQueryName.SetVariable(':TableName', ArrayName);
(4)执行存储过程
调用Execute方法执行存储过程,代码如下:
OracleQueryName. Execute;
(5)获得输出参数
用GetVariable方法获得输出参数值,输入/输出参数为PL/SQL表时,返回的数组变量下限与输入相同;输出参数为PL/SQL表时,返回的数组变量下限从零开始。
应用实例
以下是笔者运用上述第二种方法在电信综合统计管理系统中调用加工审核存储过程的一段源代码:
create or replace package pk_sh is
type t_object is table of varchar2(15) index by binary_integer;
type t_formula is table of number index by binary_integer;
procedure sp_audit(sh_time in varchar2,sh_dx in t_object,sh_gs in t_formula);
end pk_sh;
我们首先在服务器端创建包pk_sh,包中定义了两种PL/SQL表,其中t_object存储审核对象,t_formula存储审核公式ID,存储过程sp_audit根据传递的参数(时间、对象、公式)对后台数据进行加工审核。
客户端用Delphi编写,即通过DOA访问sp_audit,具体源代码如下:
Var
OracleSession1: TOracleSession;
OracleQuery1: TOracleQuery;
Begin
//连接数据库
OracleSession1:= TOracleSession.Create(nil);
OracleSession1.LogonDatabase := 'chicago';
OracleSession1.LogonUsername := 'scott';
OracleSession1.LogonPassword := 'tiger';
OracleSession1.Connected:= True;
OracleQuery := TOracleQuery.Create(nil);
OracleQuery1.Session := OracleSession1;
//创建数组并赋值
sh_dx:=VarArrayCreate([0, LV_object.Items.Count -1], varVariant);
for i:=0 to LV_object.Items.Count -1 do
begin
sh_dx[i] :=LV_object.Items[i].caption;
end;
sh_gs:=VarArrayCreate([0, LV_formula.Items.Count -1], varVariant);
for i:=0 to LV_formula.Items.Count -1 do
begin
sh_gs[i] :=strtoint(LV_formula.Items[i].caption);
end;
sql_str :='pk_sh.sp_audit(:sh_time,:sh_dx,:sh_gs);';
with OracleQuery1 do
begin
//设置SQL属性
Clear;
SQL.Add('begin');
SQL.Add(' ' + sql_str );
SQL.Add('end;');
//定义参数
DeleteVariables;
DeclareVariable('sh_time', otString);
DeclareVariable('sh_dx', otString);
DeclareVariable('sh_gs', otInteger);
DimPLSQLTable('sh_dx', 2000, 15);
DimPLSQLTable('sh_gs', 500, 0);
//参数赋值
SetVariable(': sh_time ', sh_time);
SetVariable(':sh_dx', sh_dx);
SetVariable(':sh_gs', sh_gs);
//执行存储过程
Execute;
Free;
end;
OracleSession1.Connected:= False;
OracleSession1.Free;
End;
以上源代码采用Delphi 5、Oracle 8开发,在Windows 98/Windows2000系统平台下调试通过。
通过以上分析可知,利用BDE访问Oracle,由于它不支持PL/SQL表,参数只能分行传递,需反复多次调用存储过程,而用DOA则使问题圆满解决。此外,将TOracleQuery的Threaded属性设置为True,就可简单地编写多线程应用程序,而将Debug属性设置为True,可在运行时显示SQL语句和变量值,以方便调试。
用Delphi开发ASP分页组件
--------------------------------------------------------------------------------
随着网络技术的发展和Internet的普及,Browser/Server在软件开发中已成为主流,笔者在开发一个ERP系统时,就采用了B/S软件模式,具体架构为SQL Server+IIS+IE网页采用的是Active Server Page文件。由于系统涉及大量的数据操作和查询,若纯粹采用ASP脚本语言编写势必造成效率低下,为了提高系统的整体效率和安全性,笔者采用了ASP组件来代替ASP脚本语言。
由于Delphi在开发数据库应用系统中具有的强大的功能和极高的效率,所以笔者开发ASP组件较常用的是Delphi 5.0(当然也可采用Visual Basic或VC++开发ASP组件),Delphi本身在Internet和InternetExpress两个组件面板提供了众多的组件可以直接生成Web页面,但是这些组件都缺少网页中数据显示常见的分页功能。众所周知,ASP是通过建立ADO连接数据库后建立RecordSet对象,然后利用RecordSet的AbsolutePage进行页面定位,而在Delphi 5.0中,已提供了ADO组件封装了Microsoft的ADO库,所以同样具有页面定位功能。下面笔者将分步来开发一个通用的显示分页Web页面的ASP组件。
第一步:新建一个Activex Library,命名为PadoPage,然后再新建一个Active Server Object Class,命名为AdoPage,即建立了一个名为AdoPage的ASP组件,文件命名为Adopage.pas。
第二步:打开Type Library,新建一个方法Get_Page,然后在Get_Page加入一个参数Pconnandsgl,用于传递数据库连接语句和SQL语句,参数选择为BSTR类型。
第三步:新建一个DataModule,放入Adoconnection组件和AdoQuery组件,将Data Module命名为AdoDataModule。由于新建立的组件中的方法Get_Page要从DataModule中取得数据,所以需在Adopage.pas的Uses子句中加入AdoDataModule,然后声明一个数据模块的变量fadodm,同时加入Initialize和Destroy这两个方法,以便在ASP组作中生成数据模块。Adopage.pas具体代码如下所示:
unit Adopage;
interface
uses
ComObj, SysUtils, Classes, ActiveX, AspTlb, Pbasedata_TLB, StdVcl, AdoDataModule;
//将AdoDataModule加入USE子句
type
T Adopage = class(TASPObject, Ibasedata)
private
fadodm:TAdoDataModuleform;
protected
procedure OnEndPage; safecall;
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
procedure get_page(const pconnandsql: WideString); safecall;
public
procedure initialize;override;
destructor destroy;override;
end;
implementation
uses ComServ,forms;
destructor Tadopage.destroy;
begin
inherited;
fadodm.Destroy;
end;
procedure Tadopage.initialize;
begin
inherited;
fadodm:=tadodmform.Create(forms.application);
end;
第四步:建立通用的分页显示数据的方法get_page,具体代码如下:
procedure Tadopage.get_page(const pconnandsql: WideString);
var i,j,n:integer;
connstr,sqlstr:widestring;
rs:_recordset;
cur_url:widestring;
page_no:integer;
begin
//首先从传递过来的参数中分别取出连接串和SQL语句
pconnandsql:=uppercase(pconnandsql);
i:=pos('CONNSTR',pconnandsql);
j:=pos('SQLSTR',pconnandsql);
if i=0 or j=0 then
begin
response.write('数据库连接串或SQL语句错误!');
abort;
end;
for n:=I+8 to j-1 do
connstr:=connstr+pconnandsql[n];
for n:=j+7 to length(pconnandsql) do
sqlstr:=sqlstr+pconnandsql[n];
//将取得的连接串和SQL语句分别赋给ADOconnection和ADOQuery
fadodm.adoconnection1.connstring:=connstr;
fadodm.adoquery1.sql.add(sqlstr);
//以下为打开数据库并进行分页的过程
try
fadodm.adoquery1.open;
//打开数据库
rs:=fadodm.adoquery1.recordset;
//取得当前打开页面的URL和页码
try
if request.servervariable['url'].count>0 then
cur_url:= request.servervariable.item['url'];
if request.querystring['page_no'].count>0 then
page_no:=request.querystring.item['page_no']
else
page_no:=1;
except
end;
rs.pagesize:=20;
//每页设为20行
rs.AbsolutePage:=page_no;
//页面定位
response.write('共'+inttostr(rs.pagecount)+'页& ');
response.write('第'+inttostr(page_no)+'页& ');
//对每个页码建立超链接
for i:=1 to rs.pagecount do
response.write('<a href="'+cur_url+'?page_no='+inttostr(i)+'">'
+inttostr(i)+'</a>');
//数据记录按表格显示
response.write('<table>');
//取得表格标题
response.write('<tr>');
for I:=0 to fadodm.adoquery1.fields.count-1 do
response.write('<td>'+fadodm.adoquery1.fields[i].fieldname+'</td>');
response.write('</tr>');
j:=1
with fadodm.adoquery1 do
while (not eof) and j<=rs.pagesize do
begin
response.write('<tr>');
//取得表格内容
for i:=1 to fields.count do
response.write('<td>'+fields[i].asstring+'</td>');
response.write('</tr>');
next;
end;
response.write('</table>');
fadodm.adoquery1.close;
except
response.write('数据出错啦!');
end;
end;
以上即为取得通用分页数据的过程,需要注意的是编译时部分函数会出错,只需在USES子句中加入sysutils、classes和adodb单元即可。
第五步:编译并注册adopage组件,即可在ASP代码中调用,调用示例如下:
<%
dim webpageobj
set webpageobj=server.createobject("padopage.adopage")
webpageobj.get_page("conn=provider=SQLOLEDB.1;presist security info=false;
user id=sa;initical catalog=sale_data;data source=(local),
sqlstr=selectfrom customer")
%>
通过以上步骤,我们就顺利地利用Delphi开发出了具有分页功能的ASP组件了。
利用Delphi实现图像的淡入淡出
--------------------------------------------------------------------------------
我们在浏览网页时见过不少图像淡入淡出的特技,其实,用Delphi也可以实现这样的效果。
用Delphi显示图像,有两个不可缺少的步骤,一是将图像装入Delphi隐形控件TBitmap中,二是用Canvas(画布)的Draw(x,y,Bitmap)或StretchDraw(Rect,Bitmap)方法将图像显示出来。淡出的效果就是将图像上每一个像素的颜色值进行设置,使它逐渐减少到0(黑色),实
现图像的渐渐隐去。利用Canvas的Scanline属性可读取和设置图像每一行的像素颜色,我们就是利用它来实现特技的。淡入则是将一幅图像装入两个TBitmap对象,一个用来保存原始颜色,另一个用来处理,将像素的颜色从0逐渐递增到原始图的颜色,实现淡入的效果。
准备工作:新建一个窗体并加入一个Image控件(用来显示图像特技),两个Button控件(用来切换淡入淡出)。下面我们将两个Button的Click事件源码介绍如下:
unit drdc;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,i:integer;
Bitmap:TBitmap;
pixcolo:PByteArray;
begin
Bitmap:=TBitmap.Create;
//创建TBitMap实例
try
Bitmap.LoadFromFile
('c:windows ouds.bmp');
Bitmap.PixelFormat:=pf24bit;
for i:=0 to 255 do
begin
for y:=0 to Bitmap.Height-1 do
begin
pixcolo:=Bitmap.Scanline[y];
//扫描每行像素颜色
for x:=0 to ((Bitmap.Width3)-1) do
if pixcolo[x]>0 then pixcolo[x]:=(pixcolo[x]-1);
//递减颜色值,不同的递减值可改变不同的速度
end;
Image1.Canvas.Draw(0,0,Bitmap);
//画出图像
Application.ProcessMessages;
//系统做其他工作
end;
finally
Bitmap.free; //释放位图
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
x,y,i,j:integer;
Bitmap1,Bitmap2:TBitmap;
pixcolo1,pixcolo2:PByteArray;
begin
Bitmap1:=TBitmap.Create;
Bitmap2:=TBitmap.Create;
try
Bitmap1.LoadFromFile('c:windows ouds.bmp');
//将同一幅图像装入两个TBitmap实例
Bitmap2.LoadFromFile('c:windows ouds.bmp');
Bitmap1.pixelFormat:=pf24bit;
Bitmap2.pixelFormat:=pf24bit;
for y:=0 to Bitmap2.height-1 do
begin
pixcolo2:=Bitmap2.Scanline[y];
for x:=0 to ((Bitmap2.Width3)-1) do
pixcolo2[x]:=0;
//先将要处理的图像的像素颜色值设为0
end;
for i:=0 to 255 do
begin
for y:=0 to Bitmap2.Height-1 do
begin
pixcolo2:=Bitmap2.Scanline[y];
pixcolo1:=Bitmap1.Scanline[y];
for x:=0 to ((Bitmap2.Width3)-1) do if pixcolo2[x]<pixcolo1[x] then pixcolo2[x]:=(pixcolo2[x]+1);
end;
//与原始图的像素颜色值比较,并递增其值直到与原始图相等
Image1.Canvas.Draw(0,0,Bitmap2);
Application.ProcessMessages;
end;
finally
Bitmap1.free
end;
end;
end.
利用上面的程序,我们就在Delphi中初步实现了图像的淡入淡出效果。
看实例学Delphi编程四例
--------------------------------------------------------------------------------
在编程爱好者中流传着这样一句话:“业余的程序员用VB,真正的程序员用VC,聪明的程序员用Delphi”。这当然不尽贴切,但从中不难体会到Delphi作为Windows下的主要编程工具之一,其功能完善、灵活多变且易学易用的特点。
下面,我们就通过四则具体的实例来学习Delphi编程的一般思路和技巧。
将程序加入启动
Windows自启动的信息存放于注册表HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun中,Delphi为程序员提供了专用于注册表操作的类型TRegistry:首先利用它声明一个变量,变量的RootKey属性表明当前是对哪一个根键进行操作;使用变量的OpenKey方法打开子键,使用ReadString方法读子键内容,使用WriteString方法写入子键内容。可以自定义一个过程AutoRun来实现此功能,格式为:AutoRun(任意名称,要自动运行的程序名)。实例如下:
implementation
uses Registry; //声明注册表单元
procedure AutoRun(sCaption,sExeName:string); //sCaption为项目名称,sExeName为程序名
var
RegF:Tregistry; //定义变量RegF
begin
RegF:=Tregistry.Create; //创建变量
RegF.RootKey:=HKEY_LOCAL_MACHINE; //指定要操作的根键
if RegF.Openkey('SoftwareMicrosoft
WindowsCurrentVersionRun',true) then
RegF.WriteString(sCaption,sExeName);
RegF.Free; //释放变量
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
AutoRun('MyAutoRun',Paramstr(0));
//调用过程,Paramstr(0)函数返回带路径的程序名
end;
实现文件拷贝
在本例中,我们使用数据压缩的API函数LZCopy来实现一个文件拷贝的过程,其调用格式为:CopyFile(源文件名,目标文件名)。
implementation
uses LZExpand;
procedure CopyFile(sFileName,dFileName:String);
var sFile,dFile:file;
begin
AssignFile(sFile,sFileName);
Reset(sFile);
AssignFile(dFile,dFileName);
Rewrite(dFile);
LZCopy(TFileRec(sFile).Handle,TFileRec
(dFile).Handle);
CloseFile(sFile);
CloseFile(dFile);
end;
避免多次打开同一程序
Windows是一个多任务的操作系统,允许用户同时打开多个实例,但这样做有可能会造成不良后果。例如:自己设计屏幕保护程序时,只要屏保程序已经被打开运行,就不能再运行其第二个实例;如果不加以限制,则可能出现每隔一定时间就运行一个屏保程序的不正常情况。
要使系统只能打开程序的一个实例,需要对工程文件(*.dpr)进行少许改动,使用API函数FindWindow,其格式为:FindWindow(窗体类名,窗体标题),返回一个窗体的句柄或零(如果没有找到窗体)。假设程序主窗体的标题为MainForm,则工程文件的具体代码如下:
program Project1;
uses Forms,Windows, Unit1 in 'Unit1.pas' {Form1};
var Hwnd:THandle;
begin
Hwnd:=FindWindow('TForm1','MainForm'); //查找是否已有窗体MainForm
if Hwnd<>0 then begin
SetForegroundWindow(Hwnd); //激活已运行的程序实例,但程序最小化时无效
Application.Terminate; //终止本次实例
end
else begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
//运行本次实例
end;
end.
限制窗体的大小
当编程者为窗体选择可变化的边框时,用户可以按自己的意愿拖动边框,改变窗体大小。Delphi为窗体和所有控件提供了一个特殊的属性:Constraints。只需为Constraints属性的子属性设置合适的最大值与最小值,就能建立一个大小不超过指定限制的窗体或控件。我们可以将这些语句放在窗体创建事件中(FormCreate):
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Height:=200;
form1.Width:=300;
form1.Constraints.MaxHeight:=400;
form1.Constraints.MaxWidth:=600;
form1.Constraints.MinHeight:=100;
form1.Constraints.MinWidth:=150;
end;
Delphi趣味编程实例三则
--------------------------------------------------------------------------------
隐藏任务栏屏蔽热键
在自己的程序中将任务栏隐藏起来,并屏蔽Ctrl+Alt+Del和Alt+Tab等系统热键,也是很有趣的。要实现它们比较容易,但千万别忘了恢复正常,另外,本例中使用了3个API函数:FindWindow、ShowWindow和SystemParametersInfo,在使用它们之前一定要进行申明。
Implementation
var Hwnd:THandle;
Tmp:integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
Hwnd:=FindWindow('Shell_TrayWnd',nil);
if Hwnd<>0 then ShowWindow(Hwnd,SW_HIDE); //隐藏任务栏
SystemParametersInfo(SPI_SCREEN
SAVERRUNNING,1,@Tmp,0); //屏蔽系统热键
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Hwnd:=FindWindow('Shell_TrayWnd',nil);
ShowWindow(Hwnd,SW_SHOW); //恢复任务栏
SystemParametersInfo(SPI_SCR
EENSAVERRUNNING,0,@Tmp,0);
//恢复系统热键
end;
动态调整显示器分辨率
Delphi提供了可以动态改变屏幕分辨率的函数,分别是EnumDisplaySettings()和ChangeDisplaySettings()。有了它们,编程时可以随时改变分辨率以适应要求。下面的CRTReset函数能方便实现这一功能:
implementation
function CRTReset(X, Y: Word): Boolean;
var
lpDevMode: TDeviceMode;
begin
Result:= EnumDisplaySettings(nil, 0, lpDevMode); //获取显示模式
if Result then begin
lpDevMode.dmFields := DM_PELSWID
TH Or DM_PELSHEIGHT;
lpDevMode.dmPelsWidth := X;
lpDevMode.dmPelsHeight := Y; //设置屏幕的宽度和高度
Result:= ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;
//改变屏幕分辨率并返回成功与否
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if CRTReset(800, 600) then ShowMessage('Now is 800*600'); //调用函数,设置分辨率为800×600
end;
鼠标滚轮如何编程
我们使用的鼠标,很多都带有一个滚轮,方便用户的操作。但遗憾的是,平时编程多数只利用到鼠标的左、右两键,如果将滚轮操作功能也加进你的程序,定能使其增色不少。
当鼠标指针指向窗体中时,Delphi为滚轮滚动提供OnMouseWheel事件,我们可以对它进行相应的处理。本例中,在窗体内放置一标签Label1,用于显示滚轮滚动的效果。
implementation
var i:integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
Label1.Caption:=inttostr(i);
end;
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
if WheelDelta>0 then i:=i+1 else i:=i-1;
//wheelDelta参数表示滚动一格的值,向上滚动为正数,向下滚动则为负数
Label1.Caption:=inttostr(i);
end;
用Delphi打造RealPlayer播放器
--------------------------------------------------------------------------------
如今RealPlayer的流式媒体文件以其强大的视频压缩比正逐步悄然兴起。RealPlayer Plus播放器也理所当然地成为大家播放RealPlayer格式文件的首选软件。不过RealPlayer Plus也不是十全十美的,比如启动时间慢,占用空间大,留有历史记录等等。其实我们可以利用Delphi打造一个完全符合自己要求的RealPlayer播放器。下面我将向大家介绍如何利用Delphi来帮助你实现这一愿望。但前提是:你的机器中必须装有RealPlayer Plus播放器,因为我们要用到其自带的ActiveX控件。
首先,我们要在Delphi中导入所需的ActiveX控件。点击菜单“Component→Import ActiveX Control...”打开“Import ActiveX”对话框,在“Import ActiveX”列表框中,我们可以看到Windows中所有注册的AxctiveX控件。选择其中的“RealPlayer ActiveX Control Library(Version 1.0)”控件。然后单击“Install”按钮。
回到Delphi主界面,你会发现在VCL面板中的ActiveX标签中增加了一个名为RealAudio的组件。我们先把它放入窗体中。不过在默认情况中RealAudio组件没有视频播放窗口,也就是只能播放声音。这是我们不愿看到的,这时我们可以在RealAudio组件的Controls属性中添加如下代码:
IMAGEWINDOW,CONTROLPANEL,STATUSBAR
其中:IMAGEWINDOW、CONTROLPANEL、STATUSBAR分别表示显示视频播放窗口、控制条状态条。
添加代码后,我们可以发现控件外观已经改变成了视频播放窗口形状。然后设置Align属性为alClient,使播放窗口可以随窗体的变化而变化,方便大家在观看影视动画时可以随意拉动播放窗口大小。
然后,在窗中加入TMainMenu组件、TOpenDialog组件各一个。用于选择并打开播放影视文件。双击TMainMenu组件,进入菜单设计器。在这里,我们要设计一个菜单项File,及其2个子菜单Open、Exit。设计完毕后:
双击Open添加如下代码:
if OpenDialog1.Execute then
begin
RealAudio1.source:=OpenDialog1.FileName;
RealAudio1.doplay; //打开并启动播放器
End;
双击Open添加如下代码:
Application.terminate; //终止程序运行
为了在打开一个文件时,便于用户选择文件,要将OpenDialog组件的Filter属性设置如下:所有媒体文件(*.rm,*.ram,*.ra,*.swf,*.mp3)|*.rm;*.ram;*.ra;*.swf;*.mp3|*.*|*.*。
最后就可以进行编译、运行。此程序在Windows Me,Delphi 5.0的环境中调试通过。如果朋友们有什么不解之处,可与我联系:[email][email protected][/email]。
用Delphi控制Windows的关闭功能
--------------------------------------------------------------------------------
我们经常会遇到在安装驱动程序或应用程序时,对系统配置进行了修改而必须重新启动Windows才能使设置生效,这时往往会弹出一个提示用户是否重新启动Windows的对话框。但有时又不希望关闭Windows,例如:一个程序正在工作,数据尚未保存,而另一个程序执行了“关闭Windows”的操作(如“网络蚂蚁”的定时关机功能),就会影响用户工作甚至造成数据丢失。此时,我们可在程序中设置防止关闭Windows的代码,只要本程序在运行中关闭Windows时,都将弹出对话框要求用户确认。
对于以上功能,我们完全可以通过编程来实现,下面就以Delphi编程来完成。
关闭(或重启)Windows
要关闭Windows,可利用API函数ExitWindowsEx(),它能够实现“注销当前用户”、“关闭Windows”以及“关闭Windows并重启”等功能,具体格式和用法如下:
ExitWindowsEx(关闭类型参数,系统保留参数);
其中,系统保留参数无特定意义,一般写0即可;关闭类型可以是以下几种:
EWX_FORCE:强制关闭,Windows不会发送任何消息给正运行的程序,这可能导致数据丢失;
EWX_LOGOFF:关闭所有正在运行的程序,注销当前用户并重新登录;
EWX_POWEROFF:关闭Windows并关机,当然,系统必须支持电源管理;
EWX_REBOOT:关闭Windows
请发表评论