DelphiのListViewでページング表示する方法を教えてください。
DelphiでListViewにページャを適用するには、以下の手順に従います。
- Delphiのフォームに、ListViewコントロールを配置してデータを表示します。
- ListViewのViewStyle属性をvsReportに設定すると、データをレポート形式で表示できます。
- フォーム上にComboBoxコントロールを配置し、1ページあたりに表示するデータの件数を選択できるようにする。
- ウィンドウ上に前のページに遷移するボタンコントロールを配置する。
- フォームにページ切り替え用のボタンコントロールを配置する。
- フォームのFormCreateイベントにて、ListViewのカラムヘッダとデータを初期化する。
- ComboBoxのOnChangeイベントでは、1ページあたりの表示データ件数を更新し、総ページ数を再計算する。
- 前のページのボタンのOnClickイベントで、現在のページの開始インデックスと終了インデックスを計算し、ListViewに表示するデータを更新する。
- 次のページボタンのOnClickイベント内で、現在ページの開始インデックスと終了インデックスを計算し、ListViewに表示するデータの更新を行う。
- フォームのUpdateListViewメソッドにおいて、現在のページのstartIndexとendIndexに基づいて、データソースから該当するデータを取り出し、ListViewに更新します。
- フォームのUpdatePagerメソッドで、総ページ数と現在ページ数に応じて、前ページボタン・次ページボタンのEnabled属性を更新する。
以下にシンプルなサンプルコードを示します。
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TMainForm = class(TForm)
ListView1: TListView;
ComboBox1: TComboBox;
ButtonPrev: TButton;
ButtonNext: TButton;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ButtonPrevClick(Sender: TObject);
procedure ButtonNextClick(Sender: TObject);
private
FData: TStringList;
FPageSize: Integer;
FTotalPages: Integer;
FCurrentPage: Integer;
procedure UpdateListView;
procedure UpdatePager;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
var
I: Integer;
begin
FPageSize := 10;
FCurrentPage := 1;
FData := TStringList.Create;
for I := 1 to 100 do
FData.Add('Item ' + IntToStr(I));
ListView1.Columns.Add.Caption := 'Items';
UpdateListView;
UpdatePager;
end;
procedure TMainForm.ComboBox1Change(Sender: TObject);
begin
FPageSize := StrToIntDef(ComboBox1.Text, 10);
FCurrentPage := 1;
UpdateListView;
UpdatePager;
end;
procedure TMainForm.ButtonPrevClick(Sender: TObject);
begin
if FCurrentPage > 1 then
begin
Dec(FCurrentPage);
UpdateListView;
UpdatePager;
end;
end;
procedure TMainForm.ButtonNextClick(Sender: TObject);
begin
if FCurrentPage < FTotalPages then
begin
Inc(FCurrentPage);
UpdateListView;
UpdatePager;
end;
end;
procedure TMainForm.UpdateListView;
var
I, StartIndex, EndIndex: Integer;
begin
ListView1.Clear;
StartIndex := (FCurrentPage - 1) * FPageSize;
EndIndex := StartIndex + FPageSize - 1;
if EndIndex >= FData.Count then
EndIndex := FData.Count - 1;
for I := StartIndex to EndIndex do
begin
with ListView1.Items.Add do
begin
Caption := FData[I];
end;
end;
end;
procedure TMainForm.UpdatePager;
begin
FTotalPages := Ceil(FData.Count / FPageSize);
ButtonPrev.Enabled := FCurrentPage > 1;
ButtonNext.Enabled := FCurrentPage < FTotalPages;
end;
end.
本コードは、ページあたりの表示するデータ件数をComboBoxから選択し、ボタンで前ページと次ページに切り替えてデータを表示する、DelphiにおけるListViewのページング表示の簡単なサンプルプログラムです。データソースから現在のページの開始インデックスと終了インデックスに従って該当するデータを取り出してListViewに更新します。また、総ページ数と現在のページ数に従い、前ページボタンと次ページボタンのEnabledプロパティを更新します。