Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FreeandNilProperties? (https://www.delphipraxis.net/125731-freeandnilproperties.html)

Mattze 10. Dez 2008 17:04


FreeandNilProperties?
 
Hi,

die Überschrift sagt ja nicht viel aus, aber:
Gibt es etwas, was beim Freigeben (z. B. eines Panels) auch die "Unterkomponenten" davon nicht nur frei gibt, sondern auch auf Nil setzt?
Oder wie kann man das am günstigsten machen (also ohne alle Komponenten vorher per Hand freigeben und auf nil setzen zu müssen)?

("FreeandNilProperties" gibt's übrigens wirklich. Aber leider...)

Gruß
Mattze

s.h.a.r.k 10. Dez 2008 17:06

Re: FreeandNilProperties?
 
ich denke nicht, dass das so direkt geht, da es durchaus momente gibt, in denen du die "unterkomponenten" auch noch brauchen kannst. wird wohl eigene arbeit von nöten sein, d.h. nachschauen, ob eine komponente auf z.b. einem panel liegt und es dann entsprechend auch freigeben.

mkinzler 10. Dez 2008 17:16

Re: FreeandNilProperties?
 
Zitat:

Gibt es etwas, was beim Freigeben (z. B. eines Panels) auch die "Unterkomponenten" davon nicht nur frei gibt, sondern auch auf Nil setzt?
Wenn das Panel der Owner der Unterkomponenten ist, geschieht das automatisch. Das auf Nil setrzten geht so natürlich nicht

Mattze 10. Dez 2008 19:44

Re: FreeandNilProperties?
 
Hi,

nun, freeandnilproperties macht das für Objekte. Die Hilfe schreibt aber:
"AObject (der Parameter - d. Red.) muss ein CLX-Objekt sein, das mit RTTI (Laufzeittypinformation) compiliert wird."

Theoretisch könnte man auch die Komponentenliste durchlaufen und selber alles (was geht) freigeben und auf nil setzen. Ist bloß ziemlicher Aufwand für die Laufzeit.
Ich frage mich, wie das zeitmäßig am günstigsten ist...

Ich habe z. B. ein Panel auf dem "duzenderweise" verschiedene andere Komponenten erzeugt werden. Und zwar zu verschiedenen Zeitpunkten verschiedene.
Mal ein MPlayer, mal ein Image, mal ein OLE-Container, mal ein Richedit usw.
Diese Dinger müssen "genilt" werden, wenn ich das Panel freigebe.
Man kann zwar für jede mögliche Komponente im Destroy ein freeandnil geben, aber dann macht man das 99 mal sinnlos und nur einmal korrekt...
Und woanders gebe ich nur etwas frei, was an dieser Stelle nicht benutzt wird. Da muss dann auch wieder eine Liste von freeandnil stehen. Alles sehr unelegant! Es wäre schön, wenn ich das "in einem Rutsch" erledigen könnte.

Deswegen meine Frage!

(Aber eigentlich auch Quatsch, weil es intern ja auch nix anderes wäre als das freeandnil für jede mögliche Komponente aufzurufen. Dann muss ich mir die Schreibarbeit halt machen...)

Gruß
Mattze

mkinzler 10. Dez 2008 19:49

Re: FreeandNilProperties?
 
Wenn schon dynamisch, dann komplett. Weise alle Komponenten auf dem Panel das Panel als Owner zu.

SirTwist 10. Dez 2008 22:04

Re: FreeandNilProperties?
 
Hi Matze,

Zitat:

Zitat von Mattze
Gibt es etwas, was beim Freigeben (z. B. eines Panels) auch die "Unterkomponenten" davon nicht nur frei gibt, sondern auch auf Nil setzt?

Was genau willst Du denn damit bezwecken? Bei Komponenten werden meines Wissens alle untergeordneten Komponenten freigegeben, wenn die Vaterkomponente befreit wird. Wenn Du eigene Klassen hast, kannst Du Deine Unterklassen in einer TObjectList sammeln, dann werden auch alle Elemente der TObjectList befreit, wenn Du die Liste löschst bzw. leerst.

Oder habe ich Deine Anfrage missverstanden?

Gruß,
SirTwist

Mattze 11. Dez 2008 08:33

Re: FreeandNilProperties?
 
Hallo,

nun, ich will damit genau das bezwecken, was ich geschrieben habe.
Diese Komponenten auf dem Panel MÜSSEN beim Freimachen auf nil werden! Sonst greife ich später durch Parallelverarbeitung auf diese Komponenten zu. Das ist anders nicht zu lösen!
(Die Panelkomponenten, die nicht nil sein müssen, "nile" ich auch nicht!)
Mit einer Objektlist muss ich das gleiche machen, was ich eigentlich nicht wollte, nun aber dann doch machen werde: Eine längere Liste von freeandnil vor dem freeandnil des Panels.
(Außerdem würde die Objektlist hier wahrscheinlich nicht passen. Das wäre "den Teufel mit dem Belzebub austreiben". Sprich: Das wäre letztendlich viel mehr als nötig.)

Gruß
Mattze

SirThornberry 11. Dez 2008 09:03

Re: FreeandNilProperties?
 
ein FreeAndNil kann nie von der Komponente ausgehen da diese nicht wissen kann wo überall Pointer auf die Instanz liegen.
Beispiel:
Delphi-Quellcode:
var
  a,b,c,d,e,f,g: TYourObject;
[...]
  a := TYourObject.Create();
  b := a;
  c := a;
  d := a;
  e := a;
  f := a;
  g := a;
[...]
destructor TYourObject.Destroy();
begin
  //woher soll die Objectinstanz an der Stelel wissen das es a,b,c,d,e,f und g gibt?
  inherited;
end;

mkinzler 11. Dez 2008 09:07

Re: FreeandNilProperties?
 
Wie schon mal geschrieben, wenn schon dynamisch, dann vollständig dynamisch! Die kennt ja nicht die Referenzvariablen, die Teil einer anderen Klasse sind, welche sie referenzieren.

SirTwist 11. Dez 2008 10:34

Re: FreeandNilProperties?
 
Du hast also an mehreren Stellen Pointer auf Deine Unterkomponenten gespeichert? Nun, das geht wirklich nicht, die alle auf nil zu setzen, dafür musst Du schon in deiner Programmlogik sorgen. Das ist aber insgesamt Topfschlagen im Minenfeld: wie stellst Du sicher, dass Du nicht an mehreren Stellen auf das selbe Objekt ein FreeAndNil() ausführst?

In lokalen Variablen okay, aber global in mehreren Variablen Pointer auf jeweils dieselben Objekte zu speichern, ist ähm sehr gewagt.

Gruß,
SirTwist


Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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