Announcement

Collapse
No announcement yet.

Interface für ein Formular realisieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Interface für ein Formular realisieren

    Hallo,
    ich möchte gerne in meiner Anwendung die Druckthematik (auch Export und Import einer Datenmenge) über Schnittstellen lösen. Ich habe z. B. ein Formular für die Eingabe und das Auflisten von Mitarbeitern. Dieses Formular(TMitarbeiterForm) soll ein Interface IPrintFormular implementieren.

    type TMitarbeiterForm (TForm, IPrintFormular)

    aber bei diesem Ansatz müsste ich in allen Formularen, die gedruckt werden sollen, die IUnknown Methoden implementieren. Daraufhin habe eine Membervariable in jedem Formular eingefügt, die von TInterfacedObject vererbt ist und IPrintFormular implementiert. Das funktioniert aber auch nicht so richtig toll, da ich beim Drucken sagen will:

    (AktivesFromular as IPrintFormular).PrintFormular

    Gibt es da Lösungsvorschläge?

  • #2
    schau mal in der Hilfe nach "implements". Die Lösung wäre dann das ein TForm ein Interface delegiert das durch ein privates Object representiert wird.

    <pre>

    type
    IPrintable = interface
    {...}
    end; <br>

    TForm1 = class(TForm, IPrintable)
    private
    FPrintable: IPrintable;
    public
    property Printable: IPrintable read FPrintable implements IPrintable;
    end;<br>

    impleentation<br>

    type
    TForm1Printable = class(TInterfacesObject, IPrintable)
    FOwner: TForm1;
    {...}
    end;<br>

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    FPrintable := TForm1Printable.Create(Self);
    end;<br>

    </pre>

    Oder aber du nutzt deine eigene TForm Basis Klasse von der dann alle deine Forms abgeleitet sind. Das könnte so aussehen:

    <pre>

    type
    TPrintableForm = class(TForm)
    public
    procedure MyPrint; virtual; abstract;
    // hier also alle Druckmethoden deklarieren
    end;<br>

    // Anwendung dann<br>
    unit Unit1;<bR>

    interface<br>

    uses MyForms;<br>

    type
    TForm1 = class(TPrintableForm)
    procedure MyPrint; override;
    end; <br>

    </pre>

    Ich bevorzuge den zweiten Fall, da er restriktiv durch das OO-Design logisch richtiger wäre. Und er funktioniert in jeder Delphi Version.<br>
    Mehr flexibler sollte aber der Weg über Interfaces sein, da man eben in zukünftigen Erweiterungen neue Interfaces hinzufügen kann. D.h. man ist nicht abhängig von Deklarationen die schon in der Basisklassen getätigt werden müssen.<br>
    Einzigstes Problem mit den TForm's ist halt der Punkt das sie die IUnknown/IInterface Basismethoden/Referenzecounting nicht implementieren. Sie sollten von TInterfacedObject abgeleitet sein.<br>

    Gruß Hage

    Comment

    Working...
    X