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…..