Library Catalog System--Delphi Object Pascal


I created this catalog entry and reporting database system for a library of about 15,000 volumes.  It included data entry, browsing and reporting, and was written using Borland's Delphi (an object-oriented Pascal). Delphi is my favorite "visual" programming environment for windows so far.  It is faster and more flexible than Visual Basic--compiled, and truly object-oriented.  It is simpler to use than Visual C++, but is as flexible and full-featured for production programming.

Shown below is an editing screen, browsing list and report excerpt.

 next      back up to work samples
 


 

Delphi can connect convenient database widgets to its own Paradox databases, or to Oracle, Sybase, Access, et. al., through ODBC.  The reporting facilities generate SQL and/or allow manual SQL edits.  The report screen for this system allows the user to select the order and report range, as well as a narrow or wide format, and can display results on-screen or print them.
 

Below is some of the code for the editing form.  Notice the "interface", "implementation" and "uses <unit>" constructs, which avoid the need to include and re-compile header files, as in C++.
 

unit edit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGrids, DB, DBTables, StdCtrls, ExtCtrls, DBCtrls, Mask;

type
  TfrmEdit = class(TForm)  //Main form--edit window.
    srcBook: TDataSource;
    srcSubj: TDataSource;
    tblBook: TTable;
    tblSubj: TTable;
    Label1: TLabel;
    rgIndex: TRadioGroup;
    btnBrowse: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    dbeBN: TDBEdit;
    dbeAuth: TDBEdit;
    dbeTtl: TDBEdit;
    DBNavigator1: TDBNavigator;
    lblSubj: TLabel;
    btnAuth: TButton;
    Panel1: TPanel;
    dlcSubC: TDBLookupComboBox;
    dlcSubj: TDBLookupComboBox;
    btnClose: TButton;
    btnSubj: TButton;
    dlcTyp: TDBLookupComboBox;
    Label5: TLabel;
    tblTyp: TTable;
    srcTyp: TDataSource;
    btnTyp: TButton;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    dbeCopy: TDBEdit;
    dbeVol: TDBEdit;
    dbePub: TDBEdit;
    dbeYear: TDBEdit;
    Label10: TLabel;
    dbePgs: TDBEdit;
    btnNew: TButton;
    btnCancel: TButton;
    Label11: TLabel;
    edtSearch: TEdit;
    btnDelete: TButton;
    Label12: TLabel;
    DBEdit1: TDBEdit;
    edtState: TEdit;
    Label13: TLabel;
    lblNrecs: TEdit;
    Button1: TButton;
    DBMemo1: TDBMemo;
    Label14: TLabel;
    procedure btnCloseClick(Sender: TObject);
    procedure rgIndexClick(Sender: TObject);
    procedure tblBookBeforeInsert(DataSet: TDataSet);
    procedure btnNewClick(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure btnDeleteClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnBrowseClick(Sender: TObject);
    procedure srcBookDataChange(Sender: TObject; Field: TField);
    procedure btnAuthClick(Sender: TObject);
    procedure edtSearchChange(Sender: TObject);
    procedure edtSearchKeyPress(Sender: TObject; var Key: Char);
    procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    procedure btnSubjClick(Sender: TObject);
    procedure btnTypClick(Sender: TObject);
    procedure tblBookAfterOpen(DataSet: TDataSet);
    procedure tblBookAfterDelete(DataSet: TDataSet);
    procedure tblBookAfterPost(DataSet: TDataSet);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmEdit: TfrmEdit;

implementation

uses List, Author, Subject, typ, rpt;

{$R *.DFM}

procedure TfrmEdit.btnCloseClick(Sender: TObject);
begin
  frmEdit.close;
end;

procedure TfrmEdit.rgIndexClick(Sender: TObject);
begin
  case rgIndex.ItemIndex of  //Set search index from radio button
    0: tblBook.IndexName:='';
    1: tblBook.IndexName:='Auth';
    2: tblBook.IndexName:='Ttl';
    3: tblBook.IndexName:='Subj';
    4: tblBook.IndexName:='ISBN';
  end;
end;

procedure TfrmEdit.tblBookBeforeInsert(DataSet: TDataSet);
begin
  edtSearch.Text:='';
end;

procedure TfrmEdit.btnNewClick(Sender: TObject);
begin
  tblBook.Insert;
  dbeBN.SetFocus;
end;

procedure TfrmEdit.btnCancelClick(Sender: TObject);
begin
  tblBook.Cancel;
end;


procedure TfrmEdit.btnDeleteClick(Sender: TObject);
begin
  if MessageDlg('Delete This Record?',mtConfirmation,mbOKCancel,0)=mrOK then
      tblBook.Delete;
end;

procedure TfrmEdit.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if tblBook.Modified then tblBook.Post;

end;

procedure TfrmEdit.btnBrowseClick(Sender: TObject);
begin
  Hide;
  frmList.rgIndex.ItemIndex:=rgIndex.ItemIndex;
  frmList.WindowState:=wsNormal;
  srcBook.Enabled:=False;   //Needed for Delphi bug.
  frmList.Show;
  srcBook.Enabled:=True;    //Ditto/
  frmList.dbgBooks.SetFocus;
  frmList.edtSearch.text:=''; edtSearch.text:='';
  //if frmList.ShowModal=mrAbort then close;
  //rgIndex.ItemIndex:=frmList.rgIndex.ItemIndex;
  //show;

  end;


procedure TfrmEdit.srcBookDataChange(Sender: TObject; Field: TField);
begin
  case tblBook.State of
    dsInsert: edtState.text:='Insert';
    dsBrowse: edtState.text:='Browse';
    dsEdit: edtState.text:='Edit';
  else edtState.text:='Other';
  end;
  if tblBook.Modified then edtState.text:=
        edtState.text+' M';
end;

procedure TfrmEdit.btnAuthClick(Sender: TObject);
begin
  frmAuth.edtSearch.text:=dbeAuth.text;
  if frmAuth.ShowModal<>mrCancel then begin
     if tblBook.State=dsBrowse then tblBook.Edit;
     dbeAuth.Field.AsString:=
        frmAuth.dbgAuth.SelectedField.Value;
     dbeTtl.SetFocus;
  end
  else dbeAuth.SetFocus;
end;

procedure TfrmEdit.edtSearchChange(Sender: TObject);
var v, code: integer;
begin
  if ActiveControl=edtSearch then begin  //Respond only to user-entered changes
    if rgIndex.ItemIndex=0 then begin
      val(edtSearch.Text,v,code);
      if code<>0 then exit;  //Ignore invalid book number
    end;
    tblBook.FindNearest([edtSearch.Text]);
  end;
end;

procedure TfrmEdit.edtSearchKeyPress(Sender: TObject; var Key: Char);
begin
  if key=chr(13) then edtSearchChange(Sender);  //Trigger search on Enter, too
end;

procedure TfrmEdit.DBNavigator1Click(Sender: TObject;
  Button: TNavigateBtn);
begin
  //edtSearch.Text:='';
end;

procedure TfrmEdit.btnSubjClick(Sender: TObject);
begin
  Hide;
  frmSubj.ShowModal;
  Show;
end;

procedure TfrmEdit.btnTypClick(Sender: TObject);
begin
  Hide;
  frmTyp.ShowModal;
  Show;
end;

procedure TfrmEdit.tblBookAfterOpen(DataSet: TDataSet);
begin
  lblNrecs.Text:=IntToStr(tblBook.RecordCount);
end;

procedure TfrmEdit.tblBookAfterDelete(DataSet: TDataSet);
begin
  lblNrecs.Text:=IntToStr(tblBook.RecordCount);
end;


procedure TfrmEdit.tblBookAfterPost(DataSet: TDataSet);
begin
  lblNrecs.Text:=IntToStr(tblBook.RecordCount);
end;

procedure TfrmEdit.Button1Click(Sender: TObject);
begin
     Hide;
     frmRpt.ShowModal;
     Show;
end;

end.

 
 

 next      back up to work samples