Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Neues Formular "quasi-modal" öffnen (https://www.delphipraxis.net/172248-neues-formular-quasi-modal-oeffnen.html)

sundance 20. Dez 2012 15:02

Neues Formular "quasi-modal" öffnen
 
Entschuldigung für den komischen Titel; es geht um folgendes:
Von meinem MainForm aus möchte ich gerne ein weiteres Formular (ChildForm) anzeigen, und zwar derart, dass ChildForm den Fokus bekommt und MainForm erst nach Schließen von ChildForm "weiterläuft".
Üblicherweise mache ich das einfach, indem ich "ChildForm.ShowModal" aufrufe.

Jetzt stellt sich mir die Aufgabe, dass (bei geöffnetem ChildForm) das Hauptfenster trotzdem vom Anwender bewegt werden kann, um z.B. im Explorerfenster dahinter etwas nachzusehen. Das geht mit ShowModal leider nicht. Wenn ich aber stattdessen "ChildForm.Show" aufrufe, wird es natürlich angezeigt, aber die Programmausführung läuft sofort mit der Anweisung nach "Show" weiter und wartet nicht, bis ich ChildForm geschlossen haben...

Kennt jemand dafür eine praktikable Lösung?

.sundance.

Volker Z. 20. Dez 2012 15:09

AW: Neues Formular "quasi-modal" öffnen
 
Vielleicht hilft ja FormStyle := fsStayOnTop

Gruß

Jumpy 20. Dez 2012 15:13

AW: Neues Formular "quasi-modal" öffnen
 
K.A. ob das praktikabel ist.
Mainform eine boolean Variabe verpassen.
Und eine Prozedur, die diese auf False setzt.
Variable auf True setzen.
2tes From erzeugen und einem Event, z.B. On Close, diese Prozedur zuweisen.
Form.Show.
Dann eine Endlos-Schleife.
while MyBool do
Application.ProcessMessages;

Dazu sollten natürlich auch alle Button usw. vom Main-Form deaktiviert werden, so dass es nur noch bewegt werden kann.

Bummi 20. Dez 2012 15:26

AW: Neues Formular "quasi-modal" öffnen
 
Wenn Du es mit es beispielsweise mit (self) als Owner erzeugst, kannst Du mit

Delphi-Quellcode:
procedure TPseudoMod.FormShow(Sender: TObject);
begin
  EnableWindow(TForm(Owner).Handle,true);
end;
das aufrufende Fenster bedienbar machen, Du müsstest Dir nur einen Mechanismus ausdenken, dass von dort nichts ungewolltes gestartet werden kann.

sundance 20. Dez 2012 16:39

AW: Neues Formular "quasi-modal" öffnen
 
@Jumpy:
Das könnte funktionieren! Ich werde mal testen, inwiefern die "Dauerschleife" unnötige Prozessorlast erzeugt.
(Sollte aber eigentlich nicht der Fall sein, denn ein "leerlaufendes" Delphiprogramm läuft ja auch in der Message-Endlosschleife...)


@Bummy:
Aktuell werden die beiden Forms in der DPR-Datei erzeugt:
Delphi-Quellcode:
program MKVX;

uses
  Forms,
  MyMainForm in 'MyMainForm.pas' {MainForm},
  CoverForm in 'CoverForm.pas' {FormCover}; // <--- ChildForm

{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.CreateForm(TFormCover, FormCover);
  Application.Run;
end.
Wenn ich dich richtig verstehe, müßte ich die CreateForm für das ChildWindow in die MainForm verlagern?

Kalakmul 20. Dez 2012 17:06

AW: Neues Formular "quasi-modal" öffnen
 
Ist das Problem nicht mit bordeigenen Mitteln von Windows lösbar?

Mit "Desktop anzeigen" (Windows Schnellstartleiste; unter Win7 unten rechts in der Taskleiste) hat man wieder einen bedienbaren Desktop und kann z. B. etwas im Explorer nachschauen.

Mit ALT-TAB kann man dann zwischen der betreffenden Anwendung und dem Explorer wechseln.

Ich weiß ja nicht, ob man in deiner Anwendung aus dem Explorer etwas sehr schlecht zu merkendes übertragen muss, sodass unbedingt beide Fenster nebeneinander stehen müssen. Dann geht es so natürlich nicht.

Bummi 20. Dez 2012 17:10

AW: Neues Formular "quasi-modal" öffnen
 
Nein, das Modal angezeigte Fenster müsste nur das Handle Deines Aufrufformulars kennen z.B.

Delphi-Quellcode:
procedure TPseudoMod.FormShow(Sender: TObject);
begin
  EnableWindow(Mainform.Handle,true);
end;
Du kannst auch eine Property für das Handle in das Form einbauen und diese vor dem Showmodal setzen, oder OnShow auf eine eigene Methode verbiegen, oder .....


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 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