Weiteres Beispiel sind Binary übergreifende Objekte. So kann man die Funktionalität erweitern ohne eine wilde Sammlung von Methoden zu exportieren. Zum Beispiel bei Listen (ListViews oder Grids) habe ich gerne ein Popupmenu mit Funktionen. Wenn ich ein Untermenü zum Exportieren habe, kann ich dieses um Formate erweitern, in dem ich einfach eine weitere
DLL ins Programmverzeichnis lege. Ein bisschen Pseudo Code:
Interfaces
Delphi-Quellcode:
IList = interface
['{1359E96A-BE76-4466-AFBA-CAFA950A4052}']
procedure First;
procedure Prior;
procedure Next;
procedure Last;
function FieldCount: Integer;
function FieldCaption(AFieldNo: Integer): String;
function FieldValue: Variant;
function Eof: Boolean;
end;
IPlugin = interface
['{F2D42A98-ECC5-4633-A0E9-C90F1DAB7A88}']
end;
IPluginManager = interface
['{FB80046D-24EB-4214-966D-D0F97699B3FC}']
procedure RegisterPlugin(APlugin: IPlugin);
end;
IListExporter = interface
['{B16E7F30-D6A7-4B83-870A-4E8B072949CC}']
procedure ExportList(AList: IList);
function Caption: String;
end;
DLL Auszug
Delphi-Quellcode:
TCsvExporter = class(TInterfacedObject, IPlugin, IListExporter)
public
procedure ExportList(AList: IList);
function Caption: string;
end;
procedure InitPlugin(AManager: IPluginManager);
begin
AManager.RegisterPlugin(TCsvExporter.Create);
end;
exports
InitPlugin;
Beim Programmstart wird die
DLL geladen und die InitPlugin Prozedur aufgerufen.
Und so ungefähr wird das Menü aufgebaut
Delphi-Quellcode:
var
CurrentPlugin: IPlugin;
tmpExporter: IListExporter;
begin
for CurrentPlugin in tmpManager.Plugins do
begin
if CurrentPlugin.GetInterface(IListExporter, tmpExporter) then
pmExport.Add(tmpExport.Caption);
end;
Eine weitere Möglichkeit sind .Net Assemblys. Es gibt einige Frameworks für .Net die es für Delphi gar nicht oder nicht annährend in vergleichbarer Qualität gibt. Die benötigte Funktionalität kapsele ich dann in einer Klasse und diese wird per Interface bereitgestellt.
Und noch ein (für uns/mich) sehr wichtiges Beispiel fällt mir ein: Delphi's Tools
API (auch nur ein Plugin Beispiel).
(In der echten Welt muss man natürlich noch auf Aufrufkonventionen und Datentypen/Marshalling achten....)