AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Form dynamisch erzeugen

Ein Thema von whiteF · begonnen am 16. Okt 2016 · letzter Beitrag vom 24. Okt 2016
Antwort Antwort
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

AW: Form dynamisch erzeugen

  Alt 17. Okt 2016, 11:12
Zitat:
Da hätte ich dann noch eine kleine Anschlussfrage:

Wie spreche ich diese dynamisch erzeugte Form dann am besten an?
Guck dir mal meinen Lösungsvorschlag an. Dann kannst du das Formular ansprechen wie jedes andere Formular auch und du brauchst keine extra Variable, welche total sinnlos ist.
Kommt natürlich darauf an wieviele parallele Instanzen benötigt werden.
Philip
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#2

AW: Form dynamisch erzeugen

  Alt 17. Okt 2016, 22:57
Also, da ich ja die Form mehrfach eingeblendet werden sollte bei meinem programm, dürfte ich ja für die form keinen festen Namen vergeben, sonst könnte ja in der 2.ten Instanz ja nicht mehr die Form created werden da ja der Name bereits existiert (vermute ich jetzt mal ganz stark).

Es funktionieren beide Varianten:

#1
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  FormMessengerNW_Instanz : TFormMessengerNW;
begin
  try
    FormMessengerNW_Instanz := TFormMessengerNW.Create(Application.MainForm);
  finally
    FormMessengerNW_Instanz.Show;
  end;
end;
#2
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Application.CreateForm(TFormMessengerNW, FormMessengerNW);
  finally
    FormMessengerNW.Show;
  end;
end;
Um die dynamisch erzeugte Form zu schliessen kommt es zum Teil drauf an wie diese erstellt worden ist.
Das klappt immer:
Delphi-Quellcode:
procedure TFormMessengerNW.Button1Click(Sender: TObject);
begin
  Self.Close;
end;
Das klappt nur in Verbindung mit der #2-Variante:
Delphi-Quellcode:
procedure TFormMessengerNW.Button1Click(Sender: TObject);
begin
  FormMessengerNW.Close; //Wenn mehrere Instanzen erstellt werden, gibt es hiermit jedoch Probleme
//das funktioniert aber auch: Self.Close; //Wenn mehrere Instanzen erstellt werden, gibt es hiermit KEINE Probleme
end;
Variante #2 kann hiermit gefunden (gelistet) werden kann //Variante #1 nicht... wieso nicht? :
Delphi-Quellcode:
procedure TForm1.Button11Click(Sender: TObject);
var
  i, ii: Integer;
begin
  Memo1.Clear;
  ii := 0;
  for i := 0 to Application.ComponentCount - 1 do
  begin
    if Application.Components[i] is TForm then
    begin
      Memo1.Lines.Add(Application.Components[i].Name);
      ii := ii + 1;
    end;
  end;
  Edit1.Text := IntToStr(ii);
end;
Das hier funktioniert für Variante #1 & #2
Delphi-Quellcode:
procedure TForm1.Button22Click(Sender: TObject);
var
  i, ii: Integer;
begin
  Memo1.Clear;
  ii := 0;
  for i := 0 to Screen.CustomFormCount - 1 do
  begin
    Memo1.Lines.Add(Screen.Forms[i].Name);
    ii := ii + 1;
  end;
  Edit1.Text := IntToStr(ii);
end;

Ein kleines praktisches Beispiel Projekt liegt anbei.
Angehängte Dateien
Dateityp: rar DynForm.rar (6,1 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.134 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Form dynamisch erzeugen

  Alt 23. Okt 2016, 21:35
Man erstellt grundsätzlich mit Application.CreateForm und referenziert die in sich mit Self (wobei man das auch weglassen kann, was das gleiche ergibt). Bei Application.CreateForm ist Application der Besitzer der Form. Beim direkten Aufruf von Create ist halt derjenige der Besitzer, den du angibst. Das Durchlaufen der Kindkomponenten von MainForm oder Application ist auch reichlich ineffizient. Man nimmt sich am ehesten eine TList oder ein Array.
Wenn du eine Form entwirfst, gibt dir Delphi eine Instanzvariable mit dem Namen der Form ohne T dran (denn T ist der uninstanzierte Typ). Heißt deine Form TFormMessengerNW, so heißt diese Variable also FormMessengerNW. Du musst die Instanz erst erstellen, das macht man mit Application.CreateForm.
Wenn du in deinem Code, wie du es machst, nicht Self sondern eine ganz bestimmte Instanzvariable, in dem Fall die vorgegebene FormMessengerNW, schließt, aber eine völlig andere Instanzvariable namens FormMessengerNW_Instanz erstellt hast, klappt das natürlich nicht.

Du benutzt zudem try-finally-Konstrukte komplett falsch. Der finally-Block wird immer aufgerufen, egal was im try-Block passiert. Schlägt das Erstellen der Form fehl, rufst du Show auf. Show schlägt fehl, weil die Instanz gar nicht erstellt wurde. Dein try-finally-Konstrukt bringt also absolut nichts. Daher haut dir der Compiler die erste Variante auch um die Ohren, denn das Create gehört niemals in dasselbe try-finally-Konstrukt wie jegliche Befehle, die darauf zugreifen. Wenn du im finally-Block auf etwas zugreifst, was du im try-Block erstellt hast, hast du ja überhaupt keine Ahnung, ob du das überhaupt erstellt hast oder nicht.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.493 Beiträge
 
Delphi 12 Athens
 
#4

AW: Form dynamisch erzeugen

  Alt 24. Okt 2016, 10:35
Dem Event "OnCreate" eine Methode zuzuweisen, nachdem das Create() bereits ausgeführt wurde, ist vieleicht auch nicht gut durchdacht. Besser währe hier eine Public-Methode, die vom Ersteller einfach nach dem Create() aufgerufen wird. Alternativ könnte man diese Initialisierungen vieleicht auch im FormShow erledigen.
  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 15:49 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