Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zur Laufzeit Comboboxen hinzufügen (https://www.delphipraxis.net/203408-zur-laufzeit-comboboxen-hinzufuegen.html)

haentschman 14. Feb 2020 13:24

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:

Rolf Frei 14. Feb 2020 13:28

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.

DeddyH 14. Feb 2020 13:35

AW: Zur Laufzeit Comboboxen hinzufügen
 
Aus der Vcl.Controls.pas (Destruktor von TWinControl):
Zitat:

Delphi-Quellcode:
  I := ControlCount;
  while I <> 0 do
  begin
    Instance := Controls[I - 1];
    Remove(Instance);
    Instance.Destroy;
    I := ControlCount;
  end;

Besser erst nachsehen, bevor man Behauptungen aufstellt. Ich hatte mir vor Jahren mal die Mühe gemacht, seit wann das so ist, und konnte ähnlichen Code bereits in Delphi 6 finden, ältere Versionen hatte ich nicht untersucht.

himitsu 14. Feb 2020 13:37

AW: Zur Laufzeit Comboboxen hinzufügen
 
Zitat:

Zitat von Rolf Frei (Beitrag 1457523)
Seit wann ist der Parent für die Freigbae zuständig?! Das wird über den Owner gesteuert und nicht über den Parent

Leider schon immer. Ich war auch geschockt, beim Versuch zur Laufzeit eine Komponente zeitweise auf eine andere Form zu verschieben. (muß man erst den Parent abhängen und dann die Form freigeben)

Der Schuldige:
Delphi-Quellcode:
destructor TWinControl.Destroy;
begin
  ...
  I := ControlCount;
  while I <> 0 do
  begin
    Instance := Controls[I - 1];
    Remove(Instance);
    Instance.Destroy; <<<<<
    I := ControlCount;
  end;
  ...
end;
.Controls für Parent und .Components bei Owner

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.

mkinzler 14. Feb 2020 13:42

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.

himitsu 14. Feb 2020 13:51

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.

TurboMagic 14. Feb 2020 17:53

AW: Zur Laufzeit Comboboxen hinzufügen
 
Zitat:

Zitat von Luckie (Beitrag 1457492)
Man sollte aber noch den Parent setzen, damit sie auch gezeichnet wird und den Owner, damit der Owner das Zerstören übernimmt.

Hast du dir das erste Codebeispiel mal angeschaut?
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.

Luckie 14. Feb 2020 18:37

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.

TurboMagic 15. Feb 2020 11:18

AW: Zur Laufzeit Comboboxen hinzufügen
 
Zitat:

Zitat von KomischerKautz (Beitrag 1457511)
Super! Das funktioniert einwandfrei. Vielen Dank für euere Hilfe!
Nun abschließend noch; den Inhalt von Comboboxen fülle ich ja normalerweise in der StringList der Combobox in den Properties. Das funktioniert hier wie es scheint nicht, da ja noch keine Combobox vorhanden ist, welche ich füllen kann.
Wie kann ich nun den Inhalt aller erzeugter Comboboxen vorbestimmen?

Wie schon geschrieben über die Items:

Combo.Items.Add('erster Eintrag');
Combo.Items.Add('zweiter Eintrag');
Combo.ItemIndex := 1; // Vorselektion 2. Eintrag, falls gewünscht

KodeZwerg 15. Feb 2020 13:33

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:
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.
die .dfm Datei:
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 15:52 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz