3. التطبيق العملي 2: استخدام التدفقات لإنشاء بطاقات تهنئة إلكترونية قابلة للتنفيذ
غالبًا ما نرى بعض برامج صنع البطاقات الإلكترونية التي تسمح لك باختيار الصور بنفسك، وبعد ذلك
سيقوم بإنشاء ملف EXE قابل للتنفيذ لك. عند فتح بطاقة التهنئة، سيتم عرض الصورة أثناء تشغيل الموسيقى.
الآن بعد أن تعلمنا عمليات الدفق، يمكننا أيضًا إنشاء واحدة.
في عملية إضافة الصور، يمكننا استخدام Cjt_AddtoFile السابق مباشرة، وما يتعين علينا القيام به الآن هو كيفية
تتم قراءة الصورة وعرضها. نستخدم Cjt_LoadFromFile السابق لقراءة الصورة وحفظها كملف.
من الممكن أيضًا النقل، ولكن هناك طريقة أبسط، وهي قراءة تدفق الملف مباشرةً وعرضه
مع هذه الأداة القوية، يصبح كل شيء أسهل.
الصور الأكثر شيوعًا في الوقت الحاضر هي تنسيق BMP وتنسيق JPG. وسنكتب الآن عن هذين النوعين من الصور
اخرج من وظيفة القراءة والعرض.
الوظيفة Cjt_BmpLoad(ImgBmp:TIImage;SourceFile:String):Boolean;
فار
المصدر:TFileStream;
MyFileSize:integer;
يبدأ
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
يحاول
يحاول
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));// قراءة الموارد
Source.Seek(-MyFileSize,soFromEnd);// حدد موقع البداية للمورد
ImgBmp.Picture.Bitmap.LoadFromStream(Source);
أخيراً
المصدر.مجاني؛
نهاية؛
يستثني
النتيجة:=خطأ؛
مخرج؛
نهاية؛
النتيجة:=صحيح؛
نهاية؛
ما ورد أعلاه هو وظيفة لقراءة صور BMP، وما يلي هو وظيفة لقراءة صور JPG، لأنه يتم استخدام وحدات JPG
لإضافة جملة إلى البرنامج: يستخدم jpeg.
الوظيفة Cjt_JpgLoad(JpgImg:Timage;SourceFile:String):Boolean;
فار
المصدر:TFileStream;
MyFileSize:integer;
Myjpg: TJpegImage;
يبدأ
يحاول
Myjpg:= TJpegImage.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
يحاول
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
Source.Seek(-MyFileSize,soFromEnd);
Myjpg.LoadFromStream(Source);
JpgImg.Picture.Bitmap.Assign(Myjpg);
أخيراً
المصدر.مجاني؛
Myjpg.free;
نهاية؛
يستثني
النتيجة:=خطأ؛
مخرج؛
نهاية؛
النتيجة:=صحيح؛
نهاية؛
باستخدام هاتين الوظيفتين، يمكننا إنشاء برنامج قراءة. لنأخذ صور BMP كمثال:
قم بتشغيل دلفي، وأنشئ مشروعًا جديدًا، ثم ضع عنصر التحكم في عرض الصور Image1. إنشاء في النافذة
فقط اكتب جملة واحدة في الحدث:
Cjt_BmpLoad(Image1,application.ExeName);
هذا هو ملف الرأس، ثم نستخدم الطريقة السابقة لإنشاء ملف مورد head.res.
الآن يمكننا البدء في إنشاء برنامجنا الإضافي. الكود بأكمله هو كما يلي:
الوحدة 1؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار،
ExtCtrls، StdCtrls، ExtDlgs؛
يكتب
TForm1 = الفئة (TForm)
تحرير 1: تحرير؛
Button1: TButton؛
Button2: TButton؛
OpenPictureDialog1: TOpenPictureDialog;
PROcedure FormCreate(Sender: TObject);
الإجراء Button1Click(Sender: TObject);
الإجراء Button2Click(Sender: TObject);
خاص
الدالة ExtractRes(ResType, ResName, ResNewName: String): boolean;
الوظيفة Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
{تصريحات خاصة}
عام
{التصريحات العامة}
نهاية؛
فار
Form1: TForm1؛
تطبيق
{$R *.DFM}
الوظيفة TForm1.ExtractRes(ResType, ResName, ResNewName : String): boolean;
فار
الدقة: تريسورسستريم؛
يبدأ
يحاول
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
يحاول
Res.SavetoFile(ResNewName);
النتيجة:=صحيح؛
أخيراً
الدقة.مجاني؛
نهاية؛
يستثني
النتيجة:=خطأ؛
نهاية؛
نهاية؛
الدالة TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
فار
الهدف، المصدر: TFileStream؛
MyFileSize:integer;
يبدأ
يحاول
المصدر:=TFileStream.Create(SourceFile,fmOpenRead أو fmShareExclusive);
Target:=TFileStream.Create(TargetFile,fmOpenWrite أو fmShareExclusive);
يحاول
Target.Seek(0,soFromEnd);// أضف الموارد إلى النهاية
Target.CopyFrom(Source,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);// احسب حجم المورد واكتبه في نهاية العملية المساعدة
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
أخيراً
Target.Free;
المصدر.مجاني؛
نهاية؛
يستثني
النتيجة:=خطأ؛
مخرج؛
نهاية؛
النتيجة:=صحيح؛
نهاية؛
الإجراء TForm1.FormCreate(Sender: TObject);
يبدأ
Caption:='برنامج العرض التوضيحي Bmp2Exe المؤلف: Chen Jingtao';
تحرير1.النص:=';
OpenPictureDialog1.DefaultExt := GraphicExtension(TBitmap);
OpenPictureDialog1.Filter := GraphicFilter(TBitmap);
Button1.Caption:='اختر صورة BMP';
Button2.Caption:='إنشاء EXE';
نهاية؛
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
إذا OpenPictureDialog1.Execute بعد ذلك
Edit1.Text:=OpenPictureDialog1.FileName;
نهاية؛
الإجراء TForm1.Button2Click(Sender: TObject);
فار
HeadTemp:String;
يبدأ
إذا FileExists(Edit1.Text) ثم
يبدأ
Application.MessageBox('ملف صورة BMP غير موجود، يرجى التحديد مرة أخرى!','Message',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) ثم حذف File(HeadTemp);
Application.MessageBox('فشل إنشاء ملف EXE!','رسالة',MB_ICONINFORMATION+MB_OK)
نهاية؛
نهاية؛
نهاية.
ماذا عن ذلك؟ إنه لأمر مدهش :) اجعل واجهة البرنامج أجمل وأضف بعض الوظائف، ستجد أنه أفضل من
لن يكون الأمر أسوأ بكثير من تلك البرامج التي تحتاج إلى التسجيل.