Delphi Programming / Object Pascal
[掲載 2022年11月18日] [更新 2022年11月19日] Delphi サンプルプログラム集 |
093_実行時に TImageList に画像を格納 |
動作確認等 |
Windows 10 ビルド 19043 Pro 64 bit + Delphi XE5(UP2) Pro VCL-32 |
|
093_TImageList_SetImage.zip [6.5 MB] 2022年11月19日版 (EXE 同梱) |
実行時に,TImageList に画像を格納するサンプルです.
TImageList に格納される画像は,TImageList の ColorDepth プロパティに応じたビット深さのビットマップとなります. |
TImageList の ColorDepth プロパティの値は,デフォルトでは cdDeviceDependent です.これはデバイス依存の処理です.本ページのサンプルでは.cd32bit にしてテストしています.cd32bit は,32 ビット画像のアルファ値も処理する方式です.
TImageList には,Width, Height プロパティで指定したサイズの画像だけが格納できます.それよりも大きいサイズの画像格納すると,Width, Height プロパティのサイズに分割して格納されます.
TImageList に格納したビットマップ画像を確認するために,本ページのサンプルでは,TListView コントロールに vsIcon として描画するようにしています. |
|
図1
TImagelIst のオブジェクト・インスペクタ
- ColorDepth の値を cd32bit に変更
デフォルトは cdDeviceDependent
- 格納する画像サイズは 128 x 128
|
本ページのサンプルをコンパイルすると,次のようなメッセージが表示されることがあります.この .vrc ファイルは,TImagelist に画像を格納する処理の際に生成される一時ファイルです. |
ファイル "Project1.vrc" を削除しています。 |
01_TImageList に 32 ビットのビットマップ画像を格納 |
32 ビットのビットマップ画像を TImageList に格納して,TListView へ描画した結果です.
左の元の画像は,32 ビットのアルファチャンネル付きのビットマップです.透明色が透過ピクセルになります.この場合,TImageList に格納する際に,マスク画像は必要ありません.マスク画像を作成して Add メソッドの引数に渡しても結果は同じです.
右の元の画像は,32 ビットのビットマップですが,アルファ値は使用していません.しがって,事実上 24 ビット色のビットマップ画像と同じです.下図では,マスク画像を使用していないので透過ピクセルはありません. |
|
図2
TListView への描画結果
- 左の元画像は,
32 ビットのアルファチャンネル付きのビットマップ
- 右の元画像は,
32 ビットのアルファ値を使用しないビットマップ
|
[Button2] をクリックして,マスク画像を使用した結果が下図です.TBitmap の画像は,特に指定しない場合,左下のピクセルの色が透過色になります.
|
|
図3
TListView への描画結果
- 左の元画像は,
32 ビットのアルファチャンネル付きのビットマップ
- 右の元画像は,
32 ビットのアルファ値を使用しないビットマップ
|
リスト1
TImageList に 32 ビットのビットマップ画像を格納 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.ComCtrls,
Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
ListView1: TListView;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// 透過状態の確認用に TListView の背景色を設定
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.SetSize(128, 128);
// Delphi 2009 以降では cd32bit にする
ImageList1.ColorDepth := cd32Bit;
ListView1.Items.Clear;
ListView1.Color := clSilver;
ListView1.ViewStyle := vsIcon;
ListView1.LargeImages := ImageList1;
end;
//=============================================================================
// 32 ビット色のビットマップ画像を格納
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LBitmap : TBitmap;
LMaskBitmap : TBitmap;
LIndex : Integer;
begin
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
LMaskBitmap := TBitmap.Create;
try
// 32 ビットのアルファチャンネル付きビットマップ
LBitmap.LoadFromFile('..\Images\simple_32bit_AlphaZero.bmp');
ImageList1.Add(LBitmap, nil);
// 32 ビットのアルファチャンネルなしのビットマップ
LBitmap.LoadFromFile('..\Images\simple_32bit.bmp');
// Sender が nil の時はマスク画像を追加
if Sender <> nil then begin
ImageList1.Add(LBitmap, nil);
end else begin
LMaskBitmap.Assign(LBitmap);
LMaskBitmap.Mask(LBitmap.TransparentColor);
ImageList1.Add(LBitmap, LMaskBitmap);
end;
finally
FreeAndNil(LBitmap);
FreeAndNil(LMaskBitmap);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
//=============================================================================
// 32 ビット色のビットマップ画像を格納
// マスク画像を使用する処理
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
Button1Click(nil);
end;
end.
マスク画像は下図のようになります.黒以外の部分が透過ピクセルとなります.
32 ビットのアルファチャンネル付きのビットマップでは,マスク画像を使用する必要はありませんが,マスク画像を使用しても結果は同じです.
したがって,32 ビットのビットマップの場合,アルファチャンネルを使用していても,使用していなくとも同じ処理で TImageList に格納できます. |
|
図4
マスク画像
|
//=============================================================================
// マスク画像を作成して TImage に描画
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LBitmap : TBitmap;
begin
Image1.Picture.Assign(nil);
LBitmap := TBitmap.Create;
try
// 32 ビットのアルファチャンネルなしのビットマップ
LBitmap.LoadFromFile('..\Images\simple_32bit.bmp');
LBitmap.Mask(LBitmap.TransparentColor);
Image1.Canvas.Draw(0, 0, LBitmap);
finally
FreeAndNil(LBitmap);
end;
end;
02_TImageList に 32 ビット以外のビットマップ画像を格納 |
32 ビット以外のピッマップ画像の場合も同じです.
以下のサンプルは,8 ビットのビットマップ画像を,TImageList に格納する例です. |
|
図5
マスク画像を使用しない場合
- 左の元画像は比較用で,
32 ビットのアルファチャンネル付きのビットマップ
- 右の元画像は,
8 ビットのビットマップ画像
|
|
図6
マスク画像を使用した場合
- 左の元画像は比較用で,
32 ビットのアルファチャンネル付きのビットマップ
- 右の元画像は,
8 ビットのビットマップ画像
|
リスト2
TImageList に 32 ビット以外のビットマップ画像を格納 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.ComCtrls,
Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
ListView1: TListView;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// 透過状態の確認用に TListView の背景色を設定
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.SetSize(128, 128);
// cd32bit にする
ImageList1.ColorDepth := cd32Bit;
ListView1.Items.Clear;
ListView1.Color := clSilver;
ListView1.ViewStyle := vsIcon;
ListView1.LargeImages := ImageList1;
end;
//=============================================================================
// 24 ビット色以下ののビットマップ画像を格納
// マスク画像を使用しない場合
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LBitmap : TBitmap;
LIndex : Integer;
begin
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
try
// 32 ビットのアルファチャンネル付きビットマップ ( 比較用 )
LBitmap.LoadFromFile('..\Images\simple_32bit_AlphaZero.bmp');
ImageList1.Add(LBitmap, nil);
// 8 ビット色 (256 色) のビットマップ画像
LBitmap.LoadFromFile('..\Images\simple_8bit.bmp');
ImageList1.Add(LBitmap, nil);
finally
FreeAndNil(LBitmap);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
//=============================================================================
// 24 ビット色以下ののビットマップ画像を格納
// マスク画像を使用する場合
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LBitmap : TBitmap;
LMaskBitmap : TBitmap;
LTransColor : TColor;
LIndex : Integer;
begin
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
LMaskBitmap := TBitmap.Create;
try
// 32 ビットのアルファチャンネル付きビットマップ ( 比較用 )
LBitmap.LoadFromFile('..\Images\simple_32bit_AlphaZero.bmp');
ImageList1.Add(LBitmap, nil);
// 8 ビット色 (256 色) のビットマップ画像
// マスク画像を作成して Add メソッドの第 2 引数に渡す
LBitmap.LoadFromFile('..\Images\simple_8bit.bmp');
LMaskBitmap.Assign(LBitmap);
LTransColor := LBitmap.Canvas.Pixels[0, LBitmap.Height - 1];
LMaskBitmap.Mask(LTransColor);
ImageList1.Add(LBitmap, LMaskBitmap);
finally
FreeAndNil(LBitmap);
FreeAndNil(LMaskBitmap);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
end.
03_TImageList に PNG 形式の画像を格納 |
TPngImage の画像を TImageList に格納する例です.
TPngImage の画像を TBitmap の画像に変換して,それを TImageList に追加します.マスク画像は必要ありません. |
|
図7
PNG 画像を TImageList に格納
- 左の元画像は比較用で,
32 ビットのアルファチャンネル付きのビットマップ
- 右の元画像は,
32 ビットの PNG 画像 |
リスト3
TImageList に PNG 形式の画像を格納 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.ComCtrls,
Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
Vcl.Imaging.pngimage;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// 透過状態の確認用に TListView の背景色を設定
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.SetSize(128, 128);
// cd32bit にする
ImageList1.ColorDepth := cd32Bit;
ListView1.Items.Clear;
ListView1.Color := clSilver;
ListView1.ViewStyle := vsIcon;
ListView1.LargeImages := ImageList1;
end;
//=============================================================================
// PNG 形式の画像を格納
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LBitmap : TBitmap;
LPngImage : TPngImage;
LIndex : Integer;
begin
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
LPngImage := TPngImage.Create;
try
// 32 ビットのアルファチャンネル付きビットマップ ( 比較用 )
LBitmap.LoadFromFile('..\Images\simple_32bit_AlphaZero.bmp');
ImageList1.Add(LBitmap, nil);
// PNG 画像を読み込んで TBitmap の画像に変換
// それを TImageList に追加
LPngImage.LoadFromFile('..\Images\simple_32bit.png');
LBitmap.Assign(LPngImage);
ImageList1.Add(LBitmap, nil);
finally
FreeAndNil(LBitmap);
FreeAndNil(LPngImage);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
end.
04_TImageList に GIF 形式の画像を格納 |
TGifImage の画像を TImageList に格納する例です.
TGIfImage の画像を TBitmap の画像に変換して,それを TImageList に追加します.マスク画像を作成して,Add メソッドの第 2 引数に渡します. |
|
図8
GIF 画像を TImageList に格納
- 左の元画像は比較用で,
32 ビットのアルファチャンネル付きのビットマップ
- 右の元画像は
GIF 形式の画像
|
リスト4
TImageList に GIF 形式の画像を格納 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.ComCtrls,
Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
Vcl.Imaging.GIFImg;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// 透過状態の確認用に TListView の背景色を設定
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.SetSize(128, 128);
// cd32bit にする
ImageList1.ColorDepth := cd32Bit;
ListView1.Items.Clear;
ListView1.Color := clSilver;
ListView1.ViewStyle := vsIcon;
ListView1.LargeImages := ImageList1;
end;
//=============================================================================
// GIF 形式の画像を格納
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LBitmap : TBitmap;
LMaskBitmap : TBitmap;
LGifImage : TGifImage;
LIndex : Integer;
begin
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
LMaskBitmap := TBitmap.Create;
LGifImage := TGifImage.Create;
try
// 32 ビットのアルファチャンネル付きビットマップ ( 比較用 )
LBitmap.LoadFromFile('..\Images\simple_32bit_AlphaZero.bmp');
ImageList1.Add(LBitmap, nil);
// GIF 画像を読み込んで TBitmap の画像に変換
LGifImage.LoadFromFile('..\Images\Simple_8BIT.gif');
// TBitmap に元の色を反映するために透過状態を解除
LGifImage.Transparent := False;
LBitmap.Canvas.Draw(0, 0, LGifImage);
// マスク画像を作成して Add メソッドの第 2 引数に渡す
LMaskBitmap.Assign(LBitmap);
LMaskBitmap.Mask(LGifImage.Bitmap.TransparentColor);
ImageList1.Add(LBitmap, LMaskBitmap);
finally
FreeAndNil(LBitmap);
FreeAndNil(LMaskBitmap);
FreeAndNil(LGifImage);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
end.
05_TImageList に ICO 形式の画像を格納 |
TIcon 画像を TImageList に格納する例です.
TIcon 画像は,AddIcon メソッドで TImageList に格納できます.マスク画像を作成する必要はありません.TIcon 画像には,マスク画像が格納されています.
TIcon は,そのマスク画像を使用して透過処理を行います. |
|
図9
ICO 画像を TImageList に格納
- 左の元画像は比較用で,
32 ビットのアルファチャンネル付きのビットマップ
- 右上は 32 ビットのアルファチャンネル付きの TIcon 画像
- 左下は,24 ビットの TIcon 画像
- 右下は,8 ビットの TIcon 画像
|
リスト5
TImageList に ICO 形式の画像を格納 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.ComCtrls,
Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// 透過状態の確認用に TListView の背景色を設定
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.SetSize(128, 128);
// cd32bit にする
ImageList1.ColorDepth := cd32Bit;
ListView1.Items.Clear;
ListView1.Color := clSilver;
ListView1.ViewStyle := vsIcon;
ListView1.LargeImages := ImageList1;
end;
//=============================================================================
// ICO 形式の画像を格納
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LBitmap : TBitmap;
LIcon : TIcon;
LIndex : Integer;
begin
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
LIcon := TIcon.Create;
try
// 32 ビットのアルファチャンネル付きビットマップ ( 比較用 )
LBitmap.LoadFromFile('..\Images\simple_32bit_AlphaZero.bmp');
ImageList1.Add(LBitmap, nil);
// 32 ビット色のアイコン画像を読み込んで AddIcon メソッドで TImageList に追加
// 32 ビット色のアイコンはアルファチャンネル付きの画僧
LIcon.LoadFromFile('..\Images\Images_32bIT.ico');
ImageList1.AddIcon(LIcon);
// 24 ビット色のアイコン画像を読み込んで AddIcon メソッドで TImageList に追加
LIcon.LoadFromFile('..\Images\Images_24bIT.ico');
ImageList1.AddIcon(LIcon);
// 8 ビット色のアイコン画像を読み込んで AddIcon メソッドで TImageList に追加
LIcon.LoadFromFile('..\Images\Images_8bIT.ico');
ImageList1.AddIcon(LIcon);
finally
FreeAndNil(LBitmap);
FreeAndNil(LIcon);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
end.
06_ColorDepth プロパティが cd32bit 以外の場合 |
TImageList.ColorDepth プロパティの値が cd8bit の場合です.
cd8bit の場合は,TImageList に格納した画像は 8 ビットの 256 色の画像になります.24 ビット以上の画像は減色されますが,適切な減色処理が行われるわけではありりません.あらかじめ,適切な減色処理をしておくが必要があります. |
下図は,ColorDepth プロパティの値が cd8bit の時に,32 ビットのアルファチャンネル付きの画像を TImageList に格納した結果です.
ColorDepth プロパティの値がデフォルトの cdDeviceDependent の時も,cd24bit の時も結果は同じです.アルファ値の処理は行われません.その結果,ビットマップでは「黒」と「透明色」が区別されないため,実際の「黒」と「透明色」のピクセルがどちらも黒になっています.半透明のピクセルの色は,R, G, B の値によって決まる値になります.
PNG 画像の場合は,背景を白で塗り潰してから描画します.透明ピクセルは,その背景色の「白」ままとなり,半透明のピクセルは背景色との混合色になます.
TIcon の画像の場合は,透過ピクセルは,透過ピクセルという情報に基づいて描画します.その結果,透過ピクセルは透過します.半透明のピクセルは減色処理されて黒に近い色になっています. |
|
図10
元が 32 ビットの画像の場合
- 全てアルファチャンネル付きの 32 ビット画像
- 左上はビットマップ画像
- 右上は TPingImage の画像
- 左下は TIcon の画像
|
以下は,ColorDepth が cd8bit の時に,24 ビット以下の画像を TImageList に格納した例です.
このサンプルの,画像を TImageList へ格納する処理は,cd32bit の場合でもそのまま使用できます.つまり,ColorDepth を cd32bit にしておけば,アルファチャンネル付きの画像も,そうでない画像も,画像の質を損なうことなく TImageList に格納できます. |
|
図11
元が 24 ビット以下の画像の場合
- 左上は 24 ビットのビットマップ画像
- 右上は TGifImage 画像
- 左下は 24 ビットの TIcon 画像
- 右下は 8 ビットの TIcon 画像
|
リスト6
ColorDepth プロパティが cd8bit の時に,画像を TImageList に格納 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.ComCtrls,
Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
ListView1: TListView;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
Vcl.Imaging.pngimage,
Vcl.Imaging.GIFImg;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// ColorDepth の値を cd8bit にした場合のテスト
// この場合,TImageList に格納されるのは 8 ビット色 ( 356 色 ) のビットマップ
//
// 透過状態の確認用に TListView の背景色を設定
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.SetSize(128, 128);
ImageList1.ColorDepth := cd8Bit;
ListView1.Items.Clear;
ListView1.Color := clSilver;
ListView1.ViewStyle := vsIcon;
ListView1.LargeImages := ImageList1;
end;
//=============================================================================
// 32 ビット色のアルファチャンネル付きの画像を TImageList に格納
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LBitmap : TBitmap;
LPngImage : TPngImage;
LIcon : TIcon;
LIndex : Integer;
begin
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
try
// 32 ビットのアルファチャンネル付きビットマップ
LBitmap.LoadFromFile('..\Images\images_32bit.bmp');
ImageList1.Add(LBitmap, nil);
finally
FreeAndNil(LBitmap);
end;
LBitmap := TBitmap.Create;
LPngImage := TPngImage.Create;
try
// 32 ビットの PNG 形式画像
LPngImage.LoadFromFile('..\Images\images_32bit.png');
LBitmap.Assign(LPngImage);
ImageList1.Add(LBitmap, nil);
finally
FreeAndNil(LBitmap);
FreeAndNil(LPngImage);
end;
LIcon := TIcon.Create;
try
// 32 ビットのアイコン画像
LIcon.LoadFromFile('..\Images\Images_32bIT.ico');
ImageList1.AddIcon(LIcon);
finally
FreeAndNil(LIcon);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
//=============================================================================
// 24 ビット色以下の画像を読み込んで TImageList に格納
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LBitmap : TBitmap;
LMaskBitmap : TBitmap;
LGifImage : TGIFImage;
LIcon : TIcon;
LIndex : Integer;
begin
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
LMaskBitmap := TBitmap.Create;
try
// 24 ビット色のビットマップ画像
LBitmap.LoadFromFile('..\Images\simple_24bit.bmp');
LMaskBitmap.Assign(LBitmap);
LMaskBitmap.Mask(LBitmap.TransparentColor);
ImageList1.Add(LBitmap, LMaskBitmap);
finally
FreeAndNil(LBitmap);
FreeAndNil(LMaskBitmap);
end;
LBitmap := TBitmap.Create;
LMaskBitmap := TBitmap.Create;
LGifImage := TGIFImage.Create;
try
// GIF 形式の画像 ( 256 色 )
LGifImage.LoadFromFile('..\Images\Simple_8bit.gif');
LBitmap.SetSize(LGifImage.Width, LGifImage.Height);
LGifImage.Transparent := False;
LBitmap.Canvas.Draw(0, 0, LGifImage);
LMaskBitmap.Assign(LBitmap);
LMaskBitmap.Mask(LGifImage.Bitmap.TransparentColor);
ImageList1.Add(LBitmap, LMaskBitmap);
finally
FreeAndNil(LBitmap);
FreeAndNil(LMaskBitmap);
FreeAndNil(LGifImage);
end;
LIcon := TIcon.Create;
try
// 24 ビット色のアイコン画像
LIcon.LoadFromFile('..\Images\Images_24bIt.ico');
ImageList1.AddIcon(LIcon);
// 8 ビット色のアイコン画像
LIcon.LoadFromFile('..\Images\Images_8bIt.ico');
ImageList1.AddIcon(LIcon);
finally
FreeAndNil(LIcon);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
end.
07_TListView における画像間のスペース |
TListView.ViewStyle の値を vsIcon にして画像を描画した場合,各画像の間にはスペースがあります.Item 間の間隔,スペースとも言えます.下図はそれを確認した結果です.描画している画像のサイズは 128 x 128 です.枠線のサイズも同じ 128 x 128 です. |
|
図12
デフォルトの画像の描画間隔 |
この画像間のスペースを,ListView_SetIconSpacing 関数を使用して変更した結果です. |
|
図13
画像の描画間隔を変更 |
リスト7
TListView における画像間のスペース |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.ComCtrls,
Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
procedure SetImageSpace;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
Winapi.CommCtrl;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.SetSize(128, 128);
ImageList1.ColorDepth := cd32Bit;
ListView1.Items.Clear;
ListView1.ViewStyle := vsIcon;
ListView1.LargeImages := ImageList1;
end;
//=============================================================================
// 32 ビット色のビットマップ画像を TImageList iに格納
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LBitmap : TBitmap;
LIndex : Integer;
begin
SetImageSpace;
ListView1.Items.Clear;
ImageList1.Clear;
LBitmap := TBitmap.Create;
try
// 128 x128 の四角形の画像を読み込む ( 32 ビット色 )
LBitmap.LoadFromFile('..\Images\Frame_32bit.bmp');
// それを TImageList に格納
ImageList1.Add(LBitmap, nil);
ImageList1.Add(LBitmap, nil);
ImageList1.Add(LBitmap, nil);
ImageList1.Add(LBitmap, nil);
ImageList1.Add(LBitmap, nil);
ImageList1.Add(LBitmap, nil);
finally
FreeAndNil(LBitmap);
end;
// TListView に TImageList の画像を描画
for LIndex := 0 to ImageList1.Count - 1 do begin
ListView1.Items.Add.Caption := 'Image - ' + IntToStr(LIndex);
ListView1.Items[LIndex].ImageIndex := LIndex;
end;
end;
//-----------------------------------------------------------------------------
// TListView での画像描画の間隔を変更
// uses に Winapi.CommCtrl が必要
//-----------------------------------------------------------------------------
procedure TForm1.SetImageSpace;
{$WRITEABLECONST ON}
const
LImgFlag : Boolean = False;
{$WRITEABLECONST OFF}
var
LWidth : WORD;
LHeight : WORD;
begin
// トグル動作
if LImgFlag then begin
LWidth := ImageList1.Width + 25;
LHeight := ImageList1.Height + 25;
end else begin
// デフォルトの設定値
LWidth := WORD(-1);
LHeight := WORD(-1);
end;
LImgFlag := not LImgFlag;
// 画像の描画間隔 ( スペース ) を設定
ListView_SetIconSpacing(ListView1.Handle, LWidth, LHeight);
end;
end.
|