AGB  ·  Datenschutz  ·  Impressum  







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

Verwenden von Pointern

Ein Thema von Getox · begonnen am 28. Dez 2012 · letzter Beitrag vom 2. Jan 2013
Antwort Antwort
Seite 2 von 3     12 3      
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 10:23
..ein Singleton hat den Charme, dass davon nur eine Instanz erstellen kann.
Von einer globalen Klasse können jede Menge Instanzen erstellt werden.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#12

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 11:38
Nutze das Singleton Pattern.
[DELPHI]
type
TDeineKlasse = class(TObject)
...
Bei meinem älteren Delphi (BDS 2006) hindert mich niemand daran, beliebig viele Instanzen der TDeineKlasse mit dem 'Create'-Konstruktor zu erstellen (obwohl der Konstruktor ja als privat deklariert ist).

Ich würde für ein Singleton eher so vorgehen:
Delphi-Quellcode:
type
   TSingleton = Class
   private
       class var fInstance: TSingleton;
       class var fRefCnt : Integer;
       class function NewInstance: TObject; Override;
       procedure FreeInstance; override;
    End;
implementation

{ TSingleton }

procedure TSingleton.FreeInstance;
begin
  if fRefCnt=1 then begin
    inherited FreeInstance;
    fInstance:=Nil;
  end;
  dec (fRefCnt);
end;

class function TSingleton.NewInstance: TObject;
begin
  if fInstance=Nil then
    fInstance := TSingleton(inherited NewInstance);
  Result := fInstance;
  inc(fRefCnt);
end;
end.
Dann muss ich gar nicht wissen, das das ein Singleton ist, sondern kann mir immer, wenn ich es brauche, eine Instanz erstellen. Die Objektlogik mappt das ja auf die eine Instanz. Zudem habe ich so keine Möglichkeit, mehrere Instanzen zu erstellen.

Ich persönlich halte das für sauberer, als umständlich über 'GetInstance' auf die globalen Daten zuzugreifen.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 12:41
Alternative: Wenn die Forms nur modal angezeigt werden, könnte auch jede Form ihre eigene Instanz haben. Hierzu die Klasse von TPersitent ableiteten und in Settern die jeweils aktuellen Werte mit Assign kopieren.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#14

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 15:45
Alternative: Wenn die Forms nur modal angezeigt werden, könnte auch jede Form ihre eigene Instanz haben. Hierzu die Klasse von TPersitent ableiteten und in Settern die jeweils aktuellen Werte mit Assign kopieren.
Das ist aber von hinten durch die Brust ins Auge.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 16:37
Das ist aber von hinten durch die Brust ins Auge.
Würde ich einem Singleton ggf. dennoch vorziehen. Hast du mal Code mit Singletons gewartet? I can tell you.. Notfalls höchstens meine Variante #8.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#16

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 20:41
Wo ist der unterschied zwischen einem 'zwangsweise' einmalig erzeugtem Objekt und einem, das per Konvention nur einmal erstellt wird (Form1, Application etc.)?

Beispiel: Ein Datenmodul wird nur einmal instantiiert und verwendet, obwohl es problemlos mehrere Instanzen geben könnte. Eine Singleton-Klasse dagegen sorgt dafür, das man nicht mehrere Instanzen erstellen *kann*.

Unterm Strich kommt jedoch das Gleiche heraus und 'zu warten' gibt es da nicht viel.

PS: Ich habe deine Variante (#8) vor einiger Zeit mal umgesetzt: Für mich war das sehr umständlich und auch unnötig.

Da ist mir meine Variante (die das Singleton-Verhalten komplett kapselt) allemal lieber. Dies ist auch gängige Praxis in anderen OOP-Sprachen. Ich kenne das z.B. von log4net (ein Logger für C#): Dort, wo man einen Logger benötigt, holt (=instantiiert) man sich mal eben einen. Ob das ein Singleton ist oder nicht, weiß ich nicht und es interessiert mich auch nicht.

Erkläre mir doch mal, was Du unter 'ein Singleton-Objekt warten' verstehst.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 21:46
Ich würde auch nicht zwanghaft an einem bestimmten (übertriebenen) Prinzip festhalten.

Die einfachste funktionierende Lösung ist die beste.
Wenn ich ein Framework baue, das in vielen Projekten verwendet werden soll, ist ggf. eine etwas allgemeinere Lösung mit mehr Implementierungsaufwand notwendig.

Wenn es (wie ich Getox verstanden habe) nur um die Instanziierung eines BL-Objektes geht, kann das im Initialisierungsabschnitt der Unit oder im Mainform erledigt werden, ohne dass man dadurch irgendwelche Probleme erhält.
Der Entwickler weiß ja selbst, ob und wann er eine Instanz erzeugt.

Manchmal tun mir die Neueunsteiger wirklich leid wenn sie eine einfache Lösung suchen und dann hier mit Grundsatzdebatten erschlagen werden...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 22:46
estelle Dir eine Unit mit der "globalen Klasse".
Diese Unit kannst Du in alle Forms einbinden.
Da fehlt aber noch die Freigabe, am einfachsten via class destructor (der wird nach ggf. dem finalization Abschnitt der Unit aufgerufen). Und der Konstruktor wird Create geschrieben, nicht create. Zudem sieht für mich eine entsprechende Property schöner aus:
Delphi-Quellcode:
type
  TDeineKlasse = class(TObject)
  private
    class var
      FInstance: TDeineKlasse;
    constructor Create;
    class function GetInstance: TDeineKlasse; static;
  public
    class destructor Destroy;
    class property Instance: TDeineKlasse read GetInstance;
  end;

implementation

class function TDeineKlasse.GetInstance: TDeineKlasse;
begin
  if not Assigned(FInstande) then
    FInstance := TDeineKlasse.Create;

  Result := FInstance;
end;

class destructor TDeineKlasse.Destroy;
begin
  if Assigned(FInstance) then
    FInstance.Free;
end;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 23:01
Ab wann gibt es im Delphi eigentlich Klassenvariablen und Klassenkonstruktoren?

Die Funktionalität ist die gleiche wie eine Realisierung im Initialization- und Finalization-Abschnitt einer Unit.
Ältere Delphi-Versionen können das nicht (also evtl. vom TE nicht verwendbar).

Vielleicht ist es auch für das Verständnis eines Delphi-Neulings nicht immer unbedingt zweckmäßig.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#20

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 23:05
Manchmal tun mir die Neueunsteiger wirklich leid wenn sie eine einfache Lösung suchen und dann hier mit Grundsatzdebatten erschlagen werden...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 03:06 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