AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Überprüfen ob ein Objekt existiert aber wie?

Überprüfen ob ein Objekt existiert aber wie?

Ein Thema von Schuster · begonnen am 3. Jan 2005 · letzter Beitrag vom 27. Dez 2020
Antwort Antwort
Seite 3 von 5     123 45   
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#21

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

  Alt 9. Jun 2013, 01:29
Hallo Luckie,

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..
MFG
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#22

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

  Alt 9. Jun 2013, 01:38
Eher nicht ...

Eine globale Variable ist schon mal pauschal pfui.
Eine globale Variable innerhalb des destructors (so) auf nil zu setzen ist der totale SuperGAU und daher immer falsch (selbst wenn es compiliert und anscheinend läuft).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#23

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

  Alt 9. Jun 2013, 01:50
Guten Morgen
Wie wäre es dann besser?
MFG
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#24

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

  Alt 9. Jun 2013, 10:29
Delphi-Quellcode:
destructor TMPlayer.destroy;
begin
  // Abschalten + div Einstellungen zurücksetzen
  inherited destroy;
end;
Und dort, wo Du die Objektinstanz freigibst, dann
FreeAndNil(mPlayer);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#25

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

  Alt 9. Jun 2013, 17:36
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!!
MFG
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#26

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

  Alt 9. Jun 2013, 17:43
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#27

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

  Alt 9. Jun 2013, 19:28
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.

Geändert von Furtbichler ( 9. Jun 2013 um 19:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#28

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

  Alt 10. Jun 2013, 09:28
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 HausSteuerungSingleton in die 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#29

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

  Alt 11. Jun 2013, 22:49
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 )
MFG
Steffen
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#30

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

  Alt 11. Jun 2013, 23:21
@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!!!
MFG
Steffen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr.
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