Delphi kursusbeskrivelse

5. Planlægning af applikationen

Et første udkast til et skærmbillede for bibliotekssystemet:

Når søgningen aktiveres kaldes en speciel dialogboks. For at søgningen skal være nogenlunde let at gå til, skal man oprette alternative index for databasens felter Forfatter, Titel og ISBN-nr.

Styringen af applikationen kan selvfølgelig foregå på mange forskellige måder. I dette tilfælde forestiller jeg mig, at styringen skal ske være baseret på kontrolknapper i skærmbilledet. Afhængig af, hvilken tilstand applikationen befinder sig i, er der forskellige knapper, der kan anvendes. Dette kan styres med knappernes Enabled property. Efterhånden som tilstanden skifter, aktiveres og deaktiveres de forskellige knapper. Ved starten kan man f.eks. bruge knapperne Første, Næste, Forrige, Sidste, Ny, Ret, Slet og Søg. Knapperne OK og Cancel er deaktiverede. Vælger man f.eks. Ny er knapperne OK og Cancel aktiverede, og alle andre knapper er deaktiverede.

De forskellige mulige tilstande kan beskrives diagrammatisk i et tilstandsdiagram:

Jeg forestiller mig, at diagrammet skal bruges til at finde ud af, hvad man skal tage højde for, når man står i en given Event-handler. Hvis man f.eks. er i Ret's OnClick event kan man se, at OK og Cancel knapperne skal kunne aktiveres som de eneste.

Databasen selv kan være i en af flere tilstande:

Inactive

Browse

Insert

Edit

SetKey

Den første delopgave består i at få etableret et skærmbillede til opdatering af bog-tabellen i databasen.

Udvalgte event-handlere i relation til Form1:

procedure TForm1.AppState0;
begin
Foerste.Enabled:= True;
Naeste.Enabled:= True;
Forrige.Enabled:= True;
Sidste.Enabled:= True;
if Table1.BOF then
  begin
  Foerste.Enabled:= False;
  Forrige.Enabled:= False;
  end;
if Table1.EOF then
  begin
  Sidste.Enabled:= False;
  Naeste.Enabled:= False;
  end;
Ny.Enabled:= True;
Ret.Enabled:= True;
Slet.Enabled:= True;
Soeg.Enabled:= True;
OK.Enabled:= False;
Cancel.Enabled:= False;
{ Menupunkter }
Afslut1.Enabled:= True;
{ Felter }
Bognr.ReadOnly:= True;
Forfatter.ReadOnly:= True;
Titel.ReadOnly:= True;
ISBNnr.ReadOnly:= True;
Forlag.ReadOnly:= True;
Udgivelsesaar.ReadOnly:= True;
Oprettelsesdato.ReadOnly:= True;
AppState:= 0;
end;

procedure TForm1.AppState1;
begin  { Ny bog }
Foerste.Enabled:= False;
Naeste.Enabled:= False;
Forrige.Enabled:= False;
Sidste.Enabled:= False;
Ny.Enabled:= False;
Ret.Enabled:= False;
Slet.Enabled:= False;
Soeg.Enabled:= False;
OK.Enabled:= True;
Cancel.Enabled:= True;
{ Menupunkter }
Afslut1.Enabled:= False;
{ Felter }
Bognr.ReadOnly:= False;
Forfatter.ReadOnly:= False;
Titel.ReadOnly:= False;
ISBNnr.ReadOnly:= False;
Forlag.ReadOnly:= False;
Udgivelsesaar.ReadOnly:= False;
Oprettelsesdato.ReadOnly:= False;
Bognr.SetFocus;
AppState:= 1;
end;

procedure TForm1.Afslut1Click(Sender: TObject);
begin
Table1.Close;
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Open;
AppState0;
end;

procedure TForm1.FoersteClick(Sender: TObject);
begin
Table1.First;
AppState0;
end;

procedure TForm1.NaesteClick(Sender: TObject);
begin
Table1.Next;
AppState0;
end;

procedure TForm1.ForrigeClick(Sender: TObject);
begin
Table1.Prior;
AppState0;
end;

procedure TForm1.SidsteClick(Sender: TObject);
begin
Table1.Last;
AppState0;
end;

procedure TForm1.NyClick(Sender: TObject);
begin
Table1.Insert;
Table1Oprettelsesdato.Value:= Date;
AppState1;
end;

procedure TForm1.RetClick(Sender: TObject);
begin
Table1.Edit;
AppState2;
end;

procedure TForm1.OKClick(Sender: TObject);
var
   Msg: string;
   i, j: integer;
