Hallo zusammen,
ich habe in den vergangenen Tagen einen Thread geöffnet und bin in meiner Unwissenheit von einer falschen Idee ausgegangen.
Jetzt will ich's nochmal neu angehen und frage hier mal in die Landschaft, ob sich einer aufopfert, mir an der Stelle zu helfen.
Ich wollte schön sauber getrennt ein Programm entwerfen, erst mal nur als Test, um zu sehen, wie es läuft (nun, es lief nicht) und habe dies nun entschlankt und nochmal probiert.
Die Fehlermeldung ist dieselbe wie immer, ist auch unten als Screenshot angehängt.
Im AVD lässt sich das als App aufrufen, der Compiler meldet keinen Fehler. Im Debug-Modus zeigt mir das ganze schon im "program"-Teil Main ab "Presenter := TPresenter.Create(View, Model);",
dass View= NIL ist.
Ich gehe jetzt mal davon aus, das Stevie recht hat siehe:
Zitat:
Generell sei aber gesagt, dass viele Fehler bei Code, der unter Windows läuft aber auf Android/iOS nicht, in der unterschiedlichen Handhabung von Objekten zu suchen sind.
Auf den mobilen Geräten wird dort ARC genutzt - also Objekte werden genauso referenzgezählt, wie Interfaces.
ich aber auf der anderen Seite nicht wirklich weiß, wie das dann zu beheben ist.
Ich habe jetzt einfach mal den gesamten Quellcode reingesteckt, dann wird's zwar viel, aber letztlich klar. - Denke ich
Das Programm
Code:
program AppTwo;
uses
System.StartUpCopy,
FMX.MobilePreview,
FMX.Forms,
Viewer in 'Viewer.pas' {View},
MBPresenter in 'MBPresenter.pas',
MBModel in 'MBModel.pas',
MBInterface in 'MBInterface.pas';
{$R *.res}
Procedure Main;
Var Model : IMyInterfaceModel;
View : TView;
Presenter : TPresenter;
Begin
Application.CreateForm(TView, View);
Model := TModel.Create;
Presenter := TPresenter.Create(View, Model);
try
Application.Run;
finally
Presenter.Free;
Model._Release;
end;
End;
begin
Application.Initialize;
Main;
end.
Die View
Code:
unit Viewer;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, MBInterface,
FMX.Objects;
type
TView = class(TForm, IMyInterfaceView)
Text1: TText;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
Procedure SetHelloWorld (Value : String);
end;
var
View: TView;
implementation
{$R *.fmx}
Procedure TView.SetHelloWorld (Value : String);
Begin
Text1.Text := Value;
End;
end.
Der Presenter
Code:
unit MBPresenter;
interface
uses System.SysUtils, MBInterface;
Type TPresenter = Class
fView : IMyInterfaceView;
fModel : IMyInterfaceModel;
public
constructor Create(const View: IMyInterfaceView; const Model: IMyInterfaceModel);
End;
implementation
constructor TPresenter.Create(const View: IMyInterfaceView; const Model: IMyInterfaceModel);
Begin
if not Assigned( View ) then
raise System.SysUtils.EArgumentNilException.Create( 'View' );
if not Assigned( Model ) then
raise System.SysUtils.EArgumentNilException.Create( 'Model' );
fView := View;
fModel := Model;
fView.SetHelloWorld(fModel.getHelloWorld);
End;
end.
Das Model
Code:
unit MBModel;
interface
uses MBInterface;
Type TModel = Class(TInterfacedObject, IMyInterfaceModel)
fHelloWorld : String;
public
constructor create;
published
Function getHelloWorld : String;
End;
implementation
constructor TModel.create;
begin
fHelloWorld := 'Hello World';
end;
Function TModel.getHelloWorld : String;
begin
Result := fHelloWorld;
end;
end.
Das Interface
Code:
unit MBInterface;
interface
Type IMyInterfaceModel = Interface(IInterface)
['{80AC074A-7D51-49F2-B94D-2716B9CBA938}']
Function getHelloWorld : String;
End;
Type IMyInterfaceView = Interface(IInterface)
['{D550D27A-57CA-4AAE-809E-60417E7E7DDC}']
Procedure SetHelloWorld (Value : String);
End;
implementation
end.