Example: TDbf (creating table and indexes, selecting of index)

From Free Pascal wiki
Jump to navigationJump to search

This example was taken from the post at the forum:
http://forum.lazarus.freepascal.org/index.php/topic,31169.msg199356.html#msg199356


You can copy text to files:

  • Code: mainaddindex.pas
  • Form: mainaddindex.lfm

and test it.


Code

unit MainAddIndex;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, dbf, Forms, Controls, Graphics, Dialogs,
  DBGrids, DbCtrls, StdCtrls, LazFileUtils;

const
  CountriesFilename = 'countries.dbf';

type

  { TForm1 }

  TForm1 = class(TForm)
    BSortByCountry: TButton;
    BSortByCapital: TButton;
    BSortByID: TButton;
    dbfSource: TDataSource;
    grid: TDBGrid;
    Navigator: TDBNavigator;
    procedure BSortByCapitalClick(Sender: TObject);
    procedure BSortByCountryClick(Sender: TObject);
    procedure BSortByIDClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    CountriesDbf: TDbf;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  CountriesDbf:=TDbf.Create(Self);
  CountriesDbf.TableName:=CountriesFilename;
  if not FileExistsUTF8(CountriesFilename) then with CountriesDbf do begin
    TableLevel:=7;
    Exclusive:=True;
    FieldDefs.Add('ID', ftAutoInc, 0, True);
    FieldDefs.Add('CountryName', ftString, 25, True);
    FieldDefs.Add('Capital', ftString, 25, True);
    CreateTable;
    Open;
    Append;
    // Fields[0].AsInteger:=100;  // Do not fill 'ID' because its type is ftAutoInc
    fields[1].AsString:='France';
    Fields[2].AsString:='Paris';
    Post;
    Append;
    // Fields[0].AsInteger:=101;
    fields[1].AsString:='Egypt';
    Fields[2].AsString:='Cairo';
    Post;
    Append;
    // Fields[0].AsInteger:=102;
    fields[1].AsString:='Indonesia';
    Fields[2].AsString:='Jakarta';
    Post;
    Append;
    // Fields[0].AsInteger:=103;
    fields[1].AsString:='Austria';
    Fields[2].AsString:='Vienna';
    Post;
    AddIndex('idxByID', 'ID', [ixPrimary,ixUnique]);
    AddIndex('idxByCountry', 'CountryName', [ixCaseInsensitive]);
    AddIndex('idxByCapital', 'Capital', [ixCaseInsensitive]);
  end;
  CountriesDbf.Open;
  dbfSource.DataSet:=CountriesDbf;
  grid.DataSource:=dbfSource;
  Navigator.DataSource:=dbfSource;
end;

procedure TForm1.BSortByCapitalClick(Sender: TObject);
begin
  CountriesDbf.IndexName:='idxByCapital';
end;

procedure TForm1.BSortByCountryClick(Sender: TObject);
begin
  CountriesDbf.IndexName:='idxByCountry';
end;

procedure TForm1.BSortByIDClick(Sender: TObject);
begin
  CountriesDbf.IndexName:='idxByID';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  with CountriesDbf do begin
    CloseIndexFile('idxByCapital');
    CloseIndexFile('idxByCountry');
    CloseIndexFile('idxByID');
  end;
  CountriesDbf.Close;
end;

end.


Form

object Form1: TForm1
  Left = 229
  Height = 270
  Top = 94
  Width = 420
  Caption = 'Form1'
  ClientHeight = 270
  ClientWidth = 420
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  LCLVersion = '1.6.0.2'
  object grid: TDBGrid
    Left = 0
    Height = 200
    Top = 0
    Width = 420
    Align = alTop
    Color = clWindow
    Columns = <>
    TabOrder = 0
  end
  object Navigator: TDBNavigator
    Left = 0
    Height = 25
    Top = 200
    Width = 420
    Align = alTop
    BevelOuter = bvNone
    ChildSizing.EnlargeHorizontal = crsScaleChilds
    ChildSizing.EnlargeVertical = crsScaleChilds
    ChildSizing.ShrinkHorizontal = crsScaleChilds
    ChildSizing.ShrinkVertical = crsScaleChilds
    ChildSizing.Layout = cclLeftToRightThenTopToBottom
    ChildSizing.ControlsPerLine = 100
    ClientHeight = 25
    ClientWidth = 420
    Options = []
    TabOrder = 1
  end
  object BSortByCountry: TButton
    Left = 12
    Height = 23
    Top = 234
    Width = 101
    AutoSize = True
    Caption = 'Sort by country'
    OnClick = BSortByCountryClick
    TabOrder = 2
  end
  object BSortByCapital: TButton
    Left = 168
    Height = 23
    Top = 234
    Width = 95
    AutoSize = True
    Caption = 'Sort by capital'
    OnClick = BSortByCapitalClick
    TabOrder = 3
  end
  object BSortByID: TButton
    Left = 318
    Height = 23
    Top = 234
    Width = 75
    AutoSize = True
    Caption = 'Sort by ID'
    OnClick = BSortByIDClick
    TabOrder = 4
  end
  object dbfSource: TDataSource
    left = 53
    top = 99
  end
end

See also