Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Wie ShowModal Form aus dem HauptForm schließen? (https://www.delphipraxis.net/185219-wie-showmodal-form-aus-dem-hauptform-schliessen.html)

Popov 22. Mai 2015 21:16

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
@AlexII

Was du da machst ist vermutlich "falsch" (in Anführungszeichen). Das ShowModal Fenster hat eigentlich einen Sinn. So wie es aussieht nutzt du es aber für die Sperrung eines Fensters. Das kann man aber auch anders lösen.

Hier mal etwas aus meinem alten Beispiele-Ordner.


Form1:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ModalResult: ShortInt;
begin
  ModalResult := ModalForm.ShowModal;

  case ModalResult of
    mrOk      : ShowMessage('Das Modalfenster hat mrOk als Ergebnis.');
    mrCancel  : ShowMessage('Das Modalfenster hat mrCancel als Ergebnis.');
    mrAbort   : ShowMessage('Das Modalfenster hat mrAbort als Ergebnis.');
    mrRetry   : ShowMessage('Das Modalfenster hat mrRetry als Ergebnis.');
    mrIgnore  : ShowMessage('Das Modalfenster hat mrIgnore als Ergebnis.');
    mrYes     : ShowMessage('Das Modalfenster hat mrYes als Ergebnis.');
    mrNo      : ShowMessage('Das Modalfenster hat mrYes als Ergebnis.');
    mrAll     : ShowMessage('Das Modalfenster hat mrAll als Ergebnis.');
    mrNoToAll : ShowMessage('Das Modalfenster hat mrNoToAll als Ergebnis.');
    mrYesToAll : ShowMessage('Das Modalfenster hat mrYesToAll als Ergebnis.');
  else
    {mrNone} ShowMessage('Das Modalfenster hat mrNone als Ergebnis.');
  end;
end;
Form2
Delphi-Quellcode:
procedure TModalForm.Button1Click(Sender: TObject);
begin
  //ohne Close passiert nichts
end;

procedure TModalForm.Button2Click(Sender: TObject);
begin
  Close; //mit Close wird das Fenster geschlossen. ModalResult = mrCancel
  //Close setzt das Fenster von sich aus automatisch auf mrCancel
end;

procedure TModalForm.Button3Click(Sender: TObject);
begin
  ModalResult := mrOk;
  //Close; //Close ist nicht nötig. ModalResult = mrOk
end;

procedure TModalForm.Button4Click(Sender: TObject);
begin
  ModalResult := mrCancel;
  //Close; //Close ist nicht nötig. ModalResult = mrCancel
end;

procedure TModalForm.Button5Click(Sender: TObject);
begin
  ModalResult := mrNone; //Bringt nichts. mrNone bewirkt kein Schleißen
  Close; //Close ist nötig. ModalResult = mrCancel
end;

procedure TModalForm.Button6Click(Sender: TObject);
begin
  ModalResult := mrYes;
  //Close; //Close ist nicht nötig. ModalResult = mrYes
end;

EWeiss 22. Mai 2015 21:23

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Aber wie kann ein ShowModal diesen Fehler verursachen?
Könnte daran liegen das Die HauptForm mehr oder weniger das Parent bzw. "GW_OWNER" der Modalen Form ist.
Wenn du also versuchst aus der HauptForm das modale Fenster zu schließen zerschießt du quasi das Parent Fenster (Hauptform) selbst.

Zumindest kenne ich das aus VB Zeiten nicht anders.
Code:
Form2.Show vbModal, Me
Ist eine der gründe warum die Eingabe in der Hauptform durch das modale Fenster gesperrt wird.

gruss

Popov 22. Mai 2015 21:25

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Übrigens, wie jede Komponente hat TForm auch die Eigenschaft Enabled. Das kann man auf False setzten, dann reagiert das Fenster aber gar nicht mehr. Eine bessere Möglich wäre aber einfach auf das Formular ein TPanel zu setzten und das False zu stellen. Die Komponenten legst du auf das Panel. Ist Panel nicht Enabled, reagiert keine Komponente drauf.

Perlsau 22. Mai 2015 21:26

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von AlexII (Beitrag 1302685)
Was ist der Unterschied zwischen Frame und nem Form, das nicht modal aufgerufen wird?

Ein Frame kannst du nur auf einem Form anzeigen. Du erstellst ein Frame (Neu -> Frame), machst dein Zeugs drauf (Buttons. Labels etc.) und nimmst die Unit des Frames in die Uses-Klauses deiner Mainform auf. In selbiger erstellst du eine Variable vom Typ des Frames und erzeugst eine Instanz des Frames (Create), wenn du ihn benötigst oder auch gleich beim Programmstart. Im ersten Fall zerstörst du den Frame, wenn du ihn nicht mehr benötigst (Free), im zweiten Fall in OnDestroy deines Hauptfensters. Aber bevor ich das lang und breit erkläre, ist das schneller programmiert.

Zitat:

Zitat von Popov (Beitrag 1302690)
Übrigens, wie jede Komponente hat TForm auch die Eigenschaft Enabled. Das kann man auf False setzten, dann reagiert das Fenster aber gar nicht mehr. Eine bessere Möglich wäre aber einfach auf das Formular ein TPanel zu setzten und das False zu stellen. Die Komponenten legst du auf das Panel. Ist Panel nicht Enabled, reagiert keine Komponente drauf.

Das ist natürlich die allereinfachste Idee und hat somit alle Aussichten zum Favoriten. :thumb:
Um die Menüs, falls vorhanden, muß er sich dann extra kümmern. Wenn er keine ActionList hat, beschränkt sich das darauf, die Hauptmenü-Einträge zu disablen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz