AGB  ·  Datenschutz  ·  Impressum  







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

Observer:

Ein Thema von GroHae · begonnen am 21. Jul 2010 · letzter Beitrag vom 21. Jul 2010
Antwort Antwort
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#1

AW: Observer:

  Alt 21. Jul 2010, 10:17
Hi,

Danke erst mal!

Zitat:
Also wenn das Interface/Objekt noch nicht zersört werden soll, dann mußt du weiterhin eine Instanz davon irgendwo gespeichert/abgelegt haben.
Stimmt! Un genau deswegen habe ich in meinem Hauptformular die instanz erstellt
Delphi-Quellcode:
 TfrmMain = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    FWetterDaten : TWetterDaten;
    FTemperaturAnzeigen : TTemperaturAnzeigen; // ... eine Instanz davon irgendwo gespeichert/abgelegt ..... Oder nicht ???
    FFeuchtigkeitAnzeigen : TFeuchtigkeitAnzeigen;
  public
    { Public-Deklarationen }
  end;

.....

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  FWetterDaten := TWetterDaten.Create;
  FTemperaturAnzeigen := TTemperaturAnzeigen.Create(FWetterDaten);
  FFeuchtigkeitAnzeigen := TFeuchtigkeitAnzeigen.Create(FWetterDaten);
end;
Anscheinend habe ich da was falsch verstanden. Aber was?
Ich gehe davon aus, durch FTemperaturAnzeigen im Formular ich die Instanz erst "verliere" wenn ich das Formular zerstöre
Grüße

Thomas
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#2

AW: Observer:

  Alt 21. Jul 2010, 10:33
Stimmt! Un genau deswegen habe ich in meinem Hauptformular die instanz erstellt
Delphi-Quellcode:
 TfrmMain = class(TForm)
   { ... }
    FTemperaturAnzeigen : TTemperaturAnzeigen; // ... eine Instanz davon irgendwo gespeichert/abgelegt ..... Oder nicht ???
    FFeuchtigkeitAnzeigen : TFeuchtigkeitAnzeigen;
  public
    { Public-Deklarationen }
  end;

.....
Anscheinend habe ich da was falsch verstanden. Aber was?
Ich gehe davon aus, durch FTemperaturAnzeigen im Formular ich die Instanz erst "verliere" wenn ich das Formular zerstöre
Nicht falsch verstanden, nur falsch deklariert
Deine Variablen sollten auch Interfaces sein, also zum Beispiel IBeobachter...

Delphi-Quellcode:
{ ... }
    FTemperaturAnzeigen : IBeobachter; // ... eine Instanz davon irgendwo gespeichert/abgelegt ..... Oder nicht ???
    FFeuchtigkeitAnzeigen : IBeobachter;
  public
  Mit Zitat antworten Zitat
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Observer:

  Alt 21. Jul 2010, 10:41
**Schuppen von den Augen fallen**

Mist habe ich übersehen. Stimmt. Es heißt ja auch immer in meinem Buch
Zitat:
Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung
1000 Danke!
Grüße

Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#4

AW: Observer:

  Alt 21. Jul 2010, 10:49
So, wie du es machst, steckst du in einem Dilemma: um der Interface-Referenzzählung zu genügen, solltest du nur Interfaces als Instanz-Variablen haben, aber ein ISubject hat leider nicht die Methoden und Eigenschaften eines TWetterDaten, was die Manipulation einer Interface-Instanz verhindert.

Ausweg 1: Du deklarierst zu jeder Klasse ein passendes Interface, das von ISubject abgeleitet ist. => Viel Schreiberei und meher Aufwand bei Änderungen, aber sauber bezüglich Referenzzählung.

Ausweg 2: Du leitest statt von TInterfacedObject von TInterfacedPersistent ab. Damit umgehst due die Referenzzählung und kannst wieder Instanzen der Klassen (statt der Interfaces) verwenden. Du musst aber selber dafür sorgen, daß die Instanzen in der richtigen Reihenfolge freigegeben werden, aber das sollte einem Delphianer ja nicht fremd sein.

Da TInterfaceList von TInterfacedObject abgeleitet ist, musst du auch eine IInterfaceList-Instanz verwalten, sonst kracht es irgendwann. Also FLstBeobachter als IInterfaceList deklarieren!
Uwe Raabe
  Mit Zitat antworten Zitat
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Observer:

  Alt 21. Jul 2010, 11:14
