AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Thema durchsuchen
Ansicht
Themen-Optionen

Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

Ein Thema von Darlo · begonnen am 14. Jan 2016 · letzter Beitrag vom 14. Jan 2016
Antwort Antwort
Darlo

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

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 14:52
Muss mir wohl eingestehen dass hier ein Designfehler vorliegt den ich mir nicht wieder gerade basteln kann... auf alle Fälle nicht crossplatform.
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#2

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 14:59
Du kannst die aktuell vorhandenen Forms auch über Screen.Forms /Screen.FormCount durchwandern und schauen ob du was passendes findest.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Darlo

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

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 15:08
Ich zeige die Forms nicht an. Ich hole mir nur Panels aus den Forms auf mein Mainform um Eingaben zu verwalten.
Philip
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.558 Beiträge
 
Delphi 12 Athens
 
#4

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 15:12
Und warum nicht Frames?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Darlo

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

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 15:15
Zum Zeitpunkt der Entwicklung hatte Frames nicht den besten Ruf, geprüft hatte ich es selber nicht.
Philip
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 15:22
Muss mir wohl eingestehen dass hier ein Designfehler vorliegt den ich mir nicht wieder gerade basteln kann... auf alle Fälle nicht crossplatform.
Wo liegt hier der Designfehler?
In Deiner Form, Formulare zu erstellen?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
    f : TForm2;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(f) then begin
    f := TForm2.Create(Application);
    f.Name := 'Hugo';
  end;
  f.Show;
  // oder mach sonstwas mit dem Formular, ohne es anzuzeigen.
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(f) then f.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
          k : TComponent;
begin
  k := Application.FindComponent('Hugo');
  if Assigned(k) then begin
    if k is TForm2 then begin
      TForm2(k).Show;
// oder sonstwas, es muss nicht zwingend angezeigt werden, um damit zu arbeiten.
    end
  end;
end;

end.
Hiermit kann man ein Formular erstellen, soweit es noch nicht existiert.

Wenn es existiert, kann man es freigeben.

Man kann es über Application.FindComponent finden und damit arbeiten.

Was funktioniert nicht bzw. wo ist der Designfehler?

Uwes Vorschlag funktioniert, unabhängig davon, ob die Formulare angezeigt werden oder nicht.
Das Vorhandensein von Formularen hat nichts mit der Sichtbarkeit auf dem Bildschirm zu tuen.

Wie "holst" Du denn die Panels (oder was auch immer) auf "Dein" Formular? Änderst Du dann den Parent?

War passiert eigentlich dann mit diesen Teilen, wenn Du Dein Formular schließt?
Oder wenn eines der Formulare, von denen Du sie holst, freigegeben wird?

Die Verwendung von Frames dürfte da deutlich besser sein und auch wohl eher designkonform.

Designfehler liegen nicht vor, wenn man etwas nicht designkonform nutzt, man sollte hier die Form der Nutzung lieber designkonform gestalten.

Bei mir funktionieren Frames seit ca. 20 Jahren unter Delphi problemlos, wie alt ist denn das Design der von Dir gewarteten Software?

Geändert von nahpets (14. Jan 2016 um 15:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.558 Beiträge
 
Delphi 12 Athens
 
#7

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 15:25
Warum FindComponent, wenn man f hat?

Zitat von Du:
if Assigned(f) then f.Free;
Schau mal was TObject.Free macht.
Zitat von Delphi:
Delphi-Quellcode:
procedure TObject.Free;
begin
  if Self <> nil then // if Assigned(Self) then
    Destroy;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 15:36
Nur so am Rande bemerkt:

Mit ARC reicht ein simples Free oder FreeAndNil bei einer Komponente nicht mehr aus. Da muss man schon mit Delphi-Referenz durchsuchenTObject.DisposeOf ran.

Um die Instanz-Variable für die Komponente auf nil zu setzen überschreibt man Delphi-Referenz durchsuchenTComponent.Notification und reagiert dort auf opRemove .

Die Notification wird für alle Komponenten automatisch aufgerufen, wo man Owner oder Parent ist. Alle anderen Komponenten müssen mit Delphi-Referenz durchsuchenTComponent.FreeNotification registrieren um auch diese Benachrichtigung zu erhalten.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden

  Alt 14. Jan 2016, 15:38
Warum FindComponent, wenn man f hat?

Zitat von Du:
if Assigned(f) then f.Free;
Schau mal was TObject.Free macht.
Zitat von Delphi:
Delphi-Quellcode:
procedure TObject.Free;
begin
  if Self <> nil then // if Assigned(Self) then
    Destroy;
end;
FindComponent zum Ersten, um zu zeigen, dass es funktioniert und zum Zweiten, weil es eventuell dann hier
Delphi-Quellcode:
if not assigned(Application.FindComponent(formListe[n]) as TForm) then
begin
  continue;
end;
funktioniert, ohne zu wissen, wie die weitere Programmlogik des Threaderstellers aussieht.

Und ja, es heißt natürlich f.Destroy
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:38 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