![]() |
AW: Zur Laufzeit Comboboxen hinzufügen
Moin...:P
...nur zur Sicherheit: Delphi-Version: 7 :gruebel: Hast du die Möglichkeit auf die aktuelle Community Edition zu wechseln? Ich tippe darauf, daß du mit dem Lernen noch am Anfang stehst. :wink: |
AW: Zur Laufzeit Comboboxen hinzufügen
Seit wann ist der Parent für die Freigbae zuständig?! Das wird über den Owner gesteuert und nicht über den Parent. Wenn der Parent freigegeben wird, ist das enhaltene Objekt nach wie vor vorhanden und kann einfach an einen anderen Parent angehängt werden. Würde das durch den Parent gesteuert, würde viel eigener Code nicht mehr laufen, da ich in der Regel solche Sachen selber im Constructor erstelle und ich da keinen Owner im Create angebe. So hat man die volle Kontrolle über den Lebenszyklus einer eigenen Komponente und kann diese im Destructor der Komponente, innerhalb derer man das Object ertstellt hat, wieder freigeben. Mit dem Parent den man setzt hat das eigentlich nichts zu tun.
|
AW: Zur Laufzeit Comboboxen hinzufügen
Aus der Vcl.Controls.pas (Destruktor von TWinControl):
Zitat:
|
AW: Zur Laufzeit Comboboxen hinzufügen
Zitat:
Der Schuldige:
Delphi-Quellcode:
.Controls für Parent und .Components bei Owner
destructor TWinControl.Destroy;
begin ... I := ControlCount; while I <> 0 do begin Instance := Controls[I - 1]; Remove(Instance); Instance.Destroy; <<<<< I := ControlCount; end; ... end; Logisch ist es ein reiner Fail, aber ich vermute es ist als Kackfix gedacht, für zur Laufzeit erstellte Komponenten, wo die Entwickler zu doof sind den Owner anzugeben. :freak: Ich hätte lieber das Speicherleck, als unverständlich verschwindende Komponenten. |
AW: Zur Laufzeit Comboboxen hinzufügen
TWinControl kapselt ein Control der Win32-API. Diese kennen keinen Owner, sondern nur eine Parent, der für beides zuständig ist.
|
AW: Zur Laufzeit Comboboxen hinzufügen
TWinControl ist aber nicht unbedingt an die Lebensdauer des eingebetten Controls gekoppelt.
Der Innere kann sogar zwischendurch mal verschwinden und wird neu erstellt. (drum halten die Delphi-Controls auch alle Daten doppelt) Stell mal bei einer Form das StayOnTop um und erlebe, wie das Fenster und sein Inhalt freigebeben und neu erstellt wird ... drum darf man sowas wie z.B. eigene Registrierungen für Drag&Drop nicht im Constructor machen, sondern besser in CreateWnd bzw. CreateWindowHandle. Ich sehe da keinen Grund, dieses Verhalten daher im Delphi nachbauen zu müssen, wo es dort ja schließlich den Owner gibt. |
AW: Zur Laufzeit Comboboxen hinzufügen
Zitat:
Das wird dort beides gesetz. Einmal per COnstructor und dann noch separat der Parent per Zuweisung. Das einzige was einen stören könnte wäre, dass der COde als Prozedur und nicht als Methode umgesetzt ist. |
AW: Zur Laufzeit Comboboxen hinzufügen
Das hat er nach meinem Hinweis nachträglich eingefügt.
Vergleiche: Timestamp seines Beitrages Timestamp meines Beitrages Timestamp seines Änderung Und er hat den Änderungsgrund sogar genannt. |
AW: Zur Laufzeit Comboboxen hinzufügen
Zitat:
Combo.Items.Add('erster Eintrag'); Combo.Items.Add('zweiter Eintrag'); Combo.ItemIndex := 1; // Vorselektion 2. Eintrag, falls gewünscht |
AW: Zur Laufzeit Comboboxen hinzufügen
Ein neuer Versuch mit ein paar Zugaben, schönes Wochenende und diesmal wurden meinerseits auch Mängel berücksichtigt.
Viel Spass beim rumtesten. Die .pas Datei:
Delphi-Quellcode:
die .dfm Datei:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) cbPnl: TPanel; mainPnl: TPanel; infoPnl: TPanel; addBtn: TButton; procedure addBtnClick(Sender: TObject); private public // manuell eingefügte events die ich später verwende procedure cbChange(Sender: TObject); procedure cbClick(Sender: TObject); end; var Form1: TForm1; cbList: TList; const minHeight = 120; implementation {$R *.dfm} procedure TForm1.addBtnClick(Sender: TObject); var cb : TComboBox; begin // hier wird eine neue combobox erstellt mit ein paar grundeinstellungen // in diesem fall erstelle ich die cb in ein panel cb := TComboBox.Create(cbPnl); cb.Parent := Self; cb.Left := 3; cb.Top := cbList.Count * cb.Height + 3; cb.Style := csDropDownList; // damit man auch was zu sehen/klicken hat, ein paar einträge erzeugen cb.Items.Add('CB #' + IntToStr(cbList.Count)); cb.Items.Add('Cool #' + IntToStr(cbList.Count)); cb.ItemIndex := 0; // hier weise ich der cb events zu, für weitere events einfach diesem beispiel folgen cb.OnChange := cbChange; cb.OnClick := cbClick; // verwaltung der cb's cbList.Add(cb); // prototyp einer dynamischen formular größe if ((cbList.Count + 2) * cb.Height + 3) > minHeight then Height := (cbList.Count + 2) * cb.Height + 3; end; procedure TForm1.cbChange(Sender: TObject); begin infoPnl.Caption := TComboBox(Sender).Text; end; procedure TForm1.cbClick(Sender: TObject); begin infoPnl.Caption := TComboBox(Sender).Text; end; initialization cbList := TList.Create; finalization cbList.Free; end.
Delphi-Quellcode:
object Form1: TForm1
Left = 192 Top = 125 BorderIcons = [biSystemMenu] BorderStyle = bsSingle Caption = 'DynCbDemo by KodeZwerg' ClientHeight = 81 ClientWidth = 315 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 object cbPnl: TPanel Left = 0 Top = 0 Width = 150 Height = 81 Align = alLeft TabOrder = 0 end object mainPnl: TPanel Left = 150 Top = 0 Width = 165 Height = 81 Align = alClient TabOrder = 1 object infoPnl: TPanel Left = 1 Top = 1 Width = 163 Height = 41 Align = alTop BevelOuter = bvNone Caption = 'CB Item Display' TabOrder = 0 end object addBtn: TButton Left = 16 Top = 48 Width = 129 Height = 25 Caption = 'Add ComboBox' TabOrder = 1 OnClick = addBtnClick end end end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 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