AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Objektfreigabe

Ein Thema von Suboptimierer · begonnen am 30. Mär 2011 · letzter Beitrag vom 2. Apr 2011
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.361 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Problem mit Objektfreigabe

  Alt 30. Mär 2011, 12:02
Hi,

wenn ich es richtig verstehe, soll es in der Anwendung nur eine Instanz deines Objektes geben.
Und wenn es an mehreren Stellen gebraucht wird, spricht eigentlich nichts gegen globale Funktionen.

Ich wüde es dann z.B. so machen:

Code:
interface

type
  TMuster = class(TObject)
  public
    destructor Destroy; override;
  end;

function Muster: TMuster;

implementation

Uses
  SysUtils;

var
  FMuster: TMuster = nil;

function Muster: TMuster;
begin
  if not Assigned(FMuster) then
    FMuster := TMuster.Create;
  Result := FMuster;
end;

destructor TMuster.Destroy;
begin
  if FMuster = Self then
    FMuster := nil;
  inherited Destroy;
end;

initialization

finalization

  if Assigned(FMuster) then
    FMuster.Free;

end.
Im Programm benutze ich nur die Funktion Muster.
Die Funktion Muster als Klassenmethode würde genauso funktionieren.
Aber ich spare mir lieber den zusätzlichen Schreibaufwand.

Frank
Frank Reim
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: Problem mit Objektfreigabe

  Alt 30. Mär 2011, 13:02
Also es handelt sich hier um das Singleton Design Pattern.
Delphi-Quellcode:
implementation
var
  _Muster:TMuster; // nicht sichtbar ausserhalb der Unit

class function TMuster.SingleInstance: TMuster;
begin
   if not Assigned(_Muster) then
      _Muster := TMuster.Create;
   Result := _Muster;
end;

initialization

finalization
   FreeAndNil(_Muster);
Durch die Verwendung der Klassenfunktion SingleInstance wird klar, dass es sich hier um ein Singleton handelt.
Später wird die Klasse so verwendet:
Delphi-Quellcode:
procedure Beispiel;
var
  m : TMuster;
begin
  m := TMuster.SingleInstance;
  m.irgendwas := ...;

  // wichtig: NICHT m.Free aufrufen !
end;
Alternativ geht das auch mit With:
Delphi-Quellcode:
with TMuster.SingleInstance do
begin
  irgendwas := ...;
Die Lösung mit einer globalen Funktion wie im Vorgängerbeitrag ist auch korrekt,
aber ich denke, dass meine Lösung es noch besser auf den Punkt bringt.
Andreas
  Mit Zitat antworten Zitat
Suboptimierer

Registriert seit: 30. Mär 2011
4 Beiträge
 
#3

AW: Problem mit Objektfreigabe

  Alt 30. Mär 2011, 13:27
Das sieht auch nicht schlecht aus.

Zu
Delphi-Quellcode:
var
  _Muster:TMuster; // nicht sichtbar ausserhalb der Unit
noch eine Frage: Kann man _Muster auch als Klassenvariable von TMuster implementieren oder beißt sich dann die Katze in den Schwanz? Ich meine, es ist ja schon toll, dass _Muster nur innerhalb der Unit sichtbar ist, aber noch schöner wäre es, wenn nur die Klasse darauf zugriff hätte. Kann man das noch irgendwie verbinden?
Ich bin halt einer von denen, die das Wort "global" am liebsten aus ihrem Wortschatz streichen würden (schlechte Erfahrung mit dem Quelltext bei meiner früheren Arbeitsstelle gemacht). Notfalls könnte / müsste ich mich mit einer unitweit-gültigen Variablen zufrieden geben.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 13:39 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