Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Form soll sich selbst schließen und erneut anzeigen (https://www.delphipraxis.net/190841-form-soll-sich-selbst-schliessen-und-erneut-anzeigen.html)

BlueStarHH 13. Nov 2016 13:11

Form soll sich selbst schließen und erneut anzeigen
 
Hallo,

ich habe ein Hauptformular und ein zweites Formular (SecondDlg). Wenn auf einem Schalter im Hauptformular gelickt werden soll, soll SecondDlg modal angezeigt werden. Im SecondDlg gibt es eine Schalter, der den SecondDlg schließen soll und eine neue Instanz vom SecondDlg anzeigen soll. Dabei habe ich das Problem, dass so gut wie immer (aber nicht immer) zwei Instanzen vom SecondDlg offen bleiben, wenn der Schalter im SecondDlg geklickt wird. Es soll aber immer nur die neue Instanz sichtbar sein. So sieht der Code aus:

Delphi-Quellcode:
unit Main;

interface

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

const
  SX_SHOW_EXERCISE = WM_USER + 1;

type
  TMainDlg = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure ShowExercise;

  protected
    procedure SXSHOWEXERCISE(var Message: TMessage); message SX_SHOW_EXERCISE;
  public
    { Public-Deklarationen }
  end;

var
  MainDlg: TMainDlg;

implementation

uses Second;
{$R *.dfm}

procedure TMainDlg.SXSHOWEXERCISE(var Message: TMessage);
begin
  // hier Message.wParam behandeln

  ShowExercise;
end;

procedure TMainDlg.Button1Click(Sender: TObject);
begin
  ShowExercise;
end;

procedure TMainDlg.ShowExercise;
var
  ASecondDlg: TSecondDlg;
begin

  Application.CreateForm(TSecondDlg, ASecondDlg);
  try
    ASecondDlg.Execute;
  finally
    ASecondDlg.Release;
  end;
end;

end.
Delphi-Quellcode:
unit Second;

interface

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

type
  TSecondDlg = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    procedure Execute;
  end;

//var
//  SecondDlg: TSecondDlg;

implementation

uses Main;
{$R *.dfm}

procedure TSecondDlg.Button1Click(Sender: TObject);
begin
  Close; //Hier sollte das Form geschlossen werden. Oft bleibt es aber offen und die neue Instanz, die durch die nächste Zeile geöffnet wird wird zusätzlich angezeigt.
  PostMessage(MainDlg.Handle, SX_SHOW_EXERCISE, 0, 0);
end;

procedure TSecondDlg.Execute;
begin
  caption := FormatDateTime('HHNNSS', Now);

  // hier Browser erzeugen und HTML-Seite laden

  ShowModal;
end;

end.

Luckie 13. Nov 2016 15:06

AW: Form soll sich selbst schließen und erneut anzeigen
 
Warum willst du, dass er sich nach dem Schließen wieder selbst öffnet?

BlueStarHH 13. Nov 2016 15:18

AW: Form soll sich selbst schließen und erneut anzeigen
 
Zitat:

Zitat von Luckie (Beitrag 1353499)
Warum willst du, dass er sich nach dem Schließen wieder selbst öffnet?

Damit ein anderer Inhalt im Form angezeigt wird. Der wird im Execute erzeugt und geladen.

Uwe Raabe 13. Nov 2016 15:39

AW: Form soll sich selbst schließen und erneut anzeigen
 
Zitat:

Zitat von BlueStarHH (Beitrag 1353501)
Damit ein anderer Inhalt im Form angezeigt wird. Der wird im Execute erzeugt und geladen.

In dem Fall würde ich eine separate Methode erstellen, die genau dieses tut. Diese Methode kannst du dann im Execute und im Button1Click aufrufen.

BlueStarHH 13. Nov 2016 19:13

AW: Form soll sich selbst schließen und erneut anzeigen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1353502)
Zitat:

Zitat von BlueStarHH (Beitrag 1353501)
Damit ein anderer Inhalt im Form angezeigt wird. Der wird im Execute erzeugt und geladen.

In dem Fall würde ich eine separate Methode erstellen, die genau dieses tut. Diese Methode kannst du dann im Execute und im Button1Click aufrufen.

Ja, das hab ich nun auch gemacht. Hat knappe 2 Stunden gekostet, die ich einsparen wollte...

dGeek 13. Nov 2016 20:28

AW: Form soll sich selbst schließen und erneut anzeigen
 
Zitat:

Ja, das hab ich nun auch gemacht. Hat knappe 2 Stunden gekostet, die ich einsparen wollte...
Wieso hat das denn zwei Stunden gedauert?
Das ist doch eigentlich nur eine Copy & Paste-Angelegenheit + "hier und da" ein paar Zeilen hinzufügen?

