AGB  ·  Datenschutz  ·  Impressum  







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

bereits freigegeben?

Ein Thema von moin339 · begonnen am 8. Aug 2003 · letzter Beitrag vom 12. Aug 2003
Antwort Antwort
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#1

bereits freigegeben?

  Alt 8. Aug 2003, 23:33
Moin!

Wie kann man feststellen ob eine klasse bereits über free freigegeben wurde?

Delphi-Quellcode:
var Test: TTest

implementation

procedure bla;
begin
  if bereitsFreigegeben(Test) then showmessage('test wurde freigegeben');
end;
ciao, moin339
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: bereits freigegeben?

  Alt 8. Aug 2003, 23:56
Moin moin,

ob ein Objekt mit Free freigegeben wurde kannst Du nicht überprüfen, da mit Free die Resourcen freigegeben werden (hoffentlich alle ), die Variable aber weiterhin eine Adresse auf ein nun nicht mehr existentes Objekt enthält.
(Von der "brutal" Methode auf einen Bestandteil (Methode oder Eigenschaft) in einem try/except Block zuzugreifen, und im Falle einer Exception zu entscheiden, dass das Obekt nicht mehr existiert. Dies nur der Vollständigkeit halber erwähnt.)

Um ein Objekt so freizugeben, dass eine Überprüfung möglich ist, gibt es (ich glaube seit D4) die Prozedure FreeAndNil. Hiermit wird das Objekt freigegeben, und anschliessend, die Variable auf auf nil gesetzt, so dass dann die Abfrage

if ObjektVariable <> nil then ShowMessage('Objekt existiert'); möglich ist.

Ersetzten lässt sich FreeAndNil durch

Delphi-Quellcode:
ObjektVariable.Free;
ObjektVariable := nil;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#3

Re: bereits freigegeben?

  Alt 9. Aug 2003, 10:09
danke, funktioniert wunderbar
  Mit Zitat antworten Zitat
Pascal

Registriert seit: 10. Aug 2003
22 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: bereits freigegeben?

  Alt 11. Aug 2003, 22:52
Kleine Anmerkung noch (habe ich selber erst vor kurzem erfahren):

Wenn du dies unter Delphi 7 testen willst, nehme statt
if ObjektVariable <> nil then ShowMessage('Objekt exisitiert'); die Abfrage
if not assigned(ObjektVariable) then ShowMessage('Objekt exisitiert'); Dies wird von Delphi empfohlen, die genauen Gründe kenne ich auch nicht.

Gruß Pascal
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: bereits freigegeben?

  Alt 11. Aug 2003, 22:59
Ich perrsönlich bevorzuge die erste Methode, da sie schneller ist (wenn auch nur ein paar Takte ).
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: bereits freigegeben?

  Alt 11. Aug 2003, 23:09
Bei "Assigned" wird aber klarer, was passiert. Ist letztendlich aber geschmackssache.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: bereits freigegeben?

  Alt 11. Aug 2003, 23:25
Zitat von Chewie:
Ich perrsönlich bevorzuge die erste Methode, da sie schneller ist (wenn auch nur ein paar Takte ).
Wie hast du denn das herausbekommen?


Annahme: P steht in EBX

if P <> nil then -> test ebx, ebx

if not Assigned(P) then -> test ebx, ebx


Und wie können zwei gleiche Maschinencodes unterschiedlich schnell sein?(Stromschwankungen jetzt mal ausgeschlossen)
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: bereits freigegeben?

  Alt 12. Aug 2003, 16:27
Ich habs nicht ausprobiert und kenn mich auch nicht so gut aus wie du, was genau passiert, wenn eine Prozedur aufgerufen wird, aber ich meine, ein einfacher Vergleich (auf nil) ist schneller durchgeführt als das Aufrufen einer Prozedur und das Prüfen in dieser.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: bereits freigegeben?

  Alt 12. Aug 2003, 16:56
Nur mit dem Unterschied, das Assigned weder Funktion noch Prozedur ist, sondern Compiler Magic. Du siehst es doch an meinem Quellcode <-> Assembler vergleich, dass der Compiler für beides ein und denselben Maschinencode erzeugt.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: bereits freigegeben?

  Alt 12. Aug 2003, 17:12
OK, falls du es überprüft hast, dann hast du wohl Recht.
Aber wir hatten das mal in einem anderen Thread, und da hat jemand (Assarbad?) gemeint, dass Assigned eine eigene Prozedur ist und nicht einem Vergleich auf nil entspricht. Natürlich ist das auch kein Wahrheitsbezeugnis, aber es klang einleuchtend.
Vielleicht ist das aber auch von der verwendeten Delphi-Version abhängig (<=D4 als Prozedur, D5> Compiler Magic??).
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  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 01:35 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