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/)
-   -   Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierbar (https://www.delphipraxis.net/183948-modales-fenster-nach-minimieren-taskleiste-nicht-mehr-durch-klicken-aktivierbar.html)

Peter Müller 15. Feb 2015 23:02

Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierbar
 
Hallo zusammen,

wenn ich ein modales Fenster im Programm anzeige und das Programm wird minimiert oder von einem anderen Programm überdeckt, dann kann ich es durch Anklicken in der Taskleiste nicht mehr anzeigen. Beim Klicken passiert einfach überhaupt nichts. Verwende Delphi XE2, das Projekt wurde von Delphi 2(!) übernommen. Hat mir bitte jemand eine Idee?

Folgenden Lösungsvorschlag aus dem Internet habe ich bereits ausprobiert, dann muss man allerdings bis zu 3 Mal in der Taskleiste klicken, bis das Fenster wieder da ist:
Delphi-Quellcode:
const
  WM_REENABLE = WM_USER + $100;

  procedure WMEnable(var Message: TWMEnable); Message WM_ENABLE;
  procedure WMReenable(var Message: TMessage); Message WM_REENABLE;

procedure TForm1.WMEnable(var Message: TWMEnable);
begin
  if not Message.Enabled then PostMessage(Self.Handle, WM_REENABLE, 1, 0);
end;

procedure TForm1.WMReenable(var Message: TMessage);
begin
  EnableWindow(Self.Handle, True);
end;
Vielen Dank

Peter

Peter Müller 22. Feb 2015 21:43

AW: Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierba
 
Hallo zusammen,

habe noch ein bisschen experimentiert:
Das Problem tritt auch bei einem komplett neuen Projekt mit nur zwei Formularen auf, von denen eins mit ShowModal angezeigt wird, nicht jedoch, wenn ich z. B. die Druckereinrichtung über TPrinterSetupDialog oder einen TOpenDialog öffne. Bei diesen reicht einmaliges Klicken in der Taskleiste.

Was machen denn die Systemdialoge anders?

Vielen Dank

Peter

Peter Müller 22. Feb 2015 22:48

AW: Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierba
 
Hallo zusammen,

hab inzwischen herausgefunden, wie es funktioniert. Falls es mal jemand brauchen sollte, hier die Lösung:

Form1 ist das Hauptformular, Form2 das modale Formular. Man nehme eine TApplicationEvents-Komponente und den nachfolgenden Kode unter ApplicationEvents1Activate.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Dialogs, Vcl.Forms, Vcl.StdCtrls, Vcl.AppEvnts;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    ApplicationEvents1: TApplicationEvents;
    procedure Button1Click(Sender: TObject);
    procedure ApplicationEvents1Activate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Form2: TForm;

implementation

{$R *.dfm}

uses PassWord;

procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
  if (Form2 <> Nil) and (fsModal in Form2.FormState) and Form2.Showing then Form2.BringToFront;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TPasswordDlg.Create(Self);
  Form2.Parent := Self;
  if Form2.ShowModal = mrOK then begin
// mache was...
  end;
end;

end.
Viele Grüße

Peter

Sir Rufo 22. Feb 2015 22:58

AW: Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierba
 
Delphi-Quellcode:
Form2.Parent := Self;
ist hier der eigentliche Auslöser, aber da du ja den Code erst jetzt hier zeigst, konnte dir auch niemand helfen.

Anyway, du hast ja eine Lösung, obwohl du dies mit dem Parent setzen nochmals überdenken solltest.

BTW: Bei den System-Dialogen wird der Parent nicht gesetzt

Luckie 23. Feb 2015 01:28

AW: Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierba
 
Aber modale Fenster benötigen ein Fensterhandle, damit Windows weiß zu welchem Fenster das modale Fenster modal ein soll. Also wird doch so etwas wie ein Parent gesetzt. Dem zu folge müsste es nicht heißen:
Delphi-Quellcode:
Form2.Parent := Form1;
?

jaenicke 23. Feb 2015 05:50

AW: Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierba
 
Wenn das Projekt von Delphi 2 übernommen wurde, fehlt da schlicht
Delphi-Quellcode:
Application.MainFormOnTaskbar := True;
im Projektquelltext. Das wird bei neuen Projekten standardmäßig aktiviert. Vergleiche einfach einmal den Projektquelltext in der .dpr (Strg + V auf das Projekt in der Projektverwaltung) mit dem eines neuen Projekts.
Dann funktioniert es eigentlich ohne Verrenkungen.

Sir Rufo 23. Feb 2015 06:22

AW: Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierba
 
Zitat:

Zitat von Luckie (Beitrag 1291045)
Aber modale Fenster benötigen ein Fensterhandle, damit Windows weiß zu welchem Fenster das modale Fenster modal ein soll. Also wird doch so etwas wie ein Parent gesetzt. Dem zu folge müsste es nicht heißen:
Delphi-Quellcode:
Form2.Parent := Form1;
?

Da die Modalität durch Delphi selber geschieht (eine tolle Schleife mit
Delphi-Quellcode:
Application.ProcessMessages
,...) ist es eh Schnurz.

Und nein, bitte nicht
Delphi-Quellcode:
Form2.Parent := Form1;
mit der globalen Form-Variablen
Delphi-Quellcode:
Form1
innerhalb der Klassen-Methoden von
Delphi-Quellcode:
TForm1
arbeiten.

Luckie 23. Feb 2015 09:44

AW: Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierba
 
Ups. Self wäre natürlich richtig gewesen.

Peter Müller 23. Feb 2015 16:49

AW: Modales Fenster nach Minimieren in Taskleiste nicht mehr durch Klicken aktivierba
 
Zitat:

Zitat von jaenicke (Beitrag 1291048)
Wenn das Projekt von Delphi 2 übernommen wurde, fehlt da schlicht
Delphi-Quellcode:
Application.MainFormOnTaskbar := True;
im Projektquelltext. Das wird bei neuen Projekten standardmäßig aktiviert. Vergleiche einfach einmal den Projektquelltext in der .dpr (Strg + V auf das Projekt in der Projektverwaltung) mit dem eines neuen Projekts.
Dann funktioniert es eigentlich ohne Verrenkungen.

Das hatte Delphi XE2 bereits selbst eingebaut, da hatte ich zuerst danach geschaut.

Danke an Sir Rufo für den Tipp, dass ich den Parent einfach nicht setzen soll, dann funktioniert es auch ganz ohne Tricks mit Vista, 7 usw. :-D

Peter


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