3. การใช้งานจริง 2: การใช้สตรีมเพื่อสร้างบัตรอวยพรอิเล็กทรอนิกส์ที่ปฏิบัติการได้
เรามักจะเห็นซอฟต์แวร์สร้างการ์ดอิเล็กทรอนิกส์ที่ช่วยให้คุณสามารถเลือกรูปภาพได้ด้วยตัวเอง
มันจะสร้างไฟล์ปฏิบัติการ EXE สำหรับคุณ เมื่อคุณเปิดการ์ดอวยพร รูปภาพจะปรากฏขึ้นขณะเล่นเพลง
ตอนนี้เราได้เรียนรู้การดำเนินการของสตรีมแล้ว เราก็สามารถสร้างได้เช่นกัน
ในกระบวนการเพิ่มรูปภาพ เราสามารถใช้ Cjt_AddtoFile ก่อนหน้าได้โดยตรง และสิ่งที่เราต้องทำตอนนี้คือทำอย่างไร
รูปภาพจะถูกอ่านและแสดง เราใช้ Cjt_LoadFromFile ก่อนหน้าเพื่ออ่านภาพและบันทึกเป็นไฟล์
นอกจากนี้ยังสามารถถ่ายโอนข้อมูลเข้าไปได้ แต่มีวิธีที่ง่ายกว่าคืออ่านสตรีมไฟล์โดยตรงและแสดงด้วย
ด้วยเครื่องมืออันทรงพลังนี้ ทุกอย่างจะง่ายขึ้น
รูปภาพที่ได้รับความนิยมมากที่สุดในปัจจุบันคือรูปแบบ BMP และ JPG ตอนนี้เราจะเขียนเกี่ยวกับรูปภาพสองประเภทนี้
ออกจากฟังก์ชันการอ่านและการแสดงผล
ฟังก์ชัน Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):บูลีน;
var
ที่มา:TFileStream;
MyFileSize:จำนวนเต็ม;
เริ่ม
ที่มา:=TFileStream.Create(SourceFile,fmOpenRead หรือ fmShareDenyNone);
พยายาม
พยายาม
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//อ่านทรัพยากร
Source.Seek(-MyFileSize,soFromEnd);//ค้นหาตำแหน่งเริ่มต้นของทรัพยากร
ImgBmp.Picture.Bitmap.LoadFromStream (แหล่งที่มา);
ในที่สุด
แหล่งที่มาฟรี;
จบ;
ยกเว้น
ผลลัพธ์:=เท็จ;
ออก;
จบ;
ผลลัพธ์:=จริง;
จบ;
ด้านบนนี้เป็นฟังก์ชันสำหรับอ่านภาพ BMP และต่อไปนี้เป็นฟังก์ชันสำหรับอ่านภาพ JPG เนื่องจากมีการใช้หน่วย JPG
วิธีเพิ่มประโยคให้กับโปรแกรม: ใช้ jpeg
ฟังก์ชัน Cjt_JpgLoad(JpgImg:Timage;SourceFile:String):Boolean;
var
ที่มา:TFileStream;
MyFileSize:จำนวนเต็ม;
Myjpg: TJpegImage;
เริ่ม
พยายาม
Myjpg:= TJpegImage.Create;
ที่มา:=TFileStream.Create(SourceFile,fmOpenRead หรือ fmShareDenyNone);
พยายาม
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
Source.Seek(-MyFileSize,soFromEnd);
Myjpg.LoadFromStream(ที่มา);
JpgImg.Picture.Bitmap.Assign (Myjpg);
ในที่สุด
แหล่งที่มาฟรี;
Myjpg.free;
จบ;
ยกเว้น
ผลลัพธ์:=เท็จ;
ออก;
จบ;
ผลลัพธ์:=จริง;
จบ;
ด้วยฟังก์ชันทั้งสองนี้ เราสามารถสร้างโปรแกรมอ่านข้อมูลได้ ลองใช้รูปภาพ BMP เป็นตัวอย่าง:
เรียกใช้ Delphi สร้างโปรเจ็กต์ใหม่ และวางตัวควบคุมการแสดงรูปภาพ Image1 สร้างในหน้าต่าง
เพียงเขียนหนึ่งประโยคในเหตุการณ์:
Cjt_BmpLoad (รูปภาพ 1, แอปพลิเคชัน exeName);
นี่คือไฟล์ส่วนหัว จากนั้นเราใช้วิธีก่อนหน้าเพื่อสร้างไฟล์ทรัพยากร head.res
ตอนนี้เราสามารถเริ่มสร้างโปรแกรมเสริมของเราได้แล้ว รหัสทั้งหมดมีดังนี้:
หน่วย หน่วยที่ 1;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ,
ExtCtrls, StdCtrls, ExtDlgs;
พิมพ์
TForm1 = คลาส (TForm)
แก้ไข 1: TEdit;
Button1: T ปุ่ม;
Button2: T ปุ่ม;
OpenPictureDialog1: TOpenPictureDialog;
PROcedure FormCreate (ผู้ส่ง: TObject);
ขั้นตอน Button1Click (ผู้ส่ง: TObject);
ขั้นตอน Button2Click (ผู้ส่ง: TObject);
ส่วนตัว
ฟังก์ชัน ExtractRes(ResType, ResName, ResNewName : String):boolean;
ฟังก์ชัน Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
var
แบบฟอร์ม 1: TForm1;
การดำเนินการ
{$R *.DFM}
ฟังก์ชัน TForm1.ExtractRes (ResType, ResName, ResNewName : String): บูลีน;
var
Res : TResourceStream;
เริ่ม
พยายาม
Res := TResourceStream.Create (คำแนะนำ, Resname, Pchar (ResType));
พยายาม
Res.SavetoFile(ResNewName);
ผลลัพธ์:=จริง;
ในที่สุด
Res.ฟรี;
จบ;
ยกเว้น
ผลลัพธ์:=เท็จ;
จบ;
จบ;
ฟังก์ชัน TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
เป้าหมายแหล่งที่มา: TFileStream;
MyFileSize:จำนวนเต็ม;
เริ่ม
พยายาม
ที่มา:=TFileStream.Create(SourceFile,fmOpenRead หรือ fmShareExclusive);
เป้าหมาย:=TFileStream.Create(TargetFile,fmOpenWrite หรือ fmShareExclusive);
พยายาม
Target.Seek(0,soFromEnd);//เพิ่มทรัพยากรต่อท้าย
Target.CopyFrom(แหล่งที่มา,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);//คำนวณขนาดทรัพยากรและเขียนไว้ที่ส่วนท้ายของกระบวนการเสริม
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
ในที่สุด
เป้าหมายฟรี;
แหล่งที่มาฟรี;
จบ;
ยกเว้น
ผลลัพธ์:=เท็จ;
ออก;
จบ;
ผลลัพธ์:=จริง;
จบ;
ขั้นตอน TForm1.FormCreate (ผู้ส่ง: TObject);
เริ่ม
Caption:='โปรแกรมสาธิต Bmp2Exe ผู้แต่ง: Chen Jingtao';
แก้ไข1.ข้อความ:=';
OpenPictureDialog1.DefaultExt := GraphicExtension(TBitmap);
OpenPictureDialog1.Filter := GraphicFilter (TBitmap);
Button1.Caption:='เลือกรูปภาพ BMP';
Button2.Caption:='สร้าง EXE';
จบ;
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
เริ่ม
ถ้า OpenPictureDialog1.Execute แล้ว
แก้ไข1.ข้อความ:=OpenPictureDialog1.FileName;
จบ;
ขั้นตอน TForm1.Button2Click (ผู้ส่ง: TObject);
var
อุณหภูมิศีรษะ:สตริง;
เริ่ม
ถ้า FileExists(Edit1.Text) แล้ว
เริ่ม
Application.MessageBox('ไม่มีไฟล์รูปภาพ BMP โปรดเลือกอีกครั้ง!','ข้อความ',MB_ICONINFORMATION+MB_OK)
ออก;
จบ;
HeadTemp:=ChangeFileExt(Edit1.Text,'.exe');
ถ้า ExtractRes('exefile','head',HeadTemp) แล้ว
ถ้า Cjt_AddtoFile(Edit1.Text,HeadTemp) แล้ว
Application.MessageBox('สร้างไฟล์ EXE สำเร็จ!','ข้อความ',MB_ICONINFORMATION+MB_OK)
อื่น
เริ่ม
ถ้า FileExists(HeadTemp) แล้ว DeleteFile(HeadTemp);
Application.MessageBox('การสร้างไฟล์ EXE ล้มเหลว!','ข้อความ',MB_ICONINFORMATION+MB_OK)
จบ;
จบ;
จบ.
แล้วไงล่ะ? มันน่าทึ่งมาก :) ทำให้อินเทอร์เฟซของโปรแกรมสวยงามขึ้นและเพิ่มฟังก์ชั่นบางอย่างเข้าไปคุณจะพบว่ามันดีกว่า
มันจะไม่แย่ไปกว่าซอฟต์แวร์ที่ต้องลงทะเบียนมากนัก