Delphiでお手軽プログラミング

Delphiでお手軽プログラミングメニュー

Delphiでリソースを使う ~ TResourceStream,TJPEGImage,SHGetSpecialFolderPath,CreateOleObject

リソースを使うと実行ファイルに外部ファイルを含めることが出来ます。
リソースにjpgファイルとxlsxファイルを含め、自身の実行ファイルからリソースを取り出して利用するサンプルを示します。


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」ボタンを押してウィンドウを閉じます。

3.ソースコードの記述

リソースから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.

4.実行する

メニューから「実行」⇒「実行」をクリックすると、コンパイルと実行が行われます。

Button1をクリックすると、リソースからファイルを読み込み、Image1にjpg画像が表示されます。



Button2をクリックするとリ、ソースからファイルを読み込み、デスクトップにtext.xlsxファイルとして保存し、 Microsoft社エクセルからこのファイルを起動しセル範囲A3:J12([3,1]-[12,10])の値を10に設定し、ファイルを保存します。

Copyright 2021 Mam