AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zur Laufzeit Comboboxen hinzufügen

Ein Thema von KomischerKautz · begonnen am 14. Feb 2020 · letzter Beitrag vom 21. Feb 2020
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 17. Feb 2020, 07:27
Delphi-Quellcode:
  cb := TComboBox.Create(cbPnl);
  cb.Parent := Self;
Sollte genau andersrum sein, Wein und Delphi verträgt sich nicht
Also
Delphi-Quellcode:
  cb := TComboBox.Create(Self);
  cb.Parent := cbPnl;
Self steht in diesem Fall für's aktuelle Formular, wenn man den Schnippsel als methode verfrachtet sollte "Self" mit 'nem Formular-Bezeichner ausgetauscht werden und als Parent halt ein Control oder Formular angeben.

Joar, die cbList in Formular Klasse mit rein, das macht Sinn, mein Fehler! (keine Ironie)

Ich hätte gerne noch 'ne mini Erklärung warum Liste.Create/.Free eher in FormCreate/Destroy rein sollte.
initialization/finalization ist doch eigentlich 'ne super stelle dafür, finde ich.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.458 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 17. Feb 2020, 07:37
Zitat:
cbList in Formular Klasse mit rein, das macht Sinn
Zitat:
warum Liste.Create/.Free eher in FormCreate/Destroy rein sollte
...deswegen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 17. Feb 2020, 07:39
Wenn das Formular und die Liste unterschiedliche Lebenszyklen haben, dann hat man recht schnell tote Referenzen in der Liste. Sobald der Parent/Owner der ComboBoxen freigegeben wird, gibt dieser auch die ComboBoxen frei. Diese stehen aber weiterhin in der Liste. Da macht es doch eher Sinn, die Lebenszyklen der Liste und des Formulars anzugleichen, außerdem braucht man dann auch keine globale Variable mehr.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 17. Feb 2020, 07:45
Super erläuterung und klar Formular Feld an Lebensdauer des Formulars binden macht Sinn.
Danke Euch!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#5

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 17. Feb 2020, 12:08
Eine TComponentList könnte man auch verwenden.
Wird eine Komponente (TComponent) freigegeben, dann wird sie autoamtisch aus der Liste entfernt.

TComponent haben ein Notify-System, um sich gegenseitig über ihre Freigabe zu informieren, z.B. Property auf nil zu setzen oder sich aus den Listen der Components und Controls ihrer Parents zu entfernen.

Und in den NextGen-Compilern (Android, iOS) gibt es Weak-Referenzen, die werden automatisch auf nil gesetzt, wenn man die Komponente freigibt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Feb 2020 um 15:54 Uhr)
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 18. Feb 2020, 10:58
Eine TComponentList könnte man auch verwenden.
Wird eine Komponente (TComponent) freigegeben, dann wird sie autoamtisch aus der Liste entfernt.

TComponent haben ein Notify-System, um sich gegenseitig über ihre Freigabe zu informieren, z.B. Property auf nil zu setzen oder sich aus den Listen der Components und Controls ihrer Parents zu entfernen.
.....
Wie könnte so ein Notify-System aussehen? Ich bin schon paar paar Mal in fremde Sourcen darüber gestolpert, aber so richtig kapiert habe das nicht. Ich wäre sehr interesiert wie man das mit einer Liste mit Notify realisiert
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
496 Beiträge
 
Delphi 12 Athens
 
#7

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 18. Feb 2020, 11:02
Jede Komponente hat FreeNotifications, die sie u.a. an diejenigen Komponenten versendet, die sie als Besitzer festgelegt haben.
Wenn eine Komponente zerstört wird, werden deren Subkomponenten, die in einer (eigentlich zwei) Komponentenlisten gespeichert sind, automatisch freigegeben. Nicht zu verwechseln ist dies mit den eingebetteten Steuerelementen, die in TList<TControl> gespeichert werden; diese haben nichts damit zu tun.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zur Laufzeit Comboboxen hinzufügen

  Alt 18. Feb 2020, 11:34
siehe TComponentList (unit Contnrs)

Eine TList, die ein Dummy-TComponent drinnen hat oder die selbst ein TComponent ist, über dessen TComponent.Notification beim opRemove es das jeweilige Objekt aus der Liste löscht.
TList.Notify bei lnAdded via TComponent.FreeNotification registrieren und beim lnExtracted/lnDeleted via TComponent.RemoveFreeNotification deregistrieren. (wer bei wem ist egal, da alles gegenseitig)

Delphi-Quellcode:
procedure TComponentListDummy.Notification(AComponent: TComponent; Operation: TOperation);
begin
  if Operation = opRemove then
    Parent.Extract(AComponent); // Item aus Liste entfernen, ohne enthaltenes Objekt (nochmal) freizugeben
  inherited;
end;

procedure TComponentList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if Assinged(Ptr) then
    case Action of
      lnAdded:
        TComponent(Ptr).FreeNotification(FDummy);
      lnExtracted, lnDeleted:
        TComponent(Ptr).RemoveFreeNotification(FDummy);
    end;
  inherited;
end;
Nochmal als Beispiel mit einem Property:
Delphi-Quellcode:
type
  TDemo = class(TComponent)
  private
    FLink: TComponent;
    procedure SetLink(Value: TComponent);
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    property Link: TComponent read FLink write SetLink;
  end;

procedure TDemo.SetLink(Value: TComponent);
begin
  if Assigned(FLink) then
    Self.RemoveFreeNotification(FLink); // oder FLink.RemoveFreeNotification(Self);
  FLink := Value;
  if Assigned(FLink) then
    Self.FreeNotification(FLink);
end;

procedure TDemo.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if Operation = opRemove then begin
    if FLink = AComponent then
      FLink := nil;
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 14:13 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