Fehlerkorrektur im Popup-Fenster Grundgerüst | BVA-System

Fehlerkorrektur im Popup-Fenster Grundgerüst

Verfasst am: Donnerstag, 22. Aug. 2013 um 22:46

Vor einiger Zeit veröffentlichte ich einen Artikel, in dem ich beschrieb, wie man in Delphi ein Popupfenster implementiert. Gestern musste ich, als ich ein Popupfenster nicht auf dem Hauptdialog der Anwendung einbinden wollte feststellen, das sich in meinem Grundgerüst ein Fehler eingeschlichen hat. 

In dem WMACTIVATE Event wird eine Windowsbotschaft versendet, so das das bisher aktive Fenster auch weiterhin als aktives Fenster dargestellt wird. Der Fehler daran war, das ich die Botschaft immer an das Hauptfenster (Application.MainForm.Handle) der Anwendung versendet habe. Korrekter Weise müsste es an das Formular gesendet werden, von dem aus das Popup geöffnet wurde. Das korrigierte WMACTIVATE Event sieht wie folgt aus:

 delphi | 
 
 Quellcode kopieren |
?

01
procedure TfrmBVAImageInfo.WmActivate(var Msg: TWMActivate);
02
var Parent:TCustomForm;
03
begin
04
 if FOwner <> nil then begin
05
  Parent := GetParentForm(TControl(FOwner));
06
  if (Parent <> nil) and (not(csDestroying in Parent.ComponentState)) then begin
07
   SendMessage(Parent.Handle, WM_NCACTIVATE, Ord(Msg.Active <> WA_INACTIVE), 0);
08
  end;
09
 end;
10
11
 inherited;
12
end;

Außerdem musste ich noch folgenden Code in dem Construktor des Popup-Fensters einfügen, damit das Popup-Fenster auch immer vor allen anderen Dialogen angezeigt wird.

 delphi | 
 
 Quellcode kopieren |
?

1
constructor TfrmBVAImageInfo.Create(aOwner: TComponent);
2
begin
3
 inherited;
4
 FOwner                   := aOwner;
5
6
 SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW or WS_EX_TOPMOST);
7
 SetWindowLong(Handle, GWL_HWNDPARENT, GetDesktopWindow);
8
end;

Tags: , ,

Einen Kommentar schreiben