Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Formular modal öffnen

  Alt 8. Sep 2015, 14:28
Also es gibt im Prinzip erst einmal kein Problem mit dem ShowModal:
Delphi-Quellcode:
unit Dialogs.FooDialog;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TFooDialog = class( TForm )
    Button1: TButton; { ModalResult := mrOK; }
    procedure FormDestroy( Sender: TObject );
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FooDialog: TFooDialog;

implementation

{$R *.fmx}

procedure TFooDialog.FormDestroy( Sender: TObject );
begin
  ShowMessage( 'Going to Nirwana' );
end;

end.
und
Delphi-Quellcode:
unit Forms.MainForm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TMainForm = class( TForm )
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click( Sender: TObject );
    procedure Button2Click( Sender: TObject );
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.fmx}

uses
  Dialogs.FooDialog;

{Variante 1}
procedure TMainForm.Button1Click( Sender: TObject );
var
  LDialog: TFooDialog;
begin
  LDialog := TFooDialog.Create( nil );
  try
    LDialog.ShowModal;
  finally
    LDialog.DisposeOf;
  end;
end;

{Variante 2}
procedure TMainForm.Button2Click( Sender: TObject );
var
  LOuter, LInner: TFooDialog;
begin
  LOuter := TFooDialog.Create( nil );
  try
    LInner := LOuter;
    LInner.ShowModal(
      procedure( r: TModalResult )
      begin
        LInner.Release;
      end );
    LOuter := nil;
  finally
    LOuter.DisposeOf;
  end;
end;

end.
Sowohl Variante1 als auch Variante2 funktionieren erstmal ohne Auffälligkeiten.

Aber bei Variante2 (unter Windows/OSX)
  • ist die Form nicht wirklich modal! Man kann zwischen den Formularen hin und her wechseln
  • ruft ein simples Close nicht die ResultProc auf
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat