Logo New book: Delphi 2007 Handbook
My blog in online
Delphi tech support service: support.marcocantu.com
Google
  Web www.marcocantu.com

Menu for Development

Site Menu
Delphi 2007 Handbook
Mastering Borland Delphi 2005
Essential Pascal
Essential Delphi
Buy Books Online
Code Repository
Newsgroups
White Papers
Tools
Conferences
Training
Delphi Links
Contact Marco

My Other Sites
Italian Site (www.marcocantu.it)
Developers Newsgroups Browser (dev.newswhat.com)
My town (www.piazzacavalli.net)
the delphi search
Wintech Italia (my company)

Breaking News
Buy Mastering Borland Delphi 2005 from Amazon
Free ebook: Mastering Delphi Update for Delphi 2006

Advertising
Home My Blog Books My Bookstore Development Links Marco



Home: Code Repository: Mastering Delphi 5

Project DBPACK

Project Structure


DBPACK.DPR

program DbPack;

uses
  Forms,
  DbPackF in 'DbPackF.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

DBPACKF.PAS

unit DbPackF;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, DBTables, Db;

type
  TForm1 = class(TForm)
    BtnDbase: TButton;
    BtnPdx: TButton;
    ListDbase: TListBox;
    ListPdx: TListBox;
    Table1: TTable;
    procedure FormCreate(Sender: TObject);
    procedure BtnPdxClick(Sender: TObject);
    procedure BtnDbaseClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  BDE;

procedure PackPdoxTable (Table:TTable);
var
  TableDesc: CRTblDesc;
  WasActive: Boolean;
  hDatabase: hDbiDB;
begin
  WasActive := Table.Active;
  Screen.Cursor := crHourglass;
  try
    // open if it was closed
    // (to get the valid DBHandle)
    if not WasActive then
      Table.Open;
    // get the database handle and close the table
    hDatabase := Table.DBHandle;
    Table.Close;
    // fill the table descriptor
    FillChar (TableDesc, SizeOf (CRTblDesc), 0);
    with TableDesc do
    begin
      StrPCopy (szTblName, Table.TableName);
      StrPCopy (szTblType, szParadox);
      bPack := True;
    end;
    // restructure the table, packing it
    if hDatabase <> nil then
      Check (DBIDoRestructure (hDatabase, 1,
        @TableDesc, nil, nil, nil, False))
    else
      ShowMessage ('Database handle is nil');
  finally
    Screen.Cursor := crDefault;
    // eventually reopen
    if WasActive then
      Table.Open;
  end;
end;

procedure PackDBaseTable (Table: TTable);
var
  WasActive: Boolean;
begin
  WasActive  := Table.Active;
  Screen.Cursor := crHourglass;
  try
    // close if open
    if WasActive then
      Table.Close;
    // reopen in exclusive mode
    Table.Exclusive := True;
    Table.Open;
    // pack the table
    Check (DBIPackTable (Table.DBHandle,
      Table.Handle, nil, nil, True));
    // remove the exclusive mode
    Table.Close;
    Table.Exclusive := False;
  finally
    Screen.Cursor := crDefault;
    // eventually reopen
    if WasActive then
      Table.Open;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // get the table names
  Session.GetTableNames (Table1.DatabaseName,
    '*.db', True, False, ListPdx.Items);
  Session.GetTableNames (Table1.DatabaseName,
    '*.dbf', True, False, ListDbase.Items);
  // select the first item of each list
  ListPdx.ItemIndex := 0;
  ListDbase.ItemIndex := 0;
end;

procedure TForm1.BtnPdxClick(Sender: TObject);
begin
  Table1.TableName :=
    ListPdx.Items [ListPdx.ItemIndex];
  PackPdoxTable (Table1);
end;

procedure TForm1.BtnDbaseClick(Sender: TObject);
begin
  Table1.TableName :=
    ListDbase.Items [ListDbase.ItemIndex];
  PackDBaseTable (Table1);
end;

end.

DBPACKF.DFM

object Form1: TForm1
  Left = 192
  Top = 107
  Width = 450
  Height = 228
  Caption = 'DbPack'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = True
  Visible = True
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object BtnDbase: TButton
    Left = 272
    Top = 168
    Width = 121
    Height = 25
    Caption = 'Pack dBase table'
    TabOrder = 0
    OnClick = BtnDbaseClick
  end
  object BtnPdx: TButton
    Left = 48
    Top = 168
    Width = 121
    Height = 25
    Caption = 'Pack Paradox table'
    TabOrder = 1
    OnClick = BtnPdxClick
  end
  object ListDbase: TListBox
    Left = 224
    Top = 8
    Width = 209
    Height = 153
    ItemHeight = 13
    TabOrder = 2
  end
  object ListPdx: TListBox
    Left = 8
    Top = 8
    Width = 209
    Height = 153
    ItemHeight = 13
    TabOrder = 3
  end
  object Table1: TTable
    DatabaseName = 'DBDEMOS'
    TableName = 'clients.dbf'
    Left = 32
    Top = 24
  end
end