Einzelnen Beitrag anzeigen

BlueStarHH

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

Form soll sich selbst schließen und erneut anzeigen

  Alt 13. Nov 2016, 13: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 14:10 Uhr) Grund: Code-Tags durch Delphi-Tags ersetzt
  Mit Zitat antworten Zitat