![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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 by Thomas Breitkreuz