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 1 von 2  1 2      
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

Verwenden von Pointern

  Alt 28. Dez 2012, 15:49
Delphi-Version: 5
Hiho,

Ich habe da so ein winziges Problem. Ich habe beim onCreate von Form1 ein Objekt gebaut. Dieses wird am ende onDestroy auch wieder freigegeben. Nun möchte ich dieses eine Objekt Global in allen Forms verwenden. Dabei ist es wichtig, dass es das selbe Objekt ist und nicht ein neues der gleichen Art.

Ich habe mir gedacht dass ich onCreate halt dieses Objekt erstelle, danach einen Pointer auf dieses setze und den Pointer an alle anderen Forms weitergebe, so dass ich in allen Forms mit dem selben Objekt arbeite.

Jetzt habe ich direkt eine ganze Latte Probleme.

- geht das überhaupt so wie ich mir das so vorstelle?
- ich hab zwar schon einen Pointer-Guide durchgelesen, aber weis irgendwie trotzdem nicht, wie ich das schreiben sollte.
- Kann ich die einzelnen Methoden des Objektes auch über den Pointer ansprechen (Pointername.Methode) oder muss ich mir irgendwie ein Objekt initialisieren und dem dann mein altes Objekt zuweisen, so dass ich mehrere Objekte initialisiert habe, aber im Grunde alle Objekte nur eines sind. (Nicht einfach zu erklären, was ich für einen Gedanken hatte...)

Kann mir vielleicht jemand ein kleines Beispiel entwerfen, das ich dann analysieren kann? Das würde mich sehr freuen.

Gruß Getox
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Verwenden von Pointern

  Alt 28. Dez 2012, 15:57
Vergiss Pointer hierfür ab besten gleich wieder. Die Variable, der du das Objekt bei der Erstellung zuweist ist bereits intern ein Pointer, der von Delphi aber etwas komfortabler als "Referenz" nutzbar gemacht wird.

Delphi-Quellcode:
var
  foo, bar: TMyClass;
begin
  foo := TMyClass.Create;
  bar := foo;
end;
foo und bar sind danach 2 Referenzen auf exakt das selbe Objekt.

Edit: Bei Records schaut die Welt wieder etwas anders (komplizierter) aus, aber wenn es wirklich und nur um Objekte geht, spielen "manuelle" Pointer keine Rolle.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Klaus01

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

AW: Verwenden von Pointern

  Alt 28. Dez 2012, 15:59
Hallo,

estelle Dir eine Unit mit der "globalen Klasse".
Diese Unit kannst Du in alle Forms einbinden.
Nutze das Singleton Pattern.
Delphi-Quellcode:
type
  TDeineKlasse = class(TObject)
    private
      class var fInstance: TDeineKlasse;
      constructor create;
   public
      class function getInstance: TDeineKlasse;
  end;


implementation

class function TDeineKlasse.getInstance: TDeineKlasse;
begin
  if not assigned(fInstande) then
    fInstance := TDeineKlasse.create;

  result := fInstance;
end;
Grüße
Klaus
Klaus

Geändert von Klaus01 (28. Dez 2012 um 16:11 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 10: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
 
#5

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 11: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
 
#6

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 14: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
 
#7

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 15: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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.905 Beiträge
 
Delphi 12 Athens
 
#8

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 21: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
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 22: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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.905 Beiträge
 
Delphi 12 Athens
 
#10

AW: Verwenden von Pointern

  Alt 29. Dez 2012, 22:33
Ab wann gibt es im Delphi eigentlich Klassenvariablen und Klassenkonstruktoren?
Klassenvariablen gibt es seit Delphi 2006, aber mit einem Compilerfehler, der dazu führte, dass ein Zugriff von außerhalb der Unit knallte. Klasseneigenschaften gibt es glaube ich seit Delphi 2007 (?). Und Klassenkonstruktoren und -destruktoren gibt es seit Delphi 2010.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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