リソース(TResourceStream) ~Delphiソースコード集
リソースを使うと外部ファイル(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に設定し、ファイルを保存します。