![]() |
AW: Zur Laufzeit Comboboxen hinzufügen
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. |
AW: Zur Laufzeit Comboboxen hinzufügen
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:
Nochmal als Beispiel mit einem Property:
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;
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; |
AW: Zur Laufzeit Comboboxen hinzufügen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Vielleicht auch für den TE oder andere interessant, aufbauend auf den ![]()
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Contnrs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } ComponentList: TComponentList; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var cb: TComboBox; begin cb := TComboBox.Create(self); cb.Parent := self; cb.Top := (ComponentList.Count * (cb.Height + 3)); // weitere eigenschaften setzen cb.Items.Add(DateTimeToStr(now)); // mit irgendein Text blabla Text füllen cb.ItemIndex := 0; ComponentList.Add(cb); Caption := 'ComponentList: ' + IntToStr(ComponentList.Count); end; procedure TForm1.Button2Click(Sender: TObject); var cb: TComboBox; begin if ComponentList.Count > 0 then begin cb := TComboBox(ComponentList[ComponentList.Count-1]); cb.Free; Caption := 'ComponentList: ' + IntToStr(ComponentList.Count); end; end; procedure TForm1.FormCreate(Sender: TObject); begin ComponentList := TComponentList.Create; Caption := 'ComponentList: ' + IntToStr(ComponentList.Count); end; procedure TForm1.FormDestroy(Sender: TObject); begin ComponentList.Free; end; end. |
AW: Zur Laufzeit Comboboxen hinzufügen
Danke an himitsu und jus für den Component-Notify tipp/Beispiel-Code, ich werde übers Wochenende mal 'ne kleine DynamicControls unit erschaffen :-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 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