[Lazarus] nonlcl basic issue: is codetools LCL dependent?

Hans-Peter Diettrich DrDiettrich1 at aol.com
Sat Jun 28 09:16:51 CEST 2014


Giuliano Colla schrieb:

>       Whenever you need a form to "stay on top" you never know if it'll
>       work or not. For Gtk2, it did work on Lazarus 1.0.8, but it
>       stopped working since Lazarus 1.1. This means that a user may lose
>       an alarm which pops up, because he inadvertently touched the
>       larger form.

I just got some information about this issue, when I encounterd z-order 
problems with a Delphi XE application. Here's what Peter Below wrote, 
most LCL developers will be able to read this:

 >>
In D7 war das Application-Window (nicht sichtbar) der API-Parent für
alle Forms, d. h. sie waren alle "Geschwister" in der
Fenster-Hierarchie. Das Taskbar-Button der Anwendung gehörte dem
Application-Window.
Der API-Parent bestimmt die Z-Ordnung der Fenster und Windows sorgt
dafür, dass ein Fenster immer über seinem API-Parent in der Z-Ordnung
liegt.

Seit D2009 ist das Mainform standardmäßig der API-Parent für alle
anderen Forms und der Taskbar-Button gehört zum Mainform. Das war
notwendig, um Anzeigeprobleme auf dem Vista Aero-Desktop zu vermeiden.
Damit liegen aber auch alle anderen Fenster in der Z-Ordnung über dem
Mainform.
Application.MainformOntaskbar := false geht zum Verhalten von D7
zurück, mit den damit verbundenen Problemen auf dem Aero-Desktop
(betrifft wohl diese Mini-Fensteransicht, die man kriegt, wenn die Maus
über einem Taskbar-Button schwebt).

Es gibt eine Alternative: wenn man ein spezielles Form aus dieser
Z-Ordung lösen will kann man seine CreateParams-Methode überschreiben.

   inherited;
   params.WndParent := 0;

Damit bekommt man ein Fenster ohne API-Parent, das also in der
Z-Ordnung von den anderen Fenstern der Anwendung losgelöst ist. Wenn
man statt 0 Application.Handle verwendet sollte das Fenster auf der
gleichen Ebene der Fensterhierarchie landen wie das Mainform. In beiden
Fällen kann es sinnvoll sein, dem Fenster einen eigenen Taskbar-Button
zu verschaffen. Dazu kommt folgende Zeile in die überschriebene
CreateParams-Methode:

   params.ExStyle := params.ExStyle  or WS_EX_APPWINDOW;


-- Peter Below
<<





More information about the Lazarus mailing list