Home » Tutorials » Datenbanken » Interbase

Interbase

Erweiterung der Programmoberfläche

Um den Erkenntnissen aus dem Theorieteil Rechnung zu tragen, soll unsere Programmoberfläche zweigeteilt werden:
Im oberen Teil befindet sich die Steuerung und die Detailmaske, im unteren Bereich befindet sich ein Datengrid zur Übersicht über die Daten.
Dazu setzt du die Eigenschaft Align des Panels auf „alTop“ und machst das Programmfenster größer. Als nächstes setzt du eine TSplitter-Komponente in unser Fenster (Register Zusätzlich, 11. Komponente). Deren Align-Eigenschaft änderst du ebenfalls auf „alTop“, und die Eigenschaft Visible auf „false“, damit der Anwender sie nicht in der Gegend herum schieben kann. Sie soll dazu dienen, dass, sollte der Anwender das Fenster vergrößern, der zusätzliche Platz vom DBGrid genutzt wird.
In den unteren Bereich kommt ein DBGrid und dessen Align-Eigenschaft auf „alClient“ setzen.
Weiter gehts im Datenmodul. Hier fügst du eine weitere TIBDataSet und eine TDataSource hinzu. Deren Namen werden in „Grid“ und „DSGrid“ geändert. Die DataSet-Eigenschaft von DSGrid setzt du auf „Grid“. Die Database-Eigenschaft wird auf unsere IBAdresse gesetzt. In das SelectSQL kommt folgendes SQL-Statement:

 SELECT Name, Vorname, Ort, ID FROM Adresse;

Die restlichen SQL-Statements bleiben diesmal leer!
So nun wirds richtig kompliziert. Da der DBNavigator für alle die gut ist, die sich öfters mit Programmen auseinandersetzen, aber nicht für die „normalen“ Anwender, werden wir uns einen Ersatz für den Navigator zusammenbasteln. Also wird der DBNavigator erst mal rausgeworfen. Nun stellst du die ReadOnly-Eigenschaften der verbleibenden DB-Komponenten auf „true“! Damit können die Anwender nur dann was eingeben, wenn sie es auch wirklich wollen und du (das Programm) es auch mitbekommst.
Zunächst werden wir eine Methode schreiben, die zwischen „Schreiben möglich“ und „Schreiben nicht möglich“ umschaltet. Die Prozedur nennst du MaskeSetzen. Schreib in den Private-Teil der Klasse TFMain:

procedure MaskeSetzen;
und im „Implementation“-Teil folgenden Code:
procedure TFMain.MaskeSetzen;
var i: integer;
edt: TDBEdit;
begin
if DBEdit1.ReadOnly then      //wird in Schreibmodus gestellt
begin
for i:=1 to 6 do
begin
edt := TDBEdit(FindComponent(‚DBEdit’+IntToStr(i)));
edt.ReadOnly := false;
end;
end
else
begin
for i:=1 to 6 do       //Maske wird wieder gesichert
begin
edt := TDBEdit(FindComponent(‚DBEdit’+IntToStr(i)));
edt.ReadOnly := true;
end;
end;
end;

Kleine Erläuterung zum Code

Hier wird einfach die ReadOnly-Eigenschaft der DBEdits in einer Schleife geändert. Wenn die DBEdits individuelle Namen haben, funktioniert das Ganze natürlich nicht mehr so einfach. Später muss diese Prozedur noch den neuen Navigator miteinschließen, damit auch dort der Anwender „an der Hand“ geführt werden kann.
Dann setzt du fünf TSpeedButtons auf das Formular. Die Eigenschaften Name und Caption werden von den Speedbuttons, von links nach rechts angeordnet, wie folgt geändert:

  • sbtnInsert; Einfügen
  • sbtnEdit; Ändern
  • sbtnPost; Speichern
  • sbtnCancel; Abbrechen
  • sbtnDelete; Löschen

Die Enable-Eigenschaft der SpeedButtons „Speichern“ und „Abbrechen“ wird auf „false“ geändert. Nun kannst Du die MaskeSetzen-Prozedur erweitern.

procedure TFMain.MaskeSetzen;
var i: integer;
    edt: TDBEdit;
begin
  if DBEdit1.ReadOnly then
  begin
    for i:=1 to 6 do
    begin
      edt:=TDBEdit(FindComponent('DBEdit'+IntToStr(i)));
      edt.ReadOnly:=false;
    end;
    sbtnInsert.Enabled:=false;
    sbtnEdit.Enabled:=false;
    sbtnPost.Enabled:=true;
    sbtnCancel.Enabled:=true;
    sbtnDelete.Enabled:=false;
  end
  else
  begin
    for i:=1 to 6 do
     begin
      edt:=TDBEdit(FindComponent('DBEdit'+IntToStr(i)));
      edt.ReadOnly:=true;
    end;
    sbtnInsert.Enabled:=true;
    sbtnEdit.Enabled:=true;
    sbtnPost.Enabled:=false;
    sbtnCancel.Enabled:=false;
    sbtnDelete.Enabled:=true;
  end;
end;

Jetzt wenden wir uns dem Navigator zu. Folgender Code kommt in die Ereignisprozedur des OnClick-Ereignisses der Buttons:

Einfügen

procedure TFMain.sbtnInsertClick(Sender: TObject);
begin
  MaskeSetzen;
  DM.Adresse.Insert;
end;

Ändern

procedure TFMain.sbtnEditClick(Sender: TObject);
begin
  MaskeSetzen;
  DM.Adresse.Edit;
end;

Speichern

procedure TFMain.sbtnPostClick(Sender: TObject);
begin
  DM.Adresse.Post;
  MaskeSetzen;
end;

Abbrechen

procedure TFMain.sbtnCancelClick(Sender: TObject);
begin
  DM.Adresse.Cancel;
  MaskeSetzen;
end;

Löschen

procedure TFMain.sbtnDeleteClick(Sender: TObject);
begin
  if MessageDlg('Wollen Sie diesen Datensatz wirklich löschen?',
  mtWarning,[mbYes,mbNo],0)=mrYes then
    DM.Adresse.Delete;
end;

So, jetzt noch schnell die DataSource-Eigenschaft des DBGrid auf „DM.DSGrid“ ändern und im OnShow des Formulars FMain (TFMain.OnShow) unter

 DM.Adresse.Open;
  DM.Grid.Open;

eintragen. Nun muss unser Programm laufen…..