AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Lebensdauer einer Stringlist

Ein Thema von idefix2 · begonnen am 19. Aug 2015 · letzter Beitrag vom 21. Aug 2015
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Lebensdauer einer Stringlist

  Alt 21. Aug 2015, 07:19
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#2

AW: Lebensdauer einer Stringlist

  Alt 21. Aug 2015, 07:40
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 ??????
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Lebensdauer einer Stringlist

  Alt 21. Aug 2015, 07:59
Du musst immer das große Ganze betrachten um zu verstehen

So sieht die Ableitungskette aus: TCustomCombo <- TCustomComboBox <- 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 TCustomCombo die konkrete 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 TCustomCombo ableiten möchtest, dann hast du keine Möglichkeit an 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.747 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Lebensdauer einer Stringlist

  Alt 21. Aug 2015, 08:57
Wenn du auf die Items zugreifst, dann gibt es schon eine Instanz.

Der Grund für diesen Setter liegt darin, dass in TCustomCombo die konkrete 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 TCustomCombo ableiten möchtest, dann hast du keine Möglichkeit an FItems heranzukommen und so bleibt dir der Weg über den Setter.
Das wäre aber mal einen Kommentar im Quelltext wert gewesen. Oder vielleicht sogar eine eigene Methode InitializeItems oder so.
Uli Gerhardt
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#5

AW: Lebensdauer einer Stringlist

  Alt 21. Aug 2015, 11:09
Delphi-Quellcode:
constructor TMyCombo.Create( AOwner: TComponent );
begin
  inherited Create( AOwner );
  SetItems( TStringList.Create ); // <- diese Instanz wird jetzt übernommen
end;

end.
Die wird ja auch da nicht übernommen! im inherited Create(AOwner) 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.
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.

Geändert von idefix2 (21. Aug 2015 um 11:32 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 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