AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Form soll sich selbst schließen und erneut anzeigen

Ein Thema von BlueStarHH · begonnen am 13. Nov 2016 · letzter Beitrag vom 14. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2   
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
794 Beiträge
 
Delphi 11 Alexandria
 
#1

Form soll sich selbst schließen und erneut anzeigen

  Alt 13. Nov 2016, 14:11
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.

Geändert von TBx (13. Nov 2016 um 15:10 Uhr) Grund: Code-Tags durch Delphi-Tags ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 13. Nov 2016, 16:06
Warum willst du, dass er sich nach dem Schließen wieder selbst öffnet?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
794 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 13. Nov 2016, 16:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.861 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 13. Nov 2016, 16:39
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
794 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 13. Nov 2016, 20:13
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...
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#6

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

  Alt 13. Nov 2016, 21:28
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;

Geändert von dGeek (13. Nov 2016 um 21:31 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
794 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 13. Nov 2016, 22:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
644 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 13. Nov 2016, 22:16
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;
Roland
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.732 Beiträge
 
Delphi 6 Enterprise
 
#9

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

  Alt 14. Nov 2016, 11:47
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...
Ralph
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#10

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

  Alt 14. Nov 2016, 13:20
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 19:22 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