begin
if AppState in [1, 2] then
  begin
  try
    Table1.Post;
    AppState0;
    except
    on E: EConvertError do
      begin
      Msg:= E.Message;
      if pos('is not a valid date', Msg) > 0 then
        begin
        ShowMessage('Oprettelsesdato er ikke korrekt');
        Oprettelsesdato.SetFocus;
        end;
      end;
    on E: EDatabaseError do
      begin
      Msg:= E.Message;
      if Msg = 'Key violation' then
        begin
        ShowMessage('Det valgte Bognr er allerede oprettet');
        Bognr.SetFocus;
        end;
      if Msg = 'Field ''Bognr'' must have a value' then
        begin
        ShowMessage('Bognr skal være udfyldt');
        Bognr.SetFocus;
        end;
      if Msg = 'Field ''Forfatter'' must have a value' then
        begin
        ShowMessage('Forfatter skal være udfyldt');
        Forfatter.SetFocus;
        end;
      if Msg = 'Field ''Titel'' must have a value' then
        begin
        ShowMessage('Titel skal være udfyldt');
        Titel.SetFocus;
        end;
      if Msg = 'Field value required. Field: ISBN-nr' then
        begin
        ShowMessage('ISBN-nr skal være udfyldt');
        ISBNnr.SetFocus;
        end;
      end;
    end;
  end;

if AppState = 3 then
  begin
  if MessageDlg
    ('Ønskes bogen og alle tilhørende beskrivelser og nøgleord slettet?',
    mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
    Table1.Delete;
    AppState0;
    end;
  end;

end;

procedure TForm1.CancelClick(Sender: TObject);
begin
if AppState in [1, 2, 3] then
  begin
  Table1.Cancel;
  Table1.Refresh;
  AppState0;
  end;
end;

procedure TForm1.SoegClick(Sender: TObject);
begin
AppState4;
if BtnRightDlg1.ShowModal = mrOK then
  begin
  if BtnRightDlg1.RadioButtonBognr.Checked then
    begin
    Table1.IndexFieldnames:= 'Bognr';
    Table1.FindNearest([BtnRightDlg1.Bognr.Text]);
    end;
  if BtnRightDlg1.RadioButtonForfatter.Checked then
    begin
    Table1.IndexFieldnames:= 'Forfatter';
    Table1.FindNearest([BtnRightDlg1.Forfatter.Text]);
    end;
  if BtnRightDlg1.RadioButtonTitel.Checked then
    begin
    Table1.IndexFieldnames:= 'Titel';
    Table1.FindNearest([BtnRightDlg1.Titel.Text]);
    end;
  if BtnRightDlg1.RadioButtonISBN.Checked then
    begin
    Table1.IndexFieldnames:= 'ISBNnr';
    Table1.FindNearest([BtnRightDlg1.ISBN.Text]);
    end;
  end
else
  Table1.Refresh;
AppState0;
end;

procedure TForm1.SletClick(Sender: TObject);
begin
AppState3;
end;

Udvalgte event-handlere i relation til BtnRightDlg1:

procedure TBtnRightDlg1.RadioButtonBognrClick(Sender: TObject);
begin
Bognr.Enabled:= True;
Forfatter.Enabled:= False;
Titel.Enabled:= False;
ISBN.Enabled:= False;
end;

procedure TBtnRightDlg1.RadioButtonForfatterClick(Sender: TObject);
begin
Bognr.Enabled:= False;
Forfatter.Enabled:= True;
Titel.Enabled:= False;
ISBN.Enabled:= False;
end;

procedure TBtnRightDlg1.RadioButtonTitelClick(Sender: TObject);
begin
Bognr.Enabled:= False;
Forfatter.Enabled:= False;
Titel.Enabled:= True;
ISBN.Enabled:= False;
end;

procedure TBtnRightDlg1.RadioButtonISBNClick(Sender: TObject);
begin
Bognr.Enabled:= False;
Forfatter.Enabled:= False;
Titel.Enabled:= False;
ISBN.Enabled:= True;
end;

procedure TBtnRightDlg1.FormActivate(Sender: TObject);
begin
Bognr.Text:= Form1.Table1Bognr.AsString;
Forfatter.Text:= Form1.Table1Forfatter.Value;
Titel.Text:= Form1.Table1Titel.Value;
ISBN.Text:= Form1.Table1ISBNnr.Value;
end;

procedure TBtnRightDlg1.FormCreate(Sender: TObject);
begin
RadioButtonBognr.Checked:= True;
RadioButtonForfatter.Checked:= False;
RadioButtonTitel.Checked:= False;
RadioButtonISBN.Checked:= False;
Bognr.Enabled:= True;
Forfatter.Enabled:= False;
Titel.Enabled:= False;
ISBN.Enabled:= False;
end;



Opdateret 18. april 1997