Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Überprüfen ob ein Objekt existiert aber wie? (https://www.delphipraxis.net/37259-ueberpruefen-ob-ein-objekt-existiert-aber-wie.html)

WIng2005 9. Jun 2013 00:29

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Hallo Luckie,

Delphi-Quellcode:
freeandnil(mplayer)
Delphi-Quellcode:
destructor TMPlayer.destroy;
 begin
 try
  // Abschalten + div Einstellungen zurücksetzen
 finally
  mplayer:=nil;
  inherited destroy;
 end;
 end;
Hoffe mal, das passt so..

Sir Rufo 9. Jun 2013 00:38

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Eher nicht ...

Eine globale Variable ist schon mal pauschal pfui.
Eine globale Variable innerhalb des
Delphi-Quellcode:
destructors
(so) auf
Delphi-Quellcode:
nil
zu setzen ist der totale SuperGAU und daher immer falsch (selbst wenn es compiliert und anscheinend läuft).

WIng2005 9. Jun 2013 00:50

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Guten Morgen ;)
Wie wäre es dann besser?

DeddyH 9. Jun 2013 09:29

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Delphi-Quellcode:
destructor TMPlayer.destroy;
begin
  // Abschalten + div Einstellungen zurücksetzen
  inherited destroy;
end;
Und dort, wo Du die Objektinstanz freigibst, dann
Delphi-Quellcode:
FreeAndNil(mPlayer);

WIng2005 9. Jun 2013 16:36

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Hallo DeddyH,

danke für die Antwort. Das Ganze hatte ich nach ein wenig drüber nachdenken schon geändert. Nun würde ich gern noch das "Eine globale Variable ist schon mal pauschal pfui" angehen. Ich hatte mir mal das Buch "Class in a box" gekauft. Dort ist das gängige Praxis, was ja nicht heißen muss, dass es "optimal" ist.
Momentan habe ich die Variable im Interface-Abschnitt meines Hauptprogrammes deklariert:

Delphi-Quellcode:
unit Main;

interface
uses
//

type
  TMainform = class(TForm)
   //
   //
 private
   //
  public
   //
  end;

var
  Mainform: TMainform;
  mPlayer: TMPlayer;

implementation

//usw.
Spricht da prinzipiell was dagegen?
Danke für eure Hilfe!!

DeddyH 9. Jun 2013 16:43

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Damit hat jede Unit, die Main einbindet, uneingeschränkten Zugriff auf die Instanz. Willst Du das? Oder wäre es nicht besser, sie als privates Feld des Formulars zu deklarieren und den Zugriff nur über definierte Schnittstellen (wenn überhaupt) zu erlauben?

Furtbichler 9. Jun 2013 18:28

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Ein Singleton wäre hier noch eine Alternative. Eine Unit verwaltet Instantiierung, Zugriff und Freigabe. So etwa:

Delphi-Quellcode:
Unit MPlayer;
interface

function MediaPlayer : TMediaPlayer;
implementation
var
  _mediaPlayer : TMediaPlayer;
  _finalized : boolean;

Function MediaPlayer : TMediaPlayer;
Begin
  if _mediaPlayer=nil then
   if _finalized then
     Raise Exception.Create('Application has shut down.')
   else
     _mediaPlayer := TMediaPlayer.Create;

  result = _mediaPlayer;
end;

initialization
  _finalized := false;
  _mediaplayer := nil;
finalization
  _finalized := true;
  FreeAndNil(_mediaplayer);
end.
Der Zugriff erfolgt nur über die Funktion 'MediaPlayer', die bei Bedarf eine -und nur eine- Instanz erstellt.

Ich persönlich würde den Zugriff auf ein Gerät nicht in einem Formular kapseln, denn das ist dafür nicht zuständig. Das Gerät selbst muss wissen, ob es nur von einer Entität bedient werden kann oder ob es mit mehreren Anwendern klar kommt.

Sir Rufo 10. Jun 2013 08:28

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Also speziell in diesem Fall mit dem MediaPlayer würde ich ein Facade Design Pattern wählen.

