Logik und Darstellung trennen!
Ich mache es immer so, dass ich zuerst eine Klassenstruktur erstelle, die die benötigten Daten beinhaltet, Methoden zum Zugriff und zur Verwaltung etc. bietet. Die
GUI ist nur die letzte Schicht, sozusagen eine Maske, die auf die eigentlichen Daten aufgesetzt wird, und mir gefilterten Zugriff auf die eigentliche Verarbeitungsschicht bietet.
Alle datenbezogenen Formulare (z.B. Einstellungsfenster, Fenster zum Anlegen von Datensätzen usw.) werden zunächst mal aus der Liste der automatisch beim Programmstart erzeugten Formulare in der Projektdatei entfernt. Stattdessen wird in der jeweiligen
Unit eine function erstellt (etwas mehr
OOP wäre vllt. ein neuer Konstruktor), die
- das zu modifizierende Datenobjekt als Parameter entgegennimmt,
- automatisch das Formular erstellt,
- die Werte aus den Datenobjekt in die Steuerelemente des Formulars schreibt und
- das Formular anschließend per ShowModal anzeigt.
- Danach wird ModalResult ausgewertet:
- Wenn es mrOK entspricht, werden die Daten aus den Steuerelementen zurück ins Objekt geschrieben und die Funktion gibt True zurück.
- Andernfalls bleibt das Objekt wie es ist und die FUnktion gibt False zurück.
Konkret aussehen könnte das so:
Delphi-Quellcode:
unit unContacts;
type
TContact =
class
public
Name:
string;
Email:
string;
Birthday: TDateTime;
{ ... }
procedure SaveToFile;
procedure LoadFromFile;
end;
TContactList =
class(TObjectList)
private
{ ... }
public
property Items[
Index: integer]: TContact
read GetItem
write SetItem;
procedure SaveToFile(FileName:
string);
{ ...}
end;
implementation
{...}
end.
Delphi-Quellcode:
unit unContactEditor;
uses
unContacts;
type
TfrmContactEditor =
class(TForm)
edName,
edEmail,
edBirthday: TEdit;
btnOK,
// ModalResult = mrOK
btnCancel: TButton;
// ModalResult = mrCancel
end;
function EditContactData(Contact: TContact): boolean;
implementation
function EditContactData(Contact: TContact): boolean;
var
LForm: TfrmContactEditor;
begin
LForm := TfrmContactEditor.Create(Application);
LForm.edName.Caption := Contact.
Name;
LForm.edEmail.Caption := Contact.Email;
LForm.edBirthday.Caption := DateToStr(Contact.Birthday);
if LForm.ShowModal = mrOK
then
begin
Contact.
Name := LForm.edName.Caption;
Contact.Email := LForm.edEmail.Caption;
Contact.Birthday := StrToDate(LForm.edBirthday.Caption);
Result := True;
end
else
Result := False;
LForm.Free;
end;
end.
Delphi-Quellcode:
unit unMain;
uses
unContacts, unContactEditor;
type
TfrmMain =
class(TForm)
lstContacts: TListBox;
// Liste mit verschiedenen Kontakten drin
btnEditContact: TButton;
// In Liste selektierter Kontakt soll bearbeitet werden
procedure btnEditContactClick(Sender: TObject);
private
ContactList: TContactList;
end;
implementation
procedure TFrmMain.btnEditContactClick(Sender: TObject);
var
LContact: TContact;
begin
if lstContacts.ItemIndex >= 0
then
begin
// Anmerkung: Wir nutzen das hier nur, um elegant an das Objekt zu bekommen.
// Die Objekte sind eigentlich in ContactList "gespeichert", lstContacts enthält
// lediglich zusätzliche Referenzen.
LContact := TContact(lstContacts.Items.Objects[lstContacts.ItemIndex]);
if EditContactData(LContact)
then
begin
// Dieser Block wird ausgeführt, wnen das Objekt verändert wurde
// wir könnten jetzt irgendwelche Anzeigen aktualisieren oder abspeichern usw...
ContactList.SaveToFile('
blabla.blub');
{ ... }
end;
end;
end;
end.
Ist nur hier "schnell" im Beitragseditor runtergeschrieben, aber ich hoffe das Prinzip wird klar.