3. 実践的な応用例 2: ストリームを使用して実行可能な電子グリーティング カードを作成する
自分で写真を選択できる電子カード作成ソフトウェアをよく見かけますが、
EXE 実行可能ファイルが生成されます。グリーティングカードを開くと、音楽を再生しながら写真が表示されます。
ストリーム操作を学習したので、ストリーム操作を作成することもできます。
画像を追加するプロセスでは、前の Cjt_AddtoFile を直接使用できます。ここで行う必要があるのは、次の方法です。
画像を読み込んで表示します。先ほどの Cjt_LoadFromFile を使用して画像を読み出し、ファイルとして保存します。
転送することも可能ですが、より簡単な方法として、ファイルストリームを直接読み込んで表示する方法があります。
この強力なツールを使用すると、すべてが簡単になります。
現在最も人気のある写真は BMP 形式と JPG 形式です。今回はこの2種類の絵について書いていきます
読み取りおよび表示機能を終了します。
関数 Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):Boolean;
変数
ソース:TFileStream;
MyFileSize:整数;
始める
Source:=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:整数;
Myjpg: TJpegImage;
始める
試す
Myjpg:= TJpegImage.Create;
Source:=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.無料;
終わり;
を除外する
結果:=false;
出口;
終わり;
結果:= true;
終わり;
この 2 つの関数を使用して、読み出しプログラムを作成できます。 BMP 画像を例に挙げてみましょう。
Delphi を実行し、新しいプロジェクトを作成し、画像表示コントロール Image1 を配置します。ウィンドウ内で作成
イベントに一文を書くだけです。
Cjt_BmpLoad(画像1,アプリケーション.Exe名);
これはヘッダー ファイルであり、前述の方法を使用して head.res リソース ファイルを生成します。
これで、アドオン プログラムの作成を開始できます。コード全体は次のとおりです。
ユニットユニット1;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、クラス、グラフィックス、コントロール、フォーム、ダイアログ、
ExtCtrls、StdCtrls、ExtDlgs;
タイプ
TForm1 = クラス(TForm)
編集1: TEdit;
ボタン 1: T ボタン;
ボタン 2: T ボタン;
OpenPictureDialog1: TOpenPictureDialog;
PROcedure FormCreate(Sender: TObject);
プロシージャ Button1Click(送信者: TObject);
プロシージャ Button2Click(送信者: TObject);
プライベート
関数 ExtractRes(ResType, ResName, ResNewName : String):boolean;
関数 Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
{プライベート宣言}
公共
{公的宣言}
終わり;
変数
フォーム1: TForm1;
実装
{$R *.DFM}
関数 TForm1.ExtractRes(ResType, ResName, ResNewName : String):boolean;
変数
解像度 : TResourceStream;
始める
試す
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
試す
Res.SavetoFile(ResNewName);
結果:= true;
ついに
解像度無料。
終わり;
を除外する
結果:=false;
終わり;
終わり;
関数 TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
変数
ターゲット、ソース:TFileStream;
MyFileSize:整数;
始める
試す
Source:=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 デモ プログラム: 著者: Chen Jingtao';
Edit1.Text:=';
OpenPictureDialog1.DefaultExt := GraphicExtension(TBitmap);
OpenPictureDialog1.Filter := GraphicFilter(TBitmap);
Button1.Caption:='BMP 画像を選択';
Button2.Caption:='EXE を生成';
終わり;
プロシージャ TForm1.Button1Click(送信者: TObject);
始める
OpenPictureDialog1.Execute の場合
Edit1.Text:=OpenPictureDialog1.FileName;
終わり;
プロシージャ TForm1.Button2Click(送信者: TObject);
変数
HeadTemp:文字列;
始める
FileExists(Edit1.Text) の場合
始める
Application.MessageBox('BMP 画像ファイルが存在しません。もう一度選択してください!','メッセージ',MB_ICONINFORMATION+MB_OK)
出口;
終わり;
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)
それ以外
始める
FileExists(HeadTemp) の場合は、DeleteFile(HeadTemp);
Application.MessageBox('EXE ファイルの生成に失敗しました!','メッセージ',MB_ICONINFORMATION+MB_OK)
終わり;
終わり;
終わり。
どうでしょうか?素晴らしいです :) プログラムのインターフェースをより美しくし、いくつかの機能を追加すると、それがより優れていることがわかります。
登録が必要なソフトウェアよりもそれほど悪いことはありません。