Aus....
Delphi-Quellcode:
procedure TSecondDlg.Execute;
begin
 Berechne;
 MacheWas;
 MachNochwas;
end;
wird...
Delphi-Quellcode:
procedure TSecondDlg.StartUpCode;
begin
 Berechne;
 MacheWas;
 MachNochwas;
end;

procedure TSecondDlg.Button1Click(Sender: TObject);
begin
 StartUpCode;
end;

procedure TSecondDlg.Execute;
begin
 StartUpCode;
end;

BlueStarHH 13. Nov 2016 21:01

AW: Form soll sich selbst schließen und erneut anzeigen
 
Zitat:

Zitat von dGeek (Beitrag 1353514)
Wieso hat das denn zwei Stunden gedauert?
Das ist doch eigentlich nur eine Copy & Paste-Angelegenheit + "hier und da" ein paar Zeilen hinzufügen?

Weil es eben keine Copy & Paste-Angelegenheit war. Das TSecondDlg soll direkt keine Details aus der MainForm kennen. Diese wurden von der MainForm an TSecondDlg.Execute(hier) übergeben. Wenn ich nun Execute im TSecondDlg selbst aufrufe, habe ich die Infos aus dem MainForm nicht. Also musste das Model und die MainForm geändert werden. Nichts kompliziertes, aber viele Zeilen und nicht nur dieses eine Beispiel.

blawen 13. Nov 2016 21:16

AW: Form soll sich selbst schließen und erneut anzeigen
 
Zitat:

Zitat von BlueStarHH (Beitrag 1353518)
Zitat:

Zitat von dGeek (Beitrag 1353514)
Wieso hat das denn zwei Stunden gedauert?
Das ist doch eigentlich nur eine Copy & Paste-Angelegenheit + "hier und da" ein paar Zeilen hinzufügen?

Weil es eben keine Copy & Paste-Angelegenheit war. Das TSecondDlg soll direkt keine Details aus der MainForm kennen. Diese wurden von der MainForm an TSecondDlg.Execute(hier) übergeben. Wenn ich nun Execute im TSecondDlg selbst aufrufe, habe ich die Infos aus dem MainForm nicht. Also musste das Model und die MainForm geändert werden. Nichts kompliziertes, aber viele Zeilen und nicht nur dieses eine Beispiel.

Wieso rufst Du die Startup-Procedure nicht mit den benötigten Parametern auf und blendest das Fenster innerhalb dieser Procedure ein?

Delphi-Quellcode:
procedure TSecondDlg.StartUpCode(Meine_Parameter : String);
begin
 Berechne;
 MacheWas;
 MachNochwas;
 Show;
end;

Jumpy 14. Nov 2016 10:47

AW: Form soll sich selbst schließen und erneut anzeigen
 
Zitat:

Zitat von BlueStarHH (Beitrag 1353518)
Zitat:

Zitat von dGeek (Beitrag 1353514)
Wieso hat das denn zwei Stunden gedauert?
Das ist doch eigentlich nur eine Copy & Paste-Angelegenheit + "hier und da" ein paar Zeilen hinzufügen?

Weil es eben keine Copy & Paste-Angelegenheit war. Das TSecondDlg soll direkt keine Details aus der MainForm kennen. Diese wurden von der MainForm an TSecondDlg.Execute(hier) übergeben. Wenn ich nun Execute im TSecondDlg selbst aufrufe, habe ich die Infos aus dem MainForm nicht. Also musste das Model und die MainForm geändert werden. Nichts kompliziertes, aber viele Zeilen und nicht nur dieses eine Beispiel.

Hätte TSecondDlg nicht beim schließen über Tags oder ModalResult der MainForm mitteilen können, dass noch ein zweites mal TSecondDlg zu öffnen ist, ggf. mit anderen Parametern? Dann sollten die Änderungen in TSecondDlg minimal sein und nur im MainForm müsste man was ändern...

bra 14. Nov 2016 12:20

AW: Form soll sich selbst schließen und erneut anzeigen
 
Woher soll denn der Dialog beim zweiten Öffnen seine Daten bekommen, wenn die nur vom Hauptform übergeben werden? Das kann doch gar nicht funktionieren.

Erstelle den Zweitdialog einmal, füge da eine Funktion ein, mit der die benötigten Daten befüllt werden und rufe die bei Bedarf vom Hauptfenster auf. Da den Dialog zu zerstören und neu zu erstellen ist doch überflüssig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr.
Seite 1 von 2  1 2      

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