Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Löscht TComboBox.Items.Clear auch Objekte? (https://www.delphipraxis.net/135461-loescht-tcombobox-items-clear-auch-objekte.html)

Carsten1234 11. Jun 2009 08:39


Löscht TComboBox.Items.Clear auch Objekte?
 
Hallo zusammen,

in einer Applikation existieren max. 40 feste und 10 frei vom Anwender eingebbare Einheiten. Zu erwähnen ist, dass bislang nur ca. 20 fixe Einheiten existieren und die Liste auch Lücken aufweisen kann. Alle Einheiten sollen jedoch in einer TComboBox dargestellt werden.
Nun besteht allerdings die "Gefahr", dass der Anwender bei den frei eingebbaren Einheiten eine Einheit eingibt, die bereits bei den festen Einheiten vorhanden ist, doch dies soll möglich sein (über Sinn und Unsinn darüber will ich nicht sprechen).
Damit ich jedoch nun in der ComboBox unterscheiden kann, ob es sich bei der selektierten Einheit um eine feste oder freie Einheit handelt, habe ich die TComboBox analog diesem Beispiel um AddObject erweitert ala
Delphi-Quellcode:
const
  FIXEINHEITEN = 40;
  FREIEINHEITEN = 10;

for x:= 1 to FIXEINHEITEN do
begin
  if (Length({Bezeichnung fixe Einheit}) > 0)
    ComboBox.Items.AddObject({Bezeichnung fixe Einheit}, TObject(x));
end;

for x:= 1 to FREIEINHEITEN do
begin
  if (Length({Bezeichnung freie Einheit}) > 0) then
  ComboBox.Items.AddObject({Bezeichnung freie Einheit}, TObject(x+FIXEINHEITEN));
Die in der ComboBox selektierte Einheit ermittle ich über
Delphi-Quellcode:
var Idx: integer;
Idx:= Integer (ComboBox.Items.Objects[ComboBox.ItemIndex]);
und wenn Idx > FIXEINHEITEN ist, weiß ich, dass die selektierte Einheit eine selbstdefinierte Einheit ist.

Zurück zum Betreff:
Da, wie geschrieben, der Anwender auch selbst definierte Einheiten eingeben bzw. verändern kann, schmeiße ich nach einer Veränderung erstmal alle Einträge in der ComboBox mit
Delphi-Quellcode:
ComboBox.Items.Clear;
weg.
Frage: Schmeißt die Clear-Routine auch die Objekte weg oder entsteht da wohlmöglich ein Speicherleck?
Eine TComboBox.Items.DeleteObject od. ähnl. existiert ja nicht...

Dank vorab und Gruß, Carsten

himitsu 11. Jun 2009 08:45

Re: Löscht TComboBox.Items.Clear auch Objekte?
 
standardmäßig nein.


bei der ListView gibt es ein OnItemDelete-Ereignis, wo man das Objekt hätte sehr gut freigeben önnen, das vermiß ich hier leider :?

jfheins 11. Jun 2009 08:46

Re: Löscht TComboBox.Items.Clear auch Objekte?
 
Du benutzt ja keine Objekte => Es entstehen auch keine Speicherlecks.

Auch wenn der name "Objects" etwas anderes vermuten lässt, du mißbrauchst benutzt das Feld ja für einen Integer ;)

Muetze1 11. Jun 2009 08:49

Re: Löscht TComboBox.Items.Clear auch Objekte?
 
Zitat:

Zitat von jfheins
Du benutzt ja keine Objekte => Es entstehen auch keine Speicherlecks.

Tolle Begründung. Bei deiner Aussage kann man gleich die andere Annahme treffen: wären es Objekte, gibt er sie frei. Aber genau das geschieht nicht! Die Liste weiss nicht ob ihr da echte Objekte angehangen werden oder Zeiger oder halt Ordinalwerte wie du es machst. Von daher wird mit den Objekten nichts gemacht.

Carsten1234 11. Jun 2009 09:12

Re: Löscht TComboBox.Items.Clear auch Objekte?
 
Bisher also nur ein klares JEIN. :gruebel:
Besser?
Delphi-Quellcode:
for x:= 0 to ComboBox.Items.Count- 1 do
begin
  if (Assigned(TObject(ComboBox.Items.Objects[x]))) then
    TObject(ComboBox.Items.Objects[x]).Free;
end;
ComboBox.Items.Clear;

DeddyH 11. Jun 2009 09:16

Re: Löscht TComboBox.Items.Clear auch Objekte?
 
Wären es tatsächlich Objekte, müsstest Du Dich selbst um die Freigabe kümmern. Da Du aber anscheinend einfach nur einen Integer nach TObject castest, um ihn einfügen zu können, wird diese Freigabe ja nicht benötigt.

himitsu 11. Jun 2009 09:21

Re: Löscht TComboBox.Items.Clear auch Objekte?
 
ein klares NEIN.


alles was als Objekt oder per Pointer da eingetragen/drangehängt wurde, wird nicht freigegeben,

aber was direkt in dem Wert drinsteht, also z.B. dein Integer oder etwas anderes, welches direkt in den Objekt-Parameter eingetragen/umgecastet wurde, wird natürlich mit freigegeben, da es ja direkt da drinsteckt und somit mit verschrindet, wenn man den "Parameter" löscht


Es wäre übersichtlicher, wenn man es statt als Objekt als Integer definiert hätte (ebenso wie .Tag), dann wäre es offensichtlicher gewesen.
Also stell dir einfach vor es sei in Integer und kein TObject :stupid:

[add]
Delphi-Quellcode:
TObject(ComboBox.Items.Objects[x]).Free;
da du ja kein Objekt drin hast, würde dieses nicht Funktionieren und zu 99,99...% in einer Exception enden.
(der Rest würde rein zufällig auf ein anderes Objekt zeigen und dieses freigeben)


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