meinst du mit

Zitat:
Ich sagte doch "nicht interfaces mit Objekten mischen"
dass ich nicht
Delphi-Quellcode:
...
  private
    FWetterDaten : TWetterDaten;
    FTemperaturAnzeigen : IBeobachter;
    FFeuchtigkeitAnzeigen : IBeobachter;
  public
...
sagen soll?

und wenn ich das von Uwe Raabe lese, da erscheint es mir dann (fast) ratsamer mit abstrakten Klassen zu arbeiten.
Grüße

Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#6

AW: Observer:

  Alt 21. Jul 2010, 11:27
Delphi-Quellcode:
...
  private
    FWetterDaten : TWetterDaten;
    FTemperaturAnzeigen : IBeobachter;
    FFeuchtigkeitAnzeigen : IBeobachter;
  public
...
FWetterDaten sollte IWetterDaten werden (Ausweg 1) oder von TInterfacePersistent abgeleitet werden.

und wenn ich das von Uwe Raabe lese, da erscheint es mir dann (fast) ratsamer mit abstrakten Klassen zu arbeiten.
Also, so schwer ist das wirklich nicht. Man muss halt wissen, was man tut. Interfaces sind eine feine Sache und machen den Code oft viel übersichtlicher, aber ich verzichte in den meisten Fällen auf die automatische Referenzzählung und kümmere mich selbst um die Freigabe der Objekte.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#7

AW: Observer:

  Alt 21. Jul 2010, 12:01
Interfaces sind eine feine Sache und machen den Code oft viel übersichtlicher, aber ich verzichte in den meisten Fällen auf die automatische Referenzzählung und kümmere mich selbst um die Freigabe der Objekte.
Jupp, damit kann man schöne Sachen machen,
aber drum dauert es mit meinem neuen himXML auch noch etwas, denn multible Kreuzreferenzen und eine automatische Freigabe lassen sich mit Interfaces nicht so einfach handhaben ... also ohne daß sich die Objekte gegenseitig im Speicher halten.


Wie gesagt:
- entweder man muß die Referenzzählung irgendwie manipulieren, wenn man Objektzugriffe mit Interfaces mischen will
- man verwendet nur noch Interfaces und nutzt die Objekte nur noch zum Erstellen der Interfaces
- man könnte sich aus den Interfaces "kurzzeitig" wieder Objekte machen, wenn man auf interne Dinge (welche nicht im Interface zugänglich sind) zugreifen will/muß
- man könnte sich auch mehrere Interfaces erstellen, eines für die Öffentlichkeit und eines, welches für die internen Zugriffe vorgesehn ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Jul 2010 um 12:36 Uhr)
  Mit Zitat antworten Zitat
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#8

AW: Observer:

  Alt 21. Jul 2010, 12:10
OK alles klar. Wieder was dazu gelernt

Ich werde die verschiedenen Varianten durchprobieren. Man will ja was dazu lernen und nicht dumm sterben!

Danke für die Hilfe!
Grüße

Thomas
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#9

AW: Observer:

  Alt 21. Jul 2010, 11:41
So ein Problem hatten wir auch. Wir haben es über TNotifyEvent gelöst.
Dein FLstBeobachter : TInterfaceList; machst du zu einer Liste von TNotifyEvents.

BenachrichtigeBeobachter; Schickt dann nur die Nachricht in den eigentlichen TTemperaturAnzeigen... dort kannst du den Sender dann auf TWetterDaten prüfen, carsten und die relevanten Daten benutzen.

Gruß David
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#10

AW: Observer:

  Alt 21. Jul 2010, 10:48
Ich sagte doch "nicht interfaces mit Objekten mischen"

Objekte = keine Referenzzählung
Interfaces = ja

TTemperaturAnzeigen ist das Objekt und wird demnach nicht mitgezählt.

hier gibt es also nur 2-3 Lösungen:
- entweder du meldest beim Interface (._AddRef) diese Referenz an
- oder besser, du nimmst hier auch statt TTemperaturAnzeigen das IBeobachter.
- oder du umgehst die Referenzzählung (siehe #7 Uwe Raabe, bzw. implementierst dir eine eigene "Referenzzählung", welche auf deine Bedürfnisse abgestimmt ist)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Jul 2010 um 10:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:55 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