Mal vereinfacht angenommen, der MediaPlayer soll sich nachher bedienen lassen mit den Funktionen Play, Stop, Power (zum Ein-/Ausschalten), dann würde die Facade so aussehen:
Delphi-Quellcode:
IMediaPlayerFacade = interface
  {GUID}
  procedure Play;
  procedure Stop;
  procedure Power;
end;
Eine konkrete Facade wäre dann z.B.
Delphi-Quellcode:
TMediaPlayerFacade = class( TInterfacedObject, IMediaPlayerFacade )
private
  FPlayer : TMPlayer;
protected
  procedure Play;
  procedure Stop;
  procedure Power;
end;

procedure TMediaPlayerFacade.Play;
begin
  if Assigned( FPlayer )
  then
    begin
      { Hier der Code um den Player zu starten }
    end;
end;

procedure TMediaPlayerFacade.Stop;
begin
  if Assigned( FPlayer )
  then
    begin
      { Hier der Code um den Player zu stoppen }
    end;
end;

procedure TMediaPlayerFacade.Power;
begin
  if Assigned( FPlayer )
  then
    begin
      FreeAndNil( FPlayer );
    end
  else
    begin
      FPlayer := TMPlayer.Create;
    end;
end;
Da der MediaPlayer aber nur eine Komponente von der Haussteuerung ist (nehme ich mal an), brauchen wir ein globales Steuerung-Element, wo alle anderen Facades gesammelt werden
Delphi-Quellcode:
IHausSteuerung = interface
  {GUID}
  function GetMediaPlayer : IMediaPlayerFacade;
  property MediaPlayer : IMediaPlayerFacade read GetMediaPlayer;
end;
Konkret kann das jetzt wie folgt umgesetzt werden
Delphi-Quellcode:
unit HausSteuerungSingleton;

interface

uses
  HausSteuerungIntf;

function HausSteuerung : IHausSteuerung;

implementation

uses
  MediaPlayerFacadeIntf,
  MediaPlayerFacade;

var
  _HausSteuerung : IHausSteuerung;

type
  THausSteuerung = class( TInterfacedObject, IHausSteuerung )
  private
    FMediaPlayer : IMediaPlayerFacade;
  protected
    function GetMediaPlayer : IMediaPlayerFacade;
  public
    constructor Create;
  end;

constructor THausSteuerung.Create;
begin
  inherited;
  FMediaPlayer := TMediaPlayerFacade.Create;
end;

function THausSteuerung.GetMediaPlayer : IMediaPlayerFacade;
begin
  Result := FMediaPlayer;
end;

function HausSteuerung : IHausSteuerung;
begin
  if not Assigned( _HausSteuerung )
  then
    _HausSteuerung := THausSteuerung.Create;

  Result := _HausSteuerung;
end;
Der Lohn der Mühe ist dann die vereinfachte Benutzung der Module.

3 Button auf die Form geklatscht, die Unit
Delphi-Quellcode:
HausSteuerungSingleton
in die
Delphi-Quellcode:
implementation
Uses-Liste aufnehmen und die Button-OnClick Ereignisse jeweils mit
Delphi-Quellcode:
HausSteuerung.MediaPlayer.Power;
// bzw.
HausSteuerung.MediaPlayer.PLay;
// bzw.
HausSteuerung.MediaPlayer.Stop;
verdrahten

WIng2005 11. Jun 2013 21:49

AW: Überprüfen ob ein Objekt existiert aber wie?
 
Hallo zusammen,

vielen Dank für die Ansätze/Vorschläge. Die letzten beiden werde ich mir wohl mal als "Bettlektüre" drucken müssen....(um sie zu verstehen ;) )

WIng2005 11. Jun 2013 22:21

AW: Überprüfen ob ein Objekt existiert aber wie?
 
@Furtbichler

Kannst du mal bitte kurz erläutern, welchen Zweck dieser Bereich erfüllt, bzw. wann dieser aufgerufen wird?:

Delphi-Quellcode:
initialization
  _finalized := false;
  _mediaplayer := nil;
finalization
  _finalized := true;
  FreeAndNil(_mediaplayer);
end
Danke euch allen!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz