📄 “流”的利用--可执行电子贺卡.htm
字号:
<HTML><HEAD><TITLE>谈Delphi编程中“流”的利用</TITLE>
<META content=en-us http-equiv=Content-Language>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE>
BODY {BACKGROUND-COLOR: #ffffff; COLOR: #336633; FONT-SIZE: 12px; FONT-WEIGHT: normal; LINE-HEIGHT: 16px; link: #339966; vlink: #339966}
P {FONT-SIZE: 12px; FONT-WEIGHT: normal; LINE-HEIGHT: 150%}
BR {FONT-SIZE: 12px; FONT-WEIGHT: normal; LINE-HEIGHT: 150%}
SELECT {FONT-SIZE: 12px}
FORM {FONT-SIZE: 12px; MARGIN-BOTTOM: 0px}
TD {FONT-SIZE: 12px; LINE-HEIGHT: 150%}
B {FONT-WEIGHT: bold}
A:link {COLOR: #336633}
A:visited {COLOR: #336633}
A:hover {TEXT-DECORATION: underline}
.font12px {FONT-SIZE: 12px; LINE-HEIGHT: 16pt}
</STYLE>
</HEAD>
<BODY>
<DIV align=center>
<CENTER>
<TABLE bgColor=#c8ffc8 border=1 borderColor=#c8ccc8 height="80%" width="93%">
<TBODY>
<TR>
<TD bgColor=#d0ffd0 borderColor=#00ff00 height=16 vAlign=top
width=593><FONT color=#306830> 建议分辨率:800X600</FONT></TD></TR>
<TR>
<TD bgColor=#f0fff0 borderColor=#f0fff0 height=366 vAlign=top width=593>
<p align=center>谈Delphi编程中“流”的利用--可执行电子贺卡</p>
<p align=center>陈经韬</p>
三、实际应用之二:利用流制作可执行电子贺卡<BR>
<BR>
我们经常看到一些电子贺卡之类的制作软件,可以让你自己选择图片,然后它会生成一个EXE可执行文件给你。打开贺卡时就会一边放音乐一边显示出图片来。现在学了流操作之后,我们也可以做一个了。 <BR>
添加图片过程我们可以直接用前面的Cjt_AddtoFile,而现在要做的是如何把图像读出并显示。我们用前面的Cjt_LoadFromFile先把图片读出来保存为文件再调入也是可以的,但是还有更简单的方法,就是直接把文件流读出来显示,有了流这个利器,一切都变的简单了。<BR>
现在的图片比较流行的是BMP格式和JPG格式。我们现在就针对这两种图片写出读取并显示函数。<BR><BR>Function
Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):Boolean;<BR>var<BR>Source:TFileStream;<BR>MyFileSize:integer;<BR>begin<BR>Source:=TFileStream.Create(SourceFile,fmOpenRead
or
fmShareDenyNone);<BR>try<BR>try<BR>Source.Seek(-sizeof(MyFileSize),soFromEnd);<BR>Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源<BR>Source.Seek(-MyFileSize,soFromEnd);//定位到资源开始位置<BR>ImgBmp.Picture.Bitmap.LoadFromStream(Source);<BR>finally<BR>Source.Free;<BR>end;<BR>except<BR>Result:=False;<BR>Exit;<BR>end;<BR>Result:=True;<BR>end;<BR>
上面是读出BMP图片的,下面的是读出JPG图片的函数,因为要用到JPG单元,所以要在程序中添加一句:uses
jpeg。<BR><BR>Function
Cjt_JpgLoad(JpgImg:Timage;SourceFile:String):Boolean;<BR>var<BR>Source:TFileStream;<BR>MyFileSize:integer;<BR>Myjpg:
TJpegImage;<BR>begin<BR>try<BR>Myjpg:=
TJpegImage.Create;<BR>Source:=TFileStream.Create(SourceFile,fmOpenRead or
fmShareDenyNone);<BR>try<BR>Source.Seek(-sizeof(MyFileSize),soFromEnd);<BR>Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));<BR>Source.Seek(-MyFileSize,soFromEnd);<BR>Myjpg.LoadFromStream(Source);<BR>JpgImg.Picture.Bitmap.Assign(Myjpg);<BR>finally<BR>Source.Free;<BR>Myjpg.free;<BR>end;<BR>except<BR>Result:=false;<BR>Exit;<BR>end;<BR>Result:=true;<BR>end;<BR>
有了这两个函数,我们就可以制作读出程序了。下面我们以BMP图片为例:<BR>
运行Delphi,新建一个工程,放上一个显示图像控件Image1。在窗口的Create事件中写上一句就可以了:<BR>Cjt_BmpLoad(Image1,Application.ExeName);<BR>
这个就是头文件了,然后我们用前面的方法生成一个head.res资源文件。<BR>下面就可以开始制作我们的添加程序了。全部代码如下:<BR>unit
Unit1;<BR><BR>interface<BR><BR>uses<BR>Windows, Messages, SysUtils,
Classes, Graphics, Controls, Forms, Dialogs,<BR>ExtCtrls, StdCtrls,
ExtDlgs;<BR><BR>type<BR>TForm1 = class(TForm)<BR>Edit1: TEdit;<BR>Button1:
TButton;<BR>Button2: TButton;<BR>OpenPictureDialog1:
TOpenPictureDialog;<BR>procedure FormCreate(Sender: TObject);<BR>procedure
Button1Click(Sender: TObject);<BR>procedure Button2Click(Sender:
TObject);<BR>private<BR>Function ExtractRes(ResType, ResName, ResNewName :
String):boolean;<BR>Function
Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;<BR>{ Private
declarations }<BR>public<BR>{ Public declarations
}<BR>end;<BR><BR>var<BR>Form1: TForm1;<BR><BR>implementation<BR><BR>{$R
*.DFM}<BR>Function TForm1.ExtractRes(ResType, ResName, ResNewName :
String):boolean;<BR>var<BR>Res : TResourceStream;<BR>begin<BR>try<BR>Res
:= TResourceStream.Create(Hinstance, Resname,
Pchar(ResType));<BR>try<BR>Res.SavetoFile(ResNewName);<BR>Result:=true;<BR>finally<BR>Res.Free;<BR>end;<BR>except<BR>Result:=false;<BR>end;<BR>end;<BR>Function
TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;<BR>var<BR>Target,Source:TFileStream;<BR>MyFileSize:integer;<BR>begin<BR>try<BR>Source:=TFileStream.Create(SourceFile,fmOpenRead
or fmShareExclusive);<BR>Target:=TFileStream.Create(TargetFile,fmOpenWrite
or
fmShareExclusive);<BR>try<BR>Target.Seek(0,soFromEnd);//往尾部添加资源<BR>Target.CopyFrom(Source,0);<BR>MyFileSize:=Source.Size+Sizeof(MyFileSize);//计算资源大小,并写入辅程尾部<BR>Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));<BR>finally<BR>Target.Free;<BR>Source.Free;<BR>end;<BR>except<BR>Result:=False;<BR>Exit;<BR>end;<BR>Result:=True;<BR>end;<BR>procedure
TForm1.FormCreate(Sender:
TObject);<BR>begin<BR>Caption:='Bmp2Exe演示程序.作者:陈经韬';<BR>Edit1.Text:='';<BR>OpenPictureDialog1.DefaultExt
:= GraphicExtension(TBitmap);<BR>OpenPictureDialog1.Filter :=
GraphicFilter(TBitmap);<BR><BR>Button1.Caption:='选择BMP图片';<BR>Button2.Caption:='生成EXE';<BR>end;<BR><BR>procedure
TForm1.Button1Click(Sender: TObject);<BR>begin<BR>if
OpenPictureDialog1.Execute
then<BR>Edit1.Text:=OpenPictureDialog1.FileName;<BR>end;<BR><BR>procedure
TForm1.Button2Click(Sender:
TObject);<BR>var<BR>HeadTemp:String;<BR>begin<BR>if Not
FileExists(Edit1.Text)
then<BR>begin<BR>Application.MessageBox('BMP图片文件不存在,请重新选择!','信息',MB_ICONINFORMATION+MB_OK)<BR>Exit;<BR>end;<BR>HeadTemp:=ChangeFileExt(Edit1.Text,'.exe');<BR>if
ExtractRes('exefile','head',HeadTemp) then<BR>if
Cjt_AddtoFile(Edit1.Text,HeadTemp)
then<BR>Application.MessageBox('EXE文件生成成功!','信息',MB_ICONINFORMATION+MB_OK)<BR>else<BR>begin<BR>if
FileExists(HeadTemp) then
DeleteFile(HeadTemp);<BR>Application.MessageBox('EXE文件生成失败!','信息',MB_ICONINFORMATION+MB_OK)<BR>end;<BR>end;<BR>end.<BR>
怎么样?很神奇吧:)把程序界面弄的漂亮点,再添加一些功能,你会发现比起那些要注册的软件来也不会逊多少吧。<BR>-----------------------------------------------------------------------<BR>
</TD>
</TR>
<TR>
<TD bgColor=#d0ffd0 borderColor=#f0fff0 height=1 vAlign=top
width=593>
©CopyRight
2000</TD></TR></TBODY></TABLE></CENTER></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -