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
実行結果例 |
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
- 仮想リストボックスにすると,チェックボックスは制御できない
|
|