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 Fenser ON TOP aber nicht über taskbar? (https://www.delphipraxis.net/97879-fenser-top-aber-nicht-ueber-taskbar.html)

gandime 17. Aug 2007 19:33


Fenser ON TOP aber nicht über taskbar?
 
Hi,
wie lasse ich mein Fenser immer im Vordergrung sein ohne das es über meiner Taskleiste ist und wie mache ich das wieder rückgängig?
normal mache ich es mit folgender Funktion:

Delphi-Quellcode:
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
mfg
gandime

marabu 17. Aug 2007 20:37

Re: Fenser ON TOP aber nicht über taskbar?
 
Hallo,

schau dir das mal an:

Delphi-Quellcode:
unit DemoFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type
  TDemoForm = class(TForm)
    StatusBar: TStatusBar;
    procedure FormCreate(Sender: TObject);
  private
    procedure UpdateConstraints;
    procedure WMSettingChange(var Msg: TMessage); message WM_SETTINGCHANGE;
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

procedure TDemoForm.UpdateConstraints;
begin
  with Constraints, Screen do
  begin
    MaxHeight := WorkAreaHeight;
    MaxWidth := WorkAreaWidth;
  end;
end;

procedure TDemoForm.FormCreate(Sender: TObject);
begin
  UpdateConstraints;
end;

procedure TDemoForm.WMSettingChange(var Msg: TMessage);
begin
  UpdateConstraints;
end;

end.
So kannst du zur Laufzeit auf AppBars reagieren.

Grüße vom marabu

Nachtrag: Ich sehe du hast eine neue Delphi-Version, da kannst du auch einfach mit TApplicationEvents.OnSettingChange arbeiten.

gandime 18. Aug 2007 09:02

Re: Fenser ON TOP aber nicht über taskbar?
 
ich habe es jetzt erstmal mit application.OnSettingChange ausprobiert aber das funktioniert nicht, da die Procedure nicht ausgelöst wird oder hab ich nen Fehler gemacht?
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  application.OnSettingChange:=UpdateConstraints;
end;

procedure TForm1.UpdateConstraints(Sender: TObject;Flag:integer;const Section:string;var result:integer);
begin
  with Constraints, Screen do
  begin
    MaxHeight := WorkAreaHeight;
    MaxWidth := WorkAreaWidth;
  end;
end;
edit: das funktioniert genau so wenig mit deinem anderen Beispiel!

marabu 18. Aug 2007 09:34

Re: Fenser ON TOP aber nicht über taskbar?
 
Hallo,

der von mir gezeigte Beispielcode wurde von mir getestet und funktioniert. Er reagiert beispielsweise auf die Umstellung der Taskleisteneigenschaft "Taskleiste automatisch ausblenden". Wird die Form dann maximiert, so wird der von der Taskleiste belegte Bereich ausgespart. Der Unterschied zu dem von dir gezeigten Code ist, dass dein Code die Verhältnisse beim Start nicht auswertet, sondern erst bei einer später auftretenden Änderung.

Freundliche Grüße

gandime 18. Aug 2007 09:40

Re: Fenser ON TOP aber nicht über taskbar?
 
Liste der Anhänge anzeigen (Anzahl: 1)
achso wir beide meinen verschiedene Dinge ich versuche das zu verhindern:

marabu 18. Aug 2007 09:57

Re: Fenser ON TOP aber nicht über taskbar?
 
Größenänderungen über den Rahmen der Form oder Verschiebungen behandelst du im Ereignis OnCanResize().

gandime 18. Aug 2007 10:01

Re: Fenser ON TOP aber nicht über taskbar?
 
ich möchte die größe verändern können und es verschieben können es soll blos hinter der Taskleiste sein

marabu 18. Aug 2007 18:47

Re: Fenser ON TOP aber nicht über taskbar?
 
Hallo,

wenn du ein VCL-Fenster im Vordergrund haben möchtest, dann kannst du einfach seinen FormStyle auf fsStayOnTop setzen. Es passiert dann in etwa das gleiche wie bei deinem Aufruf von SetWindowPos(). Selbst wenn du deine Taskleiste so konfiguriert hast, dass sie immer im Vordergrund sein soll, wird aber dein Fenster davor liegen, sobald du es aktivierst. Ein TopMost-Fenster liegt vor allen NonTopMost-Fenstern, aber wenn es mehrere TopMost-Fenster gibt, dann haben auch diese Fenster eine Z-Ordnung. Microsoft meint dazu im PSDK mehr oder weniger deutlich, dass die Z-Ordnung vom Benutzer gesteuert werden soll. Warum soll dein Programm die Kontrolle übernehmen? Überhaupt nicht anrüchig ist das natürlich, wenn dein Programm selbst ein AppBar ist.

Nochmal im Klartext: Solange dein TopMost-Fenster aktiv ist, wird es vor der Taskleiste gezeichnet. Mein Code-Beispiel hilft da eigentlich überhaupt nicht. Die VCL wertet die Nachricht WM_SETTINGCHANGE selbst aus und die Constraints spielen nur bei nicht maximiertem Fenster eine Rolle.

Freundliche Grüße

gandime 18. Aug 2007 19:04

Re: Fenser ON TOP aber nicht über taskbar?
 
hmm ok danke dann muss ich mich woh damit abfinden
trotzdem danke


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