Registriert seit: 28. Mär 2005
Ort: Hamburg
850 Beiträge
Delphi 11 Alexandria
|
Form soll sich selbst schließen und erneut anzeigen
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
|
|
Zitat
|