Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Glaubensfrage: Auf zweite Form zugreifen

  Alt 28. Jan 2010, 20:25
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.
  Mit Zitat antworten Zitat