DelphiのListViewでページング表示する方法を教えてください。

DelphiでListViewにページャを適用するには、以下の手順に従います。

  1. Delphiのフォームに、ListViewコントロールを配置してデータを表示します。
  2. ListViewのViewStyle属性をvsReportに設定すると、データをレポート形式で表示できます。
  3. フォーム上にComboBoxコントロールを配置し、1ページあたりに表示するデータの件数を選択できるようにする。
  4. ウィンドウ上に前のページに遷移するボタンコントロールを配置する。
  5. フォームにページ切り替え用のボタンコントロールを配置する。
  6. フォームのFormCreateイベントにて、ListViewのカラムヘッダとデータを初期化する。
  7. ComboBoxのOnChangeイベントでは、1ページあたりの表示データ件数を更新し、総ページ数を再計算する。
  8. 前のページのボタンのOnClickイベントで、現在のページの開始インデックスと終了インデックスを計算し、ListViewに表示するデータを更新する。
  9. 次のページボタンのOnClickイベント内で、現在ページの開始インデックスと終了インデックスを計算し、ListViewに表示するデータの更新を行う。
  10. フォームのUpdateListViewメソッドにおいて、現在のページのstartIndexとendIndexに基づいて、データソースから該当するデータを取り出し、ListViewに更新します。
  11. フォームの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プロパティを更新します。

bannerAds