Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MainForm zur Laufzeit wechseln? (https://www.delphipraxis.net/81436-mainform-zur-laufzeit-wechseln.html)

Bulvaye 27. Nov 2006 12:23


MainForm zur Laufzeit wechseln?
 
Wie kann ich zur Laufzeit das MainForm wechseln?

Problemfall:
Die Anwendung startet mit einem Form1 als Hauptformular. Aus diesem Formular heraus kann der Benutzer das Fenster zerstören, ein Form2 erzeugen und dieses ab sofort als MainForm nutzen (und umgekehrt - eine Art "Moduswechsel").

Frage:
Wie kann ich dies bewerkstelligen? Wie kann ich zur Laufzeit das aktuelle Mainform zerstören, ohne dass sich die Anwendung beendet und ein neu erzeugtes Form zum MainForm machen?

Vielen Dank für ein paar Tipps.

Phoenix 27. Nov 2006 12:29

Re: MainForm zur Laufzeit wechseln?
 
Ach Du schande...

Erm. .der einfachste Weg der mir gerade einfällt: Ein Fenster (TForm) ist ein TWinControl. Es kann also auf anderen Forms als ein mehr oder weniger normales Control erzeugt werden.

Mache also ein Containerform (MainForm) der Anwendung.

Dein normales bisheriges MainForm wird einfach erzeugt und der Parent auf das Containerform gesetzt. Neim Moduswechsel kannst Du dieses Form nun Problemlos vernichten und das neue Form wiederum mit dem Containerform als Parent erzeugen.

fwsp 27. Nov 2006 12:31

Re: MainForm zur Laufzeit wechseln?
 
wie wäre es, wenn du frames nimmst. oder tabsheets.

Hoshy 27. Nov 2006 12:40

Re: MainForm zur Laufzeit wechseln?
 
Ausgangslage:
TMainForm = Bisheriges Hauptformular
TNewForm = Künftiges Formular

In den Projektoptionen muss TNewForm so konfiguriert sein, dass es nicht automatisch erzeugt wird.

(1) Neues Form erzeugen:

Z. B. über einen Button auf TMainForm:
Delphi-Quellcode:
procedure TMainForm.btnCreateNewFormClick(Sender: TObject);
begin
  With TNewForm.Create(application) do Init(Self);
end;
Hier wird eine neue Instanz von TNewForm erzeugt, als Owner "Application" eingetragen und anschliessend die in TNewForm auscodierte Methode "Init" aufgerufen. Diese bekommt als Parameter eine Referez auf TMainForm geliefert, damit TNewForm anschliessend TMainForm zerstören kann.

(2) MainForm zerstören, z. B. über einen Button auf TNewForm.

Hier mal ein komplettes (rudimentäres) TNewForm als Beispiel:

Delphi-Quellcode:
unit UFrmNewForm;

interface

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

type
  TNewForm = class(TForm)
    btnKillMainForm: TButton;
    procedure btnKillMainFormClick(Sender: TObject);
  private
    fcaller: TForm;
  public
    procedure Init(aCaller: TForm);
  end;

var
  NewForm: TNewForm;

implementation

{$R *.dfm}

procedure TNewForm.Init(aCaller: TForm);
begin
  fcaller := aCaller;
  Show;
end;

procedure TNewForm.btnKillMainFormClick(Sender: TObject);
begin
  fcaller.Free;
end;

end.
Funktioniert :-D

uligerhardt 27. Nov 2006 13:17

Re: MainForm zur Laufzeit wechseln?
 
Zitat:

Zitat von Hoshy
Funktioniert :-D

Jain. :P
Hast du NewForm schonmal mininiert, nachdem du MainForm getötet hast? Und beendet sich deine Anwendung, wenn du NewForm schließt? Leider hat die Anwendung nach "FCaller.Free" keine Application.MainForm mehr, und das verträgt die VCL nur bedingt. :(

Ciao, Uli.

marabu 27. Nov 2006 13:40

Re: MainForm zur Laufzeit wechseln?
 
Hi,

den von Sebastian in Beitrag #2 beschriebenen Ansatz praktiziere ich häufig.

Die Umsetzung habe ich mir vor Jahren einmal bei Steve Teixeira (Delphi 4 Developer's Guide) abgeschaut: klick

Grüße vom marabu

Hoshy 27. Nov 2006 13:48

Re: MainForm zur Laufzeit wechseln?
 
Zitat:

Zitat von uligerhardt
Hast du NewForm schonmal mininiert, nachdem du MainForm getötet hast? Und beendet sich deine Anwendung, wenn du NewForm schließt?

SHI*T!! Soll nochmal einer sagen, Systemtests wären überflüssig :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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