Einzelnen Beitrag anzeigen

angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: ObjectList im Zusammenspiel mit Interfaces

  Alt 17. Feb 2011, 07:52
Hi nochmals,

ich glaube das ist nicht ganz das was ich suche.
Ich bin in der Zwischenzeit hingegangen und habe mir in einem Testprojekt eben eine solche Liste exportiert... Nun funktioniert das bei mir. Da ich nciht weis, ob das vielleicht einfach mal zufällig funktioniert, und ich eigentlich doch noch einen Fehler mache hier einmal mein Testprojekt.

Habe das Projekt zusätzlich einmal angehangen, falls jemand nochmal direkt reinschauen muss/moechte.

Kann man das so machen, oder mache ich da noch etwas falsch? Vielen dank für alle Anregungen.

1. Die DLL zum erzeugen der Objekte/Zurückliefern des Interfaces:

DLL - DPR
Delphi-Quellcode:
library myobjects;

uses
  SysUtils,
  Classes,
  obj_myobject in 'obj_myobject.pas',
  obj_myobjectlist in 'obj_myobjectlist.pas',
  itf_myobjectlist in '..\Shared\itf_myobjectlist.pas',
  itf_myobject in '..\Shared\itf_myobject.pas';

{$R *.res}

function CreateMyObjectList: IMyObjectList;
begin
  Result := TMyObjectList.Create;
end;

function CreateMyObject: IMyObject;
begin
  Result := TMyObject.Create;
end;

exports
  CreateMyObjectList,
  CreateMyObject;

begin
end.
DLL-Unit für die Objektliste

Delphi-Quellcode:
unit obj_myobjectlist;

interface

uses
  itf_myobjectlist,
  itf_myobject,
  obj_myobject,
  Classes;

type
  TMyObjectList = class(TInterfaceList, IMyObjectList)
  private
    function GetItem(ANdx: Integer): IMyObject;
    procedure SetItem(ANdx: Integer; const AValue: IMyObject);

    function Summe: Integer;
  public
    property Items[ANdx: Integer]: IMyObject read GetItem write SetItem;
  end;

implementation

function TMyObjectList.GetItem(ANdx: Integer): IMyObject;
begin
  Result := IMyObject(inherited Items[ANdx]);
end;

procedure TMyObjectList.SetItem(ANdx: Integer; const AValue: IMyObject);
begin
  inherited Items[ANdx] := AValue;
end;

function TMyObjectList.Summe: Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to Count - 1 do
  begin
    Inc(Result, Items[i].Value);
  end;
end;

end.
DLL-Unit für das Objekt

Delphi-Quellcode:
unit obj_myobject;

interface

uses
  itf_myobject;

type
  TMyObject = class(TInterfacedObject, IMyObject)
  private
    FValue: Integer;
    function GetValue: Integer;
    procedure SetValue(const AValue: Integer);
  public
    property Value: Integer read GetValue write SetValue;
  end;

implementation

{ TMyObject }

function TMyObject.GetValue: Integer;
begin
  Result := FValue;
end;

procedure TMyObject.SetValue(const AValue: Integer);
begin
  FValue := AValue;
end;

Und hier jetzt einmal die Exe

Main-Unit

Delphi-Quellcode:
unit main;

interface

uses
  itf_myobjectlist,
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  u_interface_functions,
  Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  MyList: IMyObjectList;
  i: Integer;
begin
  MyList := CreateMyObjectList;
  for i := 0 to 9 do
  begin
    MyList.Add(CreateMyObject);
    MyList.Items[i].Value := i * 2;
  end;

  ShowMessage(IntToStr(MyList.Summe));
end;

end.
Unit mit den Funktionsaufrufen zur DLL

Delphi-Quellcode:
unit u_interface_functions;

interface

uses
  itf_myobjectlist,
  itf_myobject;

function CreateMyObjectList: IMyObjectList; external 'myobjects.dll';
function CreateMyObject: IMyObject; external 'myobjects.dll';

implementation

end.
Und zum Schluss die von beiden benutzten Interfaces

Interface für die Objektliste
Delphi-Quellcode:
unit itf_myobjectlist;

interface

uses
  itf_myobject;

type
  IMyObjectList = interface
    ['{745DFF06-A671-42FE-B3DE-B6BBCBDEB154}']

    function GetItem(ANdx: Integer): IMyObject;
    procedure SetItem(ANdx: Integer; const AValue: IMyObject);
    function Summe: Integer;
    function Add(const Item: IInterface): Integer;

    property Items[ANdx: Integer]: IMyObject read GetItem write SetItem;
  end;

implementation
end.
Interface für das Objekt

Delphi-Quellcode:
unit itf_myobject;

interface

type
  IMyObject = interface
    ['{B95AF2E0-16AD-4CA6-8296-6457788DA213}']

    function GetValue: Integer;
    procedure SetValue(const AValue: Integer);

    property Value: Integer read GetValue write SetValue;
  end;

implementation
end.
Gruß
Ansgar
Angehängte Dateien
Dateityp: zip interfaceschrimpel.zip (468,2 KB, 5x aufgerufen)
Ansgar
  Mit Zitat antworten Zitat