![]() |
AW: Überprüfen ob ein Objekt existiert aber wie?
Hallo Luckie,
Delphi-Quellcode:
freeandnil(mplayer)
Delphi-Quellcode:
Hoffe mal, das passt so..
destructor TMPlayer.destroy;
begin try // Abschalten + div Einstellungen zurücksetzen finally mplayer:=nil; inherited destroy; end; end; |
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:
(so) auf
destructors
Delphi-Quellcode:
zu setzen ist der totale SuperGAU und daher immer falsch (selbst wenn es compiliert und anscheinend läuft).
nil
|
AW: Überprüfen ob ein Objekt existiert aber wie?
Guten Morgen ;)
Wie wäre es dann besser? |
AW: Überprüfen ob ein Objekt existiert aber wie?
Delphi-Quellcode:
Und dort, wo Du die Objektinstanz freigibst, dann
destructor TMPlayer.destroy;
begin // Abschalten + div Einstellungen zurücksetzen inherited destroy; end;
Delphi-Quellcode:
FreeAndNil(mPlayer);
|
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:
Spricht da prinzipiell was dagegen?
unit Main;
interface uses // type TMainform = class(TForm) // // private // public // end; var Mainform: TMainform; mPlayer: TMPlayer; implementation //usw. Danke für eure Hilfe!! |
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?
|
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:
Der Zugriff erfolgt nur über die Funktion 'MediaPlayer', die bei Bedarf eine -und nur eine- Instanz erstellt.
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. 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. |
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:
Eine konkrete Facade wäre dann z.B.
IMediaPlayerFacade = interface
{GUID} procedure Play; procedure Stop; procedure Power; end;
Delphi-Quellcode:
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
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;
Delphi-Quellcode:
Konkret kann das jetzt wie folgt umgesetzt werden
IHausSteuerung = interface
{GUID} function GetMediaPlayer : IMediaPlayerFacade; property MediaPlayer : IMediaPlayerFacade read GetMediaPlayer; end;
Delphi-Quellcode:
Der Lohn der Mühe ist dann die vereinfachte Benutzung der Module.
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; 3 Button auf die Form geklatscht, die Unit
Delphi-Quellcode:
in die
HausSteuerungSingleton
Delphi-Quellcode:
Uses-Liste aufnehmen und die Button-OnClick Ereignisse jeweils mit
implementation
Delphi-Quellcode:
verdrahten
HausSteuerung.MediaPlayer.Power;
// bzw. HausSteuerung.MediaPlayer.PLay; // bzw. HausSteuerung.MediaPlayer.Stop; |
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 ;) ) |
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:
Danke euch allen!!!
initialization
_finalized := false; _mediaplayer := nil; finalization _finalized := true; FreeAndNil(_mediaplayer); end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz