Autor Beitrag
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Sa 18.10.08 22:44 
Hallo.

Ich stehe vor dem Problem, dass ich eine Klasse habe (im Moment noch von TObject abgeleitet). Dieser Klasse übergebe ich beim Create ein paar Dinge. Danach werkelt das Objekt vor sich hin (mit einem Timer). Es werden ein paar Schritte abgearbeitet, die ein bisschen dauern. Danach sollte sich das Objekt selber wieder freigeben. Ich kann nämlich nicht beim Aufruf drauf warten, dass das Objekt zu einem Ende kommt und es dann mit einem Free freigeben.

Wie kann ich bewerkstelligen?

Danke,
Matze

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Sa 18.10.08 22:50 
Dann lass dass Objekt doch und gib es am Schluss im formclose frei.
Da muss es ja wohl fertig sein.

Oder habe ich jetzt was falsch verstanden und nur Unsinn gepostet??
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Sa 18.10.08 22:55 
TThread hat doch eine Eigenschaft, FreeOnTerminate. Die könntest du dir vielleicht abgucken?

_________________
PROGRAMMER: A device for converting coffee into software.
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 18.10.08 23:02 
Also direkt freigeben kann sich ein Objekt meines Wissens nach nicht.

Meine Idee dazu, kp ob sie praktikabel ist:

Dein Objekt vollbringt seine Aufgaben und erstellt am Ende ein neues Objekt, dieses 2. Objekt gibt das erste frei und wird seinerseits vom Hauptprogramm freigegeben (musst ja nur ab und zu nachschauen ob das 2te Objekt existiert).
Fabian E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: Sa 18.10.08 23:04 
Ist es evntuell möglich Jann1ks Methode mit einer Prozedur durchzufühern?Wenn deine Instanz frtig ist, ruft sie eine Methode auf der sie sich selbst als Parameter über gibt. Diese Methode gibt dann den Parameter (deine Instanz) frei.
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: So 19.10.08 09:14 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Dann lass dass Objekt doch und gib es am Schluss im formclose frei.
Da muss es ja wohl fertig sein.

Wäre eine Möglichkeit. Leider werden Objekte dieser Art recht häufig gebraucht. Es handelt sich bei den Objekten um kleine Animationen. Und ich möchte da ungern warten, bis das Programm fertig ist, zumal das Programm über einen recht langen Zeitraum laufen kann.


user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
TThread hat doch eine Eigenschaft, FreeOnTerminate. Die könntest du dir vielleicht abgucken?

Habe ich mir grade angeschaut. Aber nur kurz. Es scheint, als ob das nicht so einfach ist.

user profile iconFabian E. hat folgendes geschrieben Zum zitierten Posting springen:
Ist es evntuell möglich Jann1ks Methode mit einer Prozedur durchzufühern?Wenn deine Instanz frtig ist, ruft sie eine Methode auf der sie sich selbst als Parameter über gibt. Diese Methode gibt dann den Parameter (deine Instanz) frei.

Sowas geht leider nicht, da die nach dem Ende der aufgerufenen Procedure wieder in die aufrufende Funktion zurückgesprungen wird, diese aber nicht mehr existiert => Zugriffsverletzung

_________________
In the beginning was the word.
And the word was content-type: text/plain.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 19.10.08 09:26 
Es sollte kein Problem sein, sofern nach der Selbstzerstörung nicht mehr auf Objektresourcen zugegriffen wird.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Procedure TSuicidalObject.Execute;
Begin
  Live;
  Self.Free;
End;

Denn der Code existiert ja noch.

_________________
Na denn, dann. Bis dann, denn.
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: So 19.10.08 09:45 
Ja cool. Es funktioniert. Ich hätte immer gedacht, dass so etwas nicht geht. Aber es geht doch :-D
Vielen Dank!

_________________
In the beginning was the word.
And the word was content-type: text/plain.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 19.10.08 12:30 
Hier siehst du einen Auszug aus der Delphi-Hilfe zu dem Thema:
www.delphi-forum.de/....php?p=529282#529282
Bei normalen Objekten geht es wohl, bei visuellen Komponenten zumindest nicht.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 19.10.08 13:15 
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
Ja cool. Es funktioniert. Ich hätte immer gedacht, dass so etwas nicht geht. Aber es geht doch :-D
Vielen Dank!

Man muss dabei immer nur aufpassen, dass es auf das freizugende Objekt keine Referenzen gibt.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hier siehst du einen Auszug aus der Delphi-Hilfe zu dem Thema:
www.delphi-forum.de/....php?p=529282#529282
Bei normalen Objekten geht es wohl, bei visuellen Komponenten zumindest nicht.

Und genau das ist der Punkt mit visuellen Komponenten ... Wobei selbst das geht. Dort ist es aber nicht Free, sondern Release.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 19.10.08 13:23 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Man muss dabei immer nur aufpassen, dass es auf das freizugende Objekt keine Referenzen gibt.
Daher würde ich noch ein Singleton-Pattern drumherum bauen.

_________________
Na denn, dann. Bis dann, denn.
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 20.10.08 10:12 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Man muss dabei immer nur aufpassen, dass es auf das freizugende Objekt keine Referenzen gibt.
Das kann bei der Art, wie ich das einsetzte nicht passieren. Aber generell ist mir das schon klar :-D

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Daher würde ich noch ein Singleton-Pattern drumherum bauen.
Hört sich interessant an. Hat da jemand mal Infos, wie das geht bzw. was das ist? das ist mir nämlich neu. :oops:

_________________
In the beginning was the word.
And the word was content-type: text/plain.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 20.10.08 10:27 
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Daher würde ich noch ein Singleton-Pattern drumherum bauen.
Hört sich interessant an. Hat da jemand mal Infos, wie das geht bzw. was das ist? das ist mir nämlich neu. :oops:
de.wikipedia.org/wik...ton_(Entwurfsmuster) ;-)

Bei diesen Entwurfsmustern wirst du meistens bei Wikipedia fündig, ansonsten findet man auch einiges an Material für Vorlesungen. ;-)
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 20.10.08 10:33 
Bei einem Singleton verfrachtest Du den Konstrutor in die Private/Protected Sektion und veröffentlichst stattdessen eine Class Function 'Create', die das Objekt maximal einmal erzeugt und eine globale Instanz (das 'Singleton') liefert :
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
Type
  TSingleton = Class
  protected
    Constructor _Create;
  public
    Class Function Create : TSingleton;
    Destructor Destroy; Override;
  End;

implementation 

Var
  GlobalSingletonInstance : TSingleton;

Constructor TSingleton._Create;
Begin
  // Normaler Konstruktorcode
End;

Class Function TSingleton.Create : TSingleton;
Begin
  If not Assigned (GlobalSingletonInstance) Then
    GlobalSingletonInstance := TSingleton._Create;
  Result := GlobalSingletonInstance
End;

Destructor TSingleton.Destroy; 
Begin
  Inherited;
  GlobalSingletonInstance := Nil;
...
Initialization
  GlobalSingletonInstance := Nil
Finalization
  GlobalSingletonInstance.Free;
End.

Das ist natürlich noch nicht die perfekte Version, da 'unwissende' Anwender das Objekt freigeben würden, was eventuell unerwünscht wäre. Daher könntest Du noch den Destruktor verbergen und durch eine Prozedur ersetzen, die über einen Referenzzähler erst den letzten Aufruf an den Destruktor weiterleitet. Allerdings müsste die 'Free'-Prozedur überschrieben werden.

Hier also eine mögliche Delphi-Implementierung:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
Uses Windows;
Type
  TSingleton = Class
  private
    _RefCount: Integer;

  protected
    Constructor _Create;
    Destructor _Destroy;
  public
    Class Function Create: TSingleton;
    Procedure Destroy;
    Procedure Free;
  End;

Implementation
Var
  GlobalSingletonInstance: TSingleton;

Procedure TSingleton.Destroy;
Begin
  If InterlockedDecrement(_RefCount) = 0 Then
    _Destroy;
End;

Constructor TSingleton._Create;
Begin
  _RefCount := 0;
  // Normaler Konstruktorcode
End;

Class Function TSingleton.Create: TSingleton;
Begin
  If Not Assigned(GlobalSingletonInstance) Then
    GlobalSingletonInstance := TSingleton._Create;
  InterlockedIncrement(GlobalSingletonInstance._RefCount);
  Result := GlobalSingletonInstance
End;

Destructor TSingleton._Destroy;
Begin
  Inherited;
  GlobalSingletonInstance := Nil;
End;

Procedure TSingleton.Free;
Begin
  If Self <> Nil Then
    Destroy;
End;

Initialization
  GlobalSingletonInstance := Nil
  Finalization
  GlobalSingletonInstance.Free;
End.

Anwender dieser Klasse können das Objekt beliebig erzeugen und freigeben, Es wird jedoch nur ein Objekt instantiiert und auch nur freigegeben, wenn keine weiteren Referenzen existieren.

_________________
Na denn, dann. Bis dann, denn.
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 20.10.08 10:49 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
de.wikipedia.org/wik...ton_(Entwurfsmuster)
In dem Artikel müsste man direkt noch die Delphi-Implementierung mit einfügen.

@user profile iconalzaimar: Danke für dieses wirklich gute Beispiel. Ich bin jetzt im Bilde :-D Eine kleine Frage am Rande noch: Class Function habe ich in Delphi noch nie gesehen. Aber ich denke mal, dass es das Pendant zu static final in Java ist, oder? Dann ist mir alles restlos klar :-D

_________________
In the beginning was the word.
And the word was content-type: text/plain.


Zuletzt bearbeitet von matze am Mo 20.10.08 12:01, insgesamt 2-mal bearbeitet
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 20.10.08 11:31 
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
@user profile iconalzaimar: Danke für diese wirklich gute Beispiel. Ich bin jetzt im Bilde :-D Eine kleine Frage am Rande noch: Class Function habe ich in Delphi noch nie gesehen. Aber ich denke mal, dass es das Pendant zu static final in Java ist, oder? Dann ist mir alles restlos klar :-D

static final habe ich in Java noch nie gesehen (Ich habe Java noch nie gesehen). Aber ich denke mal, dass es das Pendant zu Class Function in Delphi ist, oder? :D

Ich hoffe, aber 'static' ist zumindest das C# equivalent. Was das 'final' in Java bedeutet, weiss ich nicht.

_________________
Na denn, dann. Bis dann, denn.
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 20.10.08 12:00 
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Aber ich denke mal, dass es das Pendant zu Class Function in Delphi ist, oder? :D
Scherzkeks :-P
Ich hab das mal nachgeschaut. Es ist so.
Damit wir auf dem gleichen Stand sind: Diese Funktion wird dann nicht im Objekt aufgerufen, sondern in der Klasse. Also gibt es quasi immer nur "eine Stelle" an der der Methodenaufruf "rauskommt". Nämlich in der Klasse und nicht in den einzelnen Objekten. Richtig?
Kann man denn in Delphi auch Datenfelder als class definieren?

_________________
In the beginning was the word.
And the word was content-type: text/plain.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 20.10.08 12:18 
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
Kann man denn in Delphi auch Datenfelder als class definieren?
Nein. Äh.. Doch. :shock: (Nein: D6, Doch: BDS 2006)

_________________
Na denn, dann. Bis dann, denn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 20.10.08 12:19 
Vorher kann man es nur simulieren: ;-)
delphi.about.com/lib...weekly/aa031505a.htm
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 20.10.08 13:15 
Man kann aber auch einfach den Konstuktor public lassen und die Methode NewInstance überschreiben. Hatte dazu auch mal irgendwo ein Beispiel zu gefunden ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.