![]() |
Lebensdauer einer Stringlist
Beim Programmstart erzeuge ich im Formcreate des Hauptformulars eine lokale Stringlist, die ich einer Reihe von Dropdown-Boxen als Itemliste zuordne.
Die lokale Variable vom Typ TStringlist verschwindet natürlich beim Beenden von Formcreate. Auf diese Art produziere ich allerdings vermutlich ein Speicherleck, das sich natürlich erst beim Beenden des Programms manifestiert - bis dahin wird die Stringlist von den Dropdown-Boxen ja gebraucht - und daher nichts wirklich Böses anrichten kann. Würdet ihr die Variable extra in den private-Bereich der Form übersiedeln, um beim Programm Beenden die Stringlist wieder freizugeben? Wäre das für irgend etwas gut? |
AW: Lebensdauer einer Stringlist
Keine deiner ComboBoxen braucht die nachher noch.
Du kannst die StringList beruhigt direkt in der Methode wieder freigeben. |
AW: Lebensdauer einer Stringlist
Speicherlecks findet man zuverlässig mit Bordmitteln und/oder FastMM, zu dessen Verwendung ich dringend rate.
|
AW: Lebensdauer einer Stringlist
Zitat:
|
AW: Lebensdauer einer Stringlist
Ah, danke. Das war mir nicht klar.
Ich war der Meinung, die verschiedenen Comboboxen verweisen dann nur auf die eine Stringlist. Dann ist es einfach. Verstehe ich allerdings nicht ganz, weil die Zuweisung eines TObject doch normalerweise keine Kopie anlegt, dazu ist doch "assign" notwendig (das ich nicht verwendet habe, weil ich mir gedacht habe, einmal reicht, der Inhalt wird im ganzen Programmlauf nicht mehr geändert). Warum ist das in dem Fall anders? |
AW: Lebensdauer einer Stringlist
Das siehst du, wenn du dir den Setter von
Delphi-Quellcode:
anschaust.
TComboBox.Items
Was finden wir da? Ein
Delphi-Quellcode:
;)
Assign
Und die Items sind sowieso keine
Delphi-Quellcode:
, somit würde eine reine Zuweisung nicht funktionieren.
TStringList
|
AW: Lebensdauer einer Stringlist
Zitat:
Der Nachteil von OOP ist wohl, dass man sich auf nichts wirklich verlassen kann. Zitat:
|
AW: Lebensdauer einer Stringlist
Zitat:
|
AW: Lebensdauer einer Stringlist
Hallo,
es gibt in Delphi abstrakte Methoden (eine Methode die deklariert aber nicht implementiert ist). Daneben kann ich eine Methode als virtuell deklarieren (bzw. als dynamic, meint grundsätzlich das gleiche). Damit erreicht man dann polymorphes Verhalten, man deklariert in der Oberklasse eine virtuelle Methode (kann ggf. auch abstrakt sein), und in den verschiedenen Unterklassen überschreibt man dann die virtuelle Methode. Nun wird erst zur Laufzeit entschieden, wessen Methode tatsächlich ausgeführt wird (spätes Binden). Eine Klasse die mindestens eine abstrakte Methode enthält, bezeichnet man dann gemeinhin als abstrakte Klasse. In Delphi kann man (anders als beispielsweise in Java), auch Instanzen von abstrakten Klassen erzeugen. Ruft man nun aber zur Laufzeit eine abstrakte Methode auf, erhält man eine entsprechende Fehlermeldung. Ich wollte nur mal ein wenig klug sch.. Damit die Begrifflichkeiten, nicht ganz so durcheinander gewürfelt werden.:stupid: mfg frank |
AW: Lebensdauer einer Stringlist
Zitat:
Delphi-Quellcode:
var
MyStrings: TStringlist; begin MyStrings := TStringlist.Create; try MyStrings.Add('Eins'); MyStrings.Add('Zwei'); MyStrings.Add('Drei'); SomeComboBox.Items.Assign(MyStrings); finally MyStrings.Free; end; end; |
AW: Lebensdauer einer Stringlist
Und die Doku zu
![]() Zitat:
|
AW: Lebensdauer einer Stringlist
Gelegentlich verfügt die Doku zurzeit auch über zusätzliche Informationen (kommt ja nicht sooo oft vor :stupid:).
|
AW: Lebensdauer einer Stringlist
Zitat:
Zitat:
|
AW: Lebensdauer einer Stringlist
Soweit wie ich das gesehen habe, werden in der VCL nur Referenzen zu Komponenten übergeben (die können überwacht werden). Alle andere Instanzen werden kopiert (internes Assign).
Es gibt Ausnahmen, die aber auch ansonsten aus dem normalen VCL Rahmen fallen. |
AW: Lebensdauer einer Stringlist
Danke für den Hinweis, es ist dann sicher gut, das im Hinterkopf zu behalten.
Nachdem sich die Stringlist in meinem Programm nicht ändert und die Strings selbst auch nur Referenzen sind, ist es mir egal, ob hier Kopien erstellt werden. Lästig wird es, wenn sich die Stringlist irgendwann doch ändern kann, und bei jeder Änderung immer alle 20 Kopien aktualisiert werden müssen. Dann würde ich mir wohl eine Kombobox ableiten, die das anders macht. |
AW: Lebensdauer einer Stringlist
Also erstens mal würde ich da gewiss nicht die Funktionalität der Combobox ändern, sondern höchstens eine Methode schreiben, die eben alle Comboboxen mit neuen Items versieht.
Weiters frage ich mich, wozu man zwanzig identische Comboboxen benötigt. Klingt nicht sonderlich übersichtlich. |
AW: Lebensdauer einer Stringlist
Zitat:
|
AW: Lebensdauer einer Stringlist
Wenn du das Pferd etwas anders aufsattelst, dann wird die Umsetzung einfacher, weil du die ComboBox nicht ändern musst.
Erstelle dir eine Komponente, die nur eine Stringlist verwaltet und wo du andere Komponenten (z.B. ComboBoxen) registrieren kannst. Jede Änderung an der Strings-Komponente veranlasst diese alle registrierten Komponenten zu aktualisieren. |
AW: Lebensdauer einer Stringlist
Jetzt habe ich in den VCL-Sourcen den Setter gesucht - Entweder ich verstehe es nicht oder das ist wirklich totaler Schwachsinn:
Delphi-Quellcode:
Also: Wenn in Items schon vorher etwas anderes dringestanden ist, dann wird mittels assign kopiert, andernfalls wird nur die Referenz zugewiesen.
procedure TCustomCombo.SetItems(const Value: TStrings);
begin if Assigned(FItems) then FItems.Assign(Value) else FItems := Value; end; Was soll das ?????? |
AW: Lebensdauer einer Stringlist
Du musst immer das große Ganze betrachten um zu verstehen
So sieht die Ableitungskette aus:
Delphi-Quellcode:
<-
TCustomCombo
Delphi-Quellcode:
<-
TCustomComboBox
Delphi-Quellcode:
und hier werden die Items erzeugt
TComboBox
Delphi-Quellcode:
Wenn du auf die Items zugreifst, dann gibt es schon eine Instanz.
constructor TCustomComboBox.Create(AOwner: TComponent);
begin inherited Create(AOwner); // Statt FItems := GetItemsClass.Create; // <- da ist // wäre auch das hier möglich // SetItems( GetItemsClass.Create ); TCustomComboBoxStrings(FItems).ComboBox := Self; FStyle := csDropDown; FLastTime := 0; FAutoComplete := True; FAutoCloseUp := False; FAutoCompleteDelay := 500; FTextHint := ''; end; Der Grund für diesen Setter liegt darin, dass in
Delphi-Quellcode:
die konkrete
TCustomCombo
Delphi-Quellcode:
Instanz noch gar nicht bestimmt werden kann. Darum hat man den Setter so gebaut, dass die erste Verwendung die Referenz übernimmt.
TStrings
Denn wenn du selber mal eine Komponente von
Delphi-Quellcode:
ableiten möchtest, dann hast du keine Möglichkeit an
TCustomCombo
Delphi-Quellcode:
heranzukommen und so bleibt dir der Weg über den Setter.
FItems
Delphi-Quellcode:
unit MyCompo;
interface uses Vcl.StdCtrls; type TMyCombo = class( TCustomCombo ) public constructor Create( AOwner: TComponent ); override; end; implementation constructor TMyCombo.Create( AOwner: TComponent ); begin inherited Create( AOwner ); SetItems( TStringList.Create ); // <- diese Instanz wird jetzt übernommen end; end. |
AW: Lebensdauer einer Stringlist
Zitat:
|
AW: Lebensdauer einer Stringlist
Zitat:
Delphi-Quellcode:
wird die Instanz doch schon erzeugt, wenn du die Zuweisung machst, dann gibt es schon eine Instanz, und der Code würde ein Speicherleck produzieren, weil die neu erzeugte TSringlist in der Luft hängt.
inherited Create(AOwner)
Fazit - Das Ganze ist extrem unsauber und undurchsichtig gemacht, wobei mir der Nutzen völlig unklar ist. Man müste das inherited create weglassen und alles selber machen. Oder zumindest die Instanz erzeugen, bevor man inherited create aufruft (wobei da vermutlich in der Folge auch irgendwas schiefgehen würde, habe ich das dumpfe Gefühl). edit Ich sehe gerade, du leitest diene Combobox von TCustomcombo und nicht von von TCustomcombobox ab - dann hast du Recht, das weist die Instanz zu. Durchsichtig und verständlich ist die ganze Konstruktion aber nicht, und worin der Nutzen bestehen soll, sehe ich wirklich nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 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