Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Lebensdauer einer Stringlist (https://www.delphipraxis.net/186281-lebensdauer-einer-stringlist.html)

Sir Rufo 20. Aug 2015 13:45

AW: Lebensdauer einer Stringlist
 
Und die Doku zu Delphi-Referenz durchsuchenTComboBox.Items ist da auch eindeutig:
Zitat:

Durch eine Zuweisung an Items können Sie die Elemente einer anderen Stringliste in die Liste des Kombinationsfeldes kopieren.
;)

DeddyH 20. Aug 2015 13:58

AW: Lebensdauer einer Stringlist
 
Gelegentlich verfügt die Doku zurzeit auch über zusätzliche Informationen (kommt ja nicht sooo oft vor :stupid:).

idefix2 20. Aug 2015 19:43

AW: Lebensdauer einer Stringlist
 
Zitat:

Zitat von Jumpy (Beitrag 1312823)
Zitat:

Zitat von idefix2 (Beitrag 1312821)
Es ist doch im Gegenteil so, dass TStrings eine virtuelle Klasse ist und direkt gar nicht instanziiert werden kann (soll).

Meinst du vielleicht abstrakte (statt virtuelle) Klasse? Das sind die, die man nicht direkt erstellen kann, sondern erst die Nachfahren.

Richtig, abstrakt habe ich gemeint.

Zitat:

Zitat von Sir Rufo (Beitrag 1312867)
Und die Doku zu Delphi-Referenz durchsuchenTComboBox.Items ist da auch eindeutig:
...
;)

Ja, dazu muss man erst einmal auf die Idee kommen, dass die VCL da mit dem Setter eine Schweinerei machen könnte - sonst gibt es nämlich keine Veranlassung, extra in der Hilfe nachzulesen. Die Zuweisung von Objekten weist eben normalerweise nur die Referenz auf die Objekte zu, warum das im Fall der Kombobox von Delphi anders ablaufen muss und das Kopieren der Daten über den Setter erzwungen wird, leuchtet mir nicht wirklich ein.

Sir Rufo 20. Aug 2015 19:53

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.

idefix2 20. Aug 2015 20:12

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.

TBx 20. Aug 2015 20:40

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.

idefix2 21. Aug 2015 06:59

AW: Lebensdauer einer Stringlist
 
Zitat:

Zitat von TBx (Beitrag 1312934)
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.

Und warum? Was ist sinnvoll daran, 20 Kopien der gleichen Daten im Speicher zu halten, und ständig parallel zu aktualisieren, wenn Referenzen auf eine Kopie dieser Daten genügen?

Sir Rufo 21. Aug 2015 07:19

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.

idefix2 21. Aug 2015 07:40

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:
procedure TCustomCombo.SetItems(const Value: TStrings);
begin
  if Assigned(FItems) then
    FItems.Assign(Value)
  else
    FItems := Value;
end;
Also: Wenn in Items schon vorher etwas anderes dringestanden ist, dann wird mittels assign kopiert, andernfalls wird nur die Referenz zugewiesen.

Was soll das ??????

Sir Rufo 21. Aug 2015 07:59

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:
TComboBox
und hier werden die Items erzeugt
Delphi-Quellcode:
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;
Wenn du auf die Items zugreifst, dann gibt es schon eine Instanz.

Der Grund für diesen Setter liegt darin, dass in
Delphi-Quellcode:
TCustomCombo
die konkrete
Delphi-Quellcode:
TStrings
Instanz noch gar nicht bestimmt werden kann. Darum hat man den Setter so gebaut, dass die erste Verwendung die Referenz übernimmt.

Denn wenn du selber mal eine Komponente von
Delphi-Quellcode:
TCustomCombo
ableiten möchtest, dann hast du keine Möglichkeit an
Delphi-Quellcode:
FItems
heranzukommen und so bleibt dir der Weg über den Setter.
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.
Seite 2 von 3     12 3      

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