Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Formular zur Laufzeit mit Edit, Labels und Buttons + Events (https://www.delphipraxis.net/211348-formular-zur-laufzeit-mit-edit-labels-und-buttons-events.html)

Alex_ITA01 2. Sep 2022 10:14

Formular zur Laufzeit mit Edit, Labels und Buttons + Events
 
Hallo zusammen,
ich habe eine Frage, weil ich mir nicht sicher bin, wie ich das am besten anstelle.
Ich erzeuge ein Formular zur Laufzeit, welches Modal aufgerufen werden muss.
Dieses Formular hat Labels, ein Edit und mehrere Buttons.
Ich mache das ganze mit einer lokalen Variable (das Formular) und rufe es modal in einer Prozedur auf.
In dieser Prozedure erzeuge ich alle Komponenten, die auf dem Formular sein sollen.
Bis hier hin geht alles, kein Problem.

Ich möchte, dass beim Button Klick, das Edit des modalen Fensters beschrieben wird mit einem bestimmten Wert (Inhalt spielt keine Rolle).
Es geht mir darum, dass ich das Event zum Button verknüpfen muss und dann den Wert "x" auf das Edit schreibe.
Wie greife ich in dem OnClick Ereignis auf das Edit zu, welches dynamisch in der einen Prozedur erzeugt wurde?
Habt ihr eine Idee, wie ich das in meiner Prozedur umsetzen kann?

Ich hoffe, ihr wisst wie ich das meine...

Edelfix 2. Sep 2022 10:36

AW: Formular zur Laufzeit mit Edit, Labels und Buttons + Events
 
Schätze mal das du mit einer Schleife durch alle self.Components gehen musst und die Komponente über den Namen finden. Dann mit TEdit(Components[I]).Text:='Hallo'; etwas rein schreiben.

dummzeuch 2. Sep 2022 10:50

AW: Formular zur Laufzeit mit Edit, Labels und Buttons + Events
 
Du kannst Referenzen auf die erzeugten Controls in Formularfeldern speichern und dann ganz normal über diese Felder darauf zugreifen.

Delphi-Quellcode:
type
  TMyForm = class(TForm)
  private
   FEdit1: TEdit;
   FButton1: TButton;
   procedure HandleButton1Click(_Sender: TObject);
  public
    constructor Create(_Owner: TComponent); override;
  end;

constructor TMyForm.Create(_Owner: TComponent);
begin
  inherited;
  FEdit1 := TEdit.Create(Self);
  FEdit1.Parent := self;
  // Position etc. setzen
  FButton1 := TButton.Create(Self);
  FButton1.Parent := self;
  // Position etc. setzen
  FButton1.OnClick := HandleButton1Click;
end;

procedure TMyForm.HandleButton1Click(_Sender: TObject);
begin
  FEdit1.Text := 'bla';
end;

Neumann 2. Sep 2022 11:00

AW: Formular zur Laufzeit mit Edit, Labels und Buttons + Events
 
Sehe den Sinn nicht so ganz das Formular komplett aus Code aufzubauen. Man kann es doch auch wie jedes andere Formular anlegen und dann in "Verfügbare Formulare" setzen, dann wird es bei Programmstart nicht automatisch erzeugt.

Dann bleiben nur noch wenige Zeilen zum Erzeugen Anzeigen Löschen.

Uwe Raabe 2. Sep 2022 11:05

AW: Formular zur Laufzeit mit Edit, Labels und Buttons + Events
 
Zitat:

Zitat von Neumann (Beitrag 1511142)
Sehe den Sinn nicht so ganz das Formular komplett aus Code aufzubauen.

Das kann schon sinnvoll sein, wenn man die Controls dynamisch erzeugen will. Z.B. eine variable Anzahl von Label-Edit-CheckBox Kombinationen, wo die tatsächliche Anzahl erst zur Laufzeit bekannt ist. Allerdings kann das gerade bei High-DPI Anwendungen schon etwas komplexer werden, das alles sauber zu positionieren.

Alex_ITA01 2. Sep 2022 11:38

AW: Formular zur Laufzeit mit Edit, Labels und Buttons + Events
 
Es ist wie Uwe sagt, dynamisch. Von daher ist die Größe vorher nicht bekannt.
Ich erzeuge das Formular direkt als TForm, ich muss mir dann erst eine eigene Klasse machen, damit ich die Events da drinne deklarieren und auch direkt auf die Edits zugreifen kann. Die Edits werden ja in der einen prozedur auch dynamisch erzeugt und sind immer nur eine lokale Variable. Daher kann ich die in den Events nicht ansprechen, da brauche ich etwas globales (also eigene Klasse). Danke aber :thumb:

Uwe Raabe 2. Sep 2022 11:43

AW: Formular zur Laufzeit mit Edit, Labels und Buttons + Events
 
Alternativ kannst du auch über FindComponent an die Controls rankommen, vorausgesetzt sie wurden mit dem Form als Owner erzeugt.

Etwas komfortabler geht es mit einem TComponent Helper wie hier gezeigt:
Delphi-Quellcode:
type
  TComponentHelper = class helper for TComponent
  public
    function FindComponentOf<T: TComponent>(const AName: string): T; inline;
  end;

...

function TComponentHelper.FindComponentOf<T>(const AName: string): T;
begin
  result := FindComponent(AName) as T;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 Uhr.

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