AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wie erstelle ich dynamische forms richtig ?

Ein Thema von Int3g3r · begonnen am 5. Mär 2019 · letzter Beitrag vom 6. Mär 2019
Antwort Antwort
Benutzerbild von haentschman
haentschman

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

AW: Wie erstelle ich dynamische forms richtig ?

  Alt 6. Mär 2019, 08:40
Zitat:
TObjectList ist eine Liste von TObjects, wenn ich aus dieser Liste ein Object entfernte wird es automatisch freigegeben.
Richtig, wenn du es willst. Bei Nein verhällt sich die Liste wie eine TList. Du kannst nur über den Index auf das Objekt zugreifen.
Zitat:
TObjectDictionary überprüft automatisch ob ein TObject noch gebraucht wird oder nicht und gibt dies automatisch frei wenn es nicht mehr gebraucht wird.
Nicht ganz. TDictionary verhält sich, wenn man es möchte, wie eine TObjectList. ABER über den Key (string, Integer, TBlubb was auch immer) kannst du dir das zugehörige Objekt direkt holen.

Delphi-Quellcode:
unit Unit2;

interface

uses
  System.Classes, System.Generics.Collections, System.Generics.Defaults, System.SysUtils,
  Vcl.Forms, Vcl.Controls, Vcl.StdCtrls;
  form_child; // :-) entspricht nicht dem Styleguide...besser FormChild


type
  TForm2 = class(TForm)
    btnCreateChild: TButton;
    lblList: TLabel;
    lblDict: TLabel;
    lblDict2: TLabel;
    procedure btnCreateChildClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
   private
      FList: TObjectList<TForm>;
      FDictionary: TObjectDictionary<string, TForm>;
   public

   end;

var
   Form2: TForm2;

implementation

procedure TForm2.FormCreate(Sender: TObject);
begin
  FList := TObjectList<TForm>.Create(True); // True gibt die Objekte selbstständig frei
  FDictionary := TObjectDictionary<string, TForm>.Create([doOwnsValues]); // doOwnValues gibt die Objekte (Value) selbstständig frei
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  FList.Free;
  FDictionary.Free;
end;

procedure TForm2.btnCreateChildClick(Sender: TObject);
var
  I: Integer;
  Child: TForm;
  TempForm: TForm;
begin
  for I := 0 to 2 do
  begin
    Child := Tfrm_child.Create(nil); // :-) entspricht nicht dem Styleguide...besser TfrmChild
    Child.Name := 'Child' + IntToStr(I);
    Child.Align := alLeft;
    Child.Parent := cxScrollbox;
    Child.AlignWithMargins := True;
    Child.pnlchild.Color := clRed;
    Child.pnlchild.Caption := 'ArrayINDEX = ' + IntToStr(Integer);

    FList.Add(Child);
    FDictionary.Add(Child.Name, Child);

    Child.Show;
  end;


  lblList.Caption := 'Name des ersten Eintrages: ' + FList[0].Name;
  lblDict.Caption := 'Name des 2. Eintrages im Dictionary: ' + FDictionary.Items['Child2'].Name;

  // Wenn man nicht weiß ob der Schlüssel existiert
  FDictionary.TryGetValue('Child2', TempForm);
  if Assigned(TempForm) then
  begin
    lblDict.Caption := 'Name des 3. Eintrages im Dictionary: ' + TempForm.Name;
  end
  else
  begin
    lblDict.Caption := 'Name des 3. Eintrages im Dictionary: nicht gefunden';
  end;
end;

end.
Delphi-Quellcode:
object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object lblList: TLabel
    Left = 48
    Top = 96
    Width = 26
    Height = 13
    Caption = 'lblList'
  end
  object lblDict: TLabel
    Left = 48
    Top = 120
    Width = 28
    Height = 13
    Caption = 'lblDict'
  end
  object lblDict2: TLabel
    Left = 48
    Top = 144
    Width = 34
    Height = 13
    Caption = 'lblDict2'
  end
  object btnCreateChild: TButton
    Left = 40
    Top = 40
    Width = 75
    Height = 25
    Caption = 'Create'
    TabOrder = 0
    OnClick = btnCreateChildClick
  end
end

Geändert von haentschman ( 6. Mär 2019 um 08:49 Uhr)
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Wie erstelle ich dynamische forms richtig ?

  Alt 6. Mär 2019, 13:30
Delphi-Quellcode:
uses
  System.Classes, System.Generics.Collections, System.Generics.Defaults, System.SysUtils,
  Vcl.Forms, Vcl.Controls, Vcl.StdCtrls;
Mit CTRL+Leertaste wird mir System.Generics automatisch vervollständigt aber nachher steht:

Zitat:
Unit-Name 'system.generics' kann nicht aufgelöst werden


PS: Wie sagt man dem Menü CTRL+Leertaste richtig ?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: Wie erstelle ich dynamische forms richtig ?

  Alt 6. Mär 2019, 14:28
Was hast du denn vor? CTRL+Leertaste ist die Vervollständigung im QT. Da hat System.Generics nichts zu suchen. Du must nur die Klassen aus der Unit instanzieren.
...oder ich verstehe was falsch.
Ein wenig QT wäre angebracht.
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Wie erstelle ich dynamische forms richtig ?

  Alt 6. Mär 2019, 15:03
Was hast du denn vor? CTRL+Leertaste ist die Vervollständigung im QT. Da hat System.Generics nichts zu suchen. Du must nur die Klassen aus der Unit instanzieren.
...oder ich verstehe was falsch.
Ein wenig QT wäre angebracht.
Naja wenn ich eine
Code:
FList: TObjectList<TForm>;
einfüge benötige ich die unit system.generics. Sonst lässt sich mein Projekt nicht kompillieren da er eine TObjectList nicht kennt(Undeklarierter Bezeichner).

Somit habe ich versucht die system.generics in der unit einzubinden, diese kann er aber nicht auflösen.

Bei deinem Beispiel hast du die

System.Generics.Collections
System.Generics.Defaults

Eingebunden. Somit habe ich gedacht, wenn ich die System.Generics einbinde werden mir beide (also System.Generics.Collections und System.Generics.Defaults) eingebunden. System.Generics beinhaltet ja die Collections und Defaults. Anscheinend ist dem aber nicht so.

Naja habe nun gemerkt das es nur geht wenn ich diese einzeln einbinde.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: Wie erstelle ich dynamische forms richtig ?

  Alt 6. Mär 2019, 15:05
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Wie erstelle ich dynamische forms richtig ?

  Alt 6. Mär 2019, 15:08
Eingebunden. Somit habe ich gedacht, wenn ich die System.Generics einbinde werden mir beide (also System.Generics.Collections und System.Generics.Defaults) eingebunden. System.Generics beinhaltet ja die Collections und Defaults. Anscheinend ist dem aber nicht so.

Naja habe nun gemerkt das es nur geht wenn ich diese einzeln einbinde.
Delphi hat KEINE echten Namespaces, so wie bspw. C#.
Du musst immer die vollständigen Unit-Namen hinschreiben.
  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 11:18 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