DelphiでTResourceStreamを使ってJPEG画像とExcelファイルを埋め込む方法|OLE操作付き実用サンプル
リソースを使うと外部ファイル(jpgファイルやxlsxファイルなど)をコンパイルした実行ファイルに含ませる事ができます。
実行ファイルのリソースに入れたファイルはTResourceStreamを使って取り出すことができます。
1.事前準備
(1)JPEG画像ファイルを準備します[img.jpg](何でもよい)
(2)エクセルファイルを準備します[test.xlsx](何でもよい)
2.プロジェクトを作成する
Delphiを起動し、メニューから「ファイル」⇒「新規作成」⇒「Windows VCLアプリケーション -Delphi(W)」 をクリックする。
フォームに TButton を2個、 TImage を1個 ドラッグ&ドロップします。
メニューから「ファイル」⇒「すべて保存」をクリックします。
3.リソースの取り込み
メニューから、「プロジェクト(P)」⇒「リソースと画像」をクリックします。
「追加(A)」ボタンを押して、JPEGファイルとXLSXファイルを追加します。
JPEGファイルとXLSXファイルを追加すると以下のようになります。 「OK」ボタンを押してウィンドウを閉じます。
4.ソースコードの記述
リソースからjpegファイルをストリームに取り出して、Image1に表示するソースコードを記述します。
「Button1」をダブルクリックし、エディタに切り替わったら
以下赤字部分のソースコードを記述します。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses VCL.Imaging.jpeg, Winapi.ShlObj,System.Win.ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
rs:TResourceStream;
jpg:TJPEGImage;
begin
Image1.Proportional:=True;
Image1.Stretch:=True;
jpg:=TJPEGImage.Create;
//リソースからjpegファイルを取り出す
rs:=TResourceStream.Create(HInstance, 'JpgImage_1', RT_RCDATA);
try
jpg.LoadFromStream(rs);
Image1.Picture.Assign(jpg);
finally
jpg.Free;
rs.Free;
end;
end;
end.
IDEの右下にある「デザイン」タブ(キーボードのF12でも切り替わります)を押して、
デザイン画面に切り替えます。
「Button2」をダブルクリックし、エディタに切り替わったら
以下赤字部分のソースコードを記述します。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses VCL.Imaging.jpeg, Winapi.ShlObj,System.Win.ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
rs:TResourceStream;
jpg:TJPEGImage;
begin
Image1.Proportional:=True;
Image1.Stretch:=True;
jpg:=TJPEGImage.Create;
//リソースからjpegファイルを取り出す
rs:=TResourceStream.Create(HInstance, 'JpgImage_1', RT_RCDATA);
try
jpg.LoadFromStream(rs);
Image1.Picture.Assign(jpg);
finally
jpg.Free;
rs.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
pw:PWideChar;
path:string;
rs:TResourceStream;
ex:OleVariant;
wb:OleVariant;
ws:OleVariant;
begin
//デスクトップフォルダのパスを取得する
GetMem(pw,4096);
try
SHGetSpecialFolderPath(Self.Handle, pw, CSIDL_DESKTOP, false);
path:=pw;
finally
FreeMem(pw);
end;
//デスクトップフォルダ\test.xlsxを設定
path:=path+'\test.xlsx';
//リソースからxlsxファイルの取り出し
rs:=TResourceStream.Create(HInstance,'Resource_1',RT_RCDATA);
try
//リソースをファイルとして保存する
rs.SaveToFile(path);
finally
rs.Free;
end;
//エクセルを起動する
ex:=CreateOleObject('excel.Application');
//ワークブックを開く
wb:=ex.workbooks.open(path);
ex.visible:=True;
//一番最初(左)のワークシートを取得(エクセルは添え字が1から始まる)
ws:=wb.worksheets[1];
//セル範囲に「10」を設定する
ws.range[ ws.cells[3,1],ws.cells[12,10] ]:=10;
//ワークブックを保存する
wb.save;
ws:=Null;
wb:=Null;
ex:=Null;
end;
end.
5.実行する
メニューから「実行」⇒「実行」をクリックすると、コンパイルと実行が行われます。
Button1をクリックすると、リソースからファイルを読み込み、Image1にjpg画像が表示されます。
Button2をクリックするとリ、ソースからファイルを読み込み、デスクトップにtext.xlsxファイルとして保存し、 Microsoft社エクセルからこのファイルを起動しセル範囲A3:J12([3,1]-[12,10])の値を10に設定し、ファイルを保存します。
