Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2007年04月26日] [更新 2015年09月27日] Delphi サンプルプログラム集
810_仮想リストボックス
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro
810_VirtualListBox.zip [567 KB] 2015年09月27日版 (EXE 同梱)



  • 2015年09月27日
  • Windows 7 U64(SP1) + Delphi XE(UP1) Pro で動作確認




仮想リストボックス


ファイルの一覧関係のサンプルで仮想リストビュー方式を用いました.リストボックスにも同様の表示方式があります.仮想リストボックス方式にするには,ListBox の Style プロパティを lbVirtual にして,OnData イベント内で Data プロパティに値をセットします.
このサンプルコードでは,アイテムに表示すべき値を TStringList に保持しています.


図1
設計時画面
  • 上のボタンが通常のリストボックス
  • 下のボタンが仮想リストボックスによる表示
  • TSpinEdit で設定した数だけアイテムを作成
図2
実行結果例

リスト1
仮想 (パーシャル) リストボックス
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, ExtCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    SpinEdit1: TSpinEdit;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure ListBox1Data(Control: TWinControl; Index: Integer;
      var Data: String);
  private
    { Private 宣言 }
    FTextDataList : TStringList;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  項目(Item)を格納するStringListを用意
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  FTextDataList := TStringList.Create;
end;

//=============================================================================
//  項目(Item)を格納したStringListを解放
//=============================================================================
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  FreeAndNil(FTextDataList);
end;

//=============================================================================
//  通常のListBox
//  SpinEditで指定した数だけItemに値をセット
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
begin
  ListBox1.Style := lbStandard;
  ListBox1.Items.Clear;

  FTextDataList.Clear;
  for i := 0 to SpinEdit1.Value do begin
     FTextDataList.Add(Format('    %.6d',[i]));
     Application.ProcessMessages;
  end;

  ListBox1.Items.BeginUpdate;
  try
    ListBox1.Items.Assign(FTextDataList);
  finally
    ListBox1.Items.EndUpdate;
  end;
end;

//=============================================================================
//  仮想TListBox
//  TSpinEditで指定した数だけSL(TStringList)に値をセット
//  文字列や画像の画面の描画には時間がかかる
//  そこで実際に見える部分だけをOnDataイベントで表示するようにする
//  これが仮想TListBox
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
begin
  ListBox1.Style := lbVirtual;
  ListBox1.Items.Clear;

  FTextDataList.Clear;
  for i := 0 to SpinEdit1.Value do begin
     FTextDataList.Add(Format('    %.6d',[i]));
     Application.ProcessMessages;
  end;
  //データ数を設定するとOnDataイベントが発生して描画が行われる
  ListBox1.Count := FTextDataList.Count - 1;
end;

//=============================================================================
//  TListBoxのOnDataイベント処理
//  TListBoxの項目の表示が必要な時に呼出される
//  表示しない項目部分では発生しない
//=============================================================================
procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
  var Data: String);
begin
  Data := FTextDataList[Index];
end;

end.


チェックボックス付きの TCheckListBox コンポーネントがあります.TCheckListBox にも Style プロパティを lbVirtual にすると仮想リストボックスとして使用できます.
ただし,筆者が確認した限りでは,仮想リストボックスとして使用した場合,チェックボックスの制御はできないようです.チェックボックス付きで,仮想リストを実装するには,TListView を使用する方法が考えられます.


図3
TCheckListBox
  • 仮想リストボックスにすると,チェックボックスは制御できない