3. Практическое применение 2. Использование потоков для создания исполняемых электронных поздравительных открыток.
Мы часто видим программное обеспечение для создания электронных открыток, которое позволяет вам самостоятельно выбирать изображения, а затем
Он сгенерирует для вас исполняемый EXE-файл. Когда вы откроете поздравительную открытку, изображение будет отображаться во время воспроизведения музыки.
Теперь, когда мы изучили потоковые операции, мы тоже можем их создать.
В процессе добавления изображений мы можем напрямую использовать предыдущий Cjt_AddtoFile, и теперь нам нужно сделать, как
Изображение считывается и отображается. Мы используем предыдущий Cjt_LoadFromFile, чтобы считывать изображение и сохранять его в виде файла.
Также возможен перенос, но есть более простой способ — напрямую прочитать поток файлов и отобразить его с помощью.
С этим мощным инструментом все становится проще.
Наиболее популярными изображениями в настоящее время являются форматы BMP и JPG. Об этих двух видах картинок мы сейчас и напишем.
Выйдите из функции чтения и отображения.
Функция Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):Boolean;
вар
Источник: 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;
вар
Источник: TFileStream;
MyFileSize: целое число;
Мойjpg: 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);
окончательно
Источник.Бесплатно;
Мойjpg.free;
конец;
кроме
Результат: = ложь;
Выход;
конец;
Результат:=истина;
конец;
С помощью этих двух функций мы можем создать программу считывания. В качестве примера возьмем BMP-фотографии:
Запустите Delphi, создайте новый проект и поместите элемент управления отображением изображений Image1. Создать в окне
Просто напишите одно предложение по событию:
Cjt_BmpLoad(Image1,application.ExeName);
Это файл заголовка, а затем мы используем предыдущий метод для создания файла ресурсов head.res.
Теперь мы можем приступить к созданию нашей дополнительной программы. Весь код выглядит следующим образом:
блок Unit1;
интерфейс
использует
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги,
ExtCtrls, StdCtrls, ExtDlgs;
тип
ТФорм1 = класс (ТФорма)
Edit1: TEdit;
Кнопка1: Кнопка T;
Кнопка2: Кнопка T;
OpenPictureDialog1: TOpenPictureDialog;
PROcedure FormCreate (Отправитель: TObject);
процедура Button1Click (Отправитель: TObject);
процедура Button2Click (Отправитель: TObject);
частный
Функция ExtractRes(ResType, ResName, ResNewName: String):boolean;
Функция Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
{Частные заявления}
общественный
{Публичные заявления}
конец;
вар
Форма1: ТФорм1;
выполнение
{$R *.DFM}
Функция TForm1.ExtractRes(ResType, ResName, ResNewName: String):boolean;
вар
Res: TResourceStream;
начинать
пытаться
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
пытаться
Res.SavetoFile(ResNewName);
Результат:=истина;
окончательно
Рез.Бесплатно;
конец;
кроме
Результат: = ложь;
конец;
конец;
Функция TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
вар
Цель, Источник: TFileStream;
MyFileSize: целое число;
начинать
пытаться
Источник:=TFileStream.Create(SourceFile,fmOpenRead или fmShareExclusive);
Target:=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. Автор: Чэнь Цзинтао';
Edit1.Text:=';
OpenPictureDialog1.DefaultExt := GraphicExtension(TBitmap);
OpenPictureDialog1.Filter := GraphicFilter(TBitmap);
Button1.Caption:='Выбрать изображение в формате BMP';
Button2.Caption:='Создать EXE';
конец;
процедура TForm1.Button1Click(Отправитель: TObject);
начинать
если OpenPictureDialog1.Выполнить, то
Edit1.Text:=OpenPictureDialog1.FileName;
конец;
процедура TForm1.Button2Click(Отправитель: TObject);
вар
ХедТемп:Строка;
начинать
если 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)
конец;
конец;
конец.
Как насчет этого? Это потрясающе :) Сделайте интерфейс программы красивее и добавьте несколько функций, вы обнаружите, что это лучше, чем
Это будет не намного хуже того ПО, которое нужно регистрировать.