a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Delphi > 正文

動態賀卡EXE生成器---Delphi中流的應用(9)

2019-11-18 18:48:25
字體:
來源:轉載
供稿:網友

三、實際應用之二:利用流制作可執行電子賀卡

    我們經常看到一些電子賀卡之類的制作軟件,可以讓你自己選擇圖片,然后
它會生成一個EXE可執行文件給你。打開賀卡時就會一邊放音樂一邊顯示出圖片來。
現在學了流操作之后,我們也可以做一個了。  
   添加圖片過程我們可以直接用前面的Cjt_AddtoFile,而現在要做的是如何把
圖像讀出并顯示。我們用前面的Cjt_LoadFromFile先把圖片讀出來保存為文件再
調入也是可以的,但是還有更簡單的方法,就是直接把文件流讀出來顯示,有了
流這個利器,一切都變的簡單了。
    現在的圖片比較流行的是BMP格式和JPG格式。我們現在就針對這兩種圖片寫
出讀取并顯示函數。

Function Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):Boolean;
var
 Source:TFileStream;
 MyFileSize:integer;
begin
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//讀出資源
Source.Seek(-MyFileSize,soFromEnd);//定位到資源開始位置
ImgBmp.Picture.Bitmap.LoadFromStream(Source);
finally
Source.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
end;
  上面是讀出BMP圖片的,下面的是讀出JPG圖片的函數,因為要用到JPG單元,所
以要在程序中添加一句:uses jpeg。

Function Cjt_JpgLoad(JpgImg:Timage;SourceFile:String):Boolean;
var
 Source:TFileStream;
MyFileSize:integer;
 Myjpg: TJpegImage;
begin
try
Myjpg:= TJpegImage.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
Source.Seek(-MyFileSize,soFromEnd);
Myjpg.LoadFromStream(Source);
JpgImg.Picture.Bitmap.Assign(Myjpg);
finally
Source.Free;
Myjpg.free;
end;
except
Result:=false;
Exit;
end;
Result:=true;
end;
  有了這兩個函數,我們就可以制作讀出程序了。下面我們以BMP圖片為例:
  運行Delphi,新建一個工程,放上一個顯示圖像控件Image1。在窗口的Create
事件中寫上一句就可以了:
   Cjt_BmpLoad(Image1,application.ExeName);
  這個就是頭文件了,然后我們用前面的方法生成一個head.res資源文件。
下面就可以開始制作我們的添加程序了。全部代碼如下:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, ExtDlgs;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    PRocedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  Function ExtractRes(ResType, ResName, ResNewName : String):boolean;
  Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
Function TForm1.ExtractRes(ResType, ResName, ResNewName : String):boolean;
var
Res : TResourceStream;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(ResNewName);
Result:=true;
finally
Res.Free;
end;
except
Result:=false;
end;
end;
Function TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
Target,Source:TFileStream;
MyFileSize:integer;
begin
try
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive);
Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive);
try
Target.Seek(0,soFromEnd);//往尾部添加資源
Target.CopyFrom(Source,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);//計算資源大小,并寫入輔程尾部
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
finally
Target.Free;
Source.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption:='Bmp2Exe演示程序.作者:陳經韜';
Edit1.Text:=';
OpenPictureDialog1.DefaultExt := GraphicExtension(TBitmap);
OpenPictureDialog1.Filter := GraphicFilter(TBitmap);

Button1.Caption:='選擇BMP圖片';
Button2.Caption:='生成EXE';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
   Edit1.Text:=OpenPictureDialog1.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 HeadTemp:String;
begin
if FileExists(Edit1.Text) then
   begin
    Application.MessageBox('BMP圖片文件不存在,請重新選擇!','信息',MB_ICONINFORMATION+MB_OK)
    Exit;
   end;
 HeadTemp:=ChangeFileExt(Edit1.Text,'.exe');
 if ExtractRes('exefile','head',HeadTemp) then
     if Cjt_AddtoFile(Edit1.Text,HeadTemp) then
         Application.MessageBox('EXE文件生成成功!','信息',MB_ICONINFORMATION+MB_OK)
 else
     begin
      if FileExists(HeadTemp) then DeleteFile(HeadTemp);
      Application.MessageBox('EXE文件生成失敗!','信息',MB_ICONINFORMATION+MB_OK)
     end;
end;
end.
   怎么樣?很神奇吧:)把程序界面弄的漂亮點,再添加一些功能,你會發現比
起那些要注冊的軟件來也不會遜多少吧。


上一篇:探究:如何判斷Delphi中的對象指針是否可用

下一篇:截獲Delphi中的異常

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 欧美成人一区二区三区片免费 | 在线观看视频一区 | 国产精品极品美女在线观看免费 | 一区二区三区国产 | 国产精品国产自产拍高清 | 99国产精品 | 国产三区在线成人av | 欧美日韩一区二区在线观看 | 在线观看欧美一区 | av国产在线被下药迷网站 | 精品国产乱码久久久久久蜜臀 | 欧美亚洲一区二区三区 | 久久精品色欧美aⅴ一区二区 | 色婷婷综合在线 | 国产青草视频在线观看视频 | 午夜久久 | 欧美精品一区二区三区在线 | 国产精品精品视频一区二区三区 | 国产美女在线观看免费 | 久久久久久久一区 | 久久一区国产 | 国产日韩欧美久久 | 成人欧美一区二区三区黑人 | 玖玖玖视频 | 国产精品一区二区吃奶在线观看 | 欧美一区二区在线免费观看 | 九九热在线免费视频 | 国产在线导航 | 国产精品对白一区二区三区 | www.国产精 | 亚洲精品久久久久久久久久久 | 久久久久久久久久久久久久久 | 在线视频亚洲 | 91久久久久| 亚洲免费在线视频 | 国产成人精品久久二区二区91 | av青青| 久久久久久亚洲 | 久久精品99国产精品亚洲最刺激 | 黄色欧美一级片 | 欧美一区二区三区久久精品 |