unit MainFrm;interface
uses
  Windows, SysUtils,Classes, Controls, Forms, Grids, ToolWin, ComCtrls, StdCtrls, ExtCtrls, DB,
  ADODB;type
  TfrmMain = class(TForm)
    cnn: TADOConnection;
    rst: TADODataSet;
    pnlNavigate: TPanel;
    btnFirst: TButton;
    btnPrior: TButton;
    btnNext: TButton;
    btnLast: TButton;
    edtPageNO: TEdit;
    sgData: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure btnFirstClick(Sender: TObject);
    procedure edtPageNOKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FPageNo: Integer;
    procedure SetPageNo(Value: Integer);
  public
    property PageNo: Integer read FPageNo write SetPageNo;
  end;var
  frmMain: TfrmMain;
  procedure LoadForm(Handle: THandle; AppName: ShortString); export;implementation{$R *.dfm}const
  PAGE_SIZE = 6;
//procedure LoadForm;procedure LoadForm(Handle: THandle; AppName: ShortString);
begin
  Application.Handle := Handle;
  Application.Name := AppName;
  frmMain := TfrmMain.Create(Application);
  try
    frmMain.ShowModal;
  finally
    frmMain.Free;
  end;
end;procedure TfrmMain.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  SetWindowLong(edtPageNO.Handle, GWL_STYLE, GetWindowLong(edtPageNo.Handle,
    GWL_STYLE) or ES_CENTER or ES_NUMBER);
  rst.Active := True;
  rst.Recordset.PageSize := PAGE_SIZE;
  sgData.ColCount := rst.FieldCount + 1;
  for i := 0 to rst.FieldCount - 1 do
  begin
    sgData.ColWidths[i + 1] := rst.Fields[i].DisplayWidth * Canvas.TextWidth('0');
    sgData.Cells[i + 1, 0] := rst.Fields[i].DisplayName;
  end;
  sgData.Cells[0, 0] := '序号';
  PageNo := 1;
end;procedure TfrmMain.btnFirstClick(Sender: TObject);
begin
  if Sender = btnFirst then
    PageNo := 1
  else if Sender = btnPrior then
    PageNo := PageNo - 1
  else if Sender = btnNext then
    PageNo := PageNo + 1
  else PageNo := rst.Recordset.PageCount;
end;procedure TfrmMain.edtPageNOKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if edtPageNO.Text <> '' then
    PageNo := StrToInt(edtPageNO.Text);
end;procedure TfrmMain.SetPageNo(Value: Integer);
const
  adStateOpen = $00000001;
var
  n, i, j: Integer;
begin
  with rst.Recordset do
    if (FPageNo <> Value) and (Value >= 1) and (Value <= PageCount) and
      (State = adStateOpen) then
    begin
      FPageNo := Value;
      AbsolutePage := FPageNo;
      n := (FPageNo - 1) * PAGE_SIZE;
      edtPageNo.Text := IntToStr(FPageNo);
      for i := 1 to PAGE_SIZE do
      begin
        sgData.RowCount := i + 1;
        sgData.Cells[0, i] := IntToStr(n + i);
        for j := 0 to Fields.Count - 1 do
          sgData.Cells[j + 1, i] := Fields[j].Value;
        MoveNext;
        if Eof then Exit;
      end;
    end;
end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  self.Free;
end;end.initialization
  CoInitialize(nil);
finalization
  CoUnInitialize;