3. 실제 적용 2: 스트림을 사용하여 실행 가능한 전자 인사말 카드 만들기
우리는 종종 사진을 직접 선택할 수 있는 전자 카드 제작 소프트웨어를 봅니다.
EXE 실행 파일이 생성됩니다. 축하 카드를 열면 음악이 재생되면서 사진이 표시됩니다.
이제 스트림 작업을 배웠으므로 만들 수도 있습니다.
사진을 추가하는 과정에서 기존의 Cjt_AddtoFile을 직접 사용할 수 있는데, 이제 해야 할 일은 다음과 같습니다.
이미지를 읽고 표시합니다. 이전 Cjt_LoadFromFile을 사용하여 이미지를 읽고 파일로 저장합니다.
전송도 가능하지만, 파일 스트림을 직접 읽고 표시하는 더 간단한 방법이 있습니다.
이 강력한 도구를 사용하면 모든 것이 더 쉬워집니다.
요즘 가장 인기 있는 사진은 BMP 형식과 JPG 형식입니다. 이제 우리는 이 두 종류의 그림에 대해 글을 쓸 것입니다
읽기 및 표시 기능을 종료합니다.
함수 Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):Boolean;
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:정수;
내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;
끝;
제외하고
결과:=거짓;
출구;
끝;
결과:=true;
끝;
이 두 가지 기능을 사용하여 판독 프로그램을 만들 수 있습니다. BMP 사진을 예로 들어보겠습니다.
Delphi를 실행하고 새 프로젝트를 만든 다음 이미지 디스플레이 컨트롤 Image1을 배치합니다. 창에서 생성
이벤트에 한 문장만 작성해 주세요.
Cjt_BmpLoad(이미지1,application.ExeName);
이것이 헤더 파일이고, 이전 방법을 사용하여 head.res 리소스 파일을 생성합니다.
이제 추가 기능 프로그램 만들기를 시작할 수 있습니다. 전체 코드는 다음과 같습니다.
단위 Unit1;
인터페이스
용도
Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자,
ExtCtrls, StdCtrls, ExtDlgs;
유형
TForm1 = 클래스(TForm)
편집1: T편집;
버튼1: T버튼;
Button2: T버튼;
OpenPictureDialog1: TOpenPictureDialog;
PROcedure FormCreate(Sender: TObject);
절차 Button1Click(보내는 사람: TObject);
절차 Button2Click(보내는 사람: TObject);
사적인
함수 ExtractRes(ResType, ResName, ResNewName : String):boolean;
함수 Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
{비공개 선언}
공공의
{공개 선언}
끝;
var
Form1: TForm1;
구현
{$R *.DFM}
함수 TForm1.ExtractRes(ResType, ResName, ResNewName : String):boolean;
var
해상도: TResourceStream;
시작하다
노력하다
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
노력하다
Res.SavetoFile(ResNewName);
결과:=true;
마지막으로
해상도 무료;
끝;
제외하고
결과:=거짓;
끝;
끝;
함수 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(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);
var
헤드온도:문자열;
시작하다
if FileExists(Edit1.Text) 다음
시작하다
Application.MessageBox('BMP 이미지 파일이 없습니다. 다시 선택하십시오!','Message',MB_ICONINFORMATION+MB_OK)
출구;
끝;
HeadTemp:=ChangeFileExt(Edit1.Text,'.exe');
if ExtractRes('exefile','head',HeadTemp) 그러면
if Cjt_AddtoFile(Edit1.Text,HeadTemp) 다음
Application.MessageBox('EXE 파일이 성공적으로 생성되었습니다!','메시지',MB_ICONINFORMATION+MB_OK)
또 다른
시작하다
if FileExists(HeadTemp) then DeleteFile(HeadTemp);
Application.MessageBox('EXE 파일 생성에 실패했습니다!','Message',MB_ICONINFORMATION+MB_OK)
끝;
끝;
끝.
어때요? 놀랍습니다 :) 프로그램 인터페이스를 더 아름답게 만들고 일부 기능을 추가하면 다음보다 낫다는 것을 알게 될 것입니다.
등록해야 하는 소프트웨어보다 훨씬 나쁘지는 않습니다.