Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#4

AW: Reaktion auf Positionsänderung nach Änderung der Bildschirmauflösung

  Alt 16. Mai 2020, 19:36
Also ich komme da auf keinen grünen Zweig. Selbst mit Debug DCUs und Durchsteppen durch die Controls- und Forms-Units ist es mir nicht gelungen, die Ursache oder zumindest den Auslöser zu finden.

Daher gehe ich jetzt den pragmatischen Weg und benutze das Application.OnIdle-Ereignis:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDblClick(Sender: TObject);
  private
    procedure WMDisplayChange(var Msg: TWMDisplayChange); message WM_DISPLAYCHANGE;
    procedure SetPosition;
    procedure OnIdle(Sender: TObject; var Done: Boolean);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMDisplayChange(var Msg: TWMDisplayChange);
begin
    inherited;
    Application.OnIdle:= Self.OnIdle;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    SetPosition;
end;

procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);
begin
    Application.OnIdle:= nil;
    SetPosition;
end;

procedure TForm1.SetPosition;
var
  Ltop, Lleft: integer;
begin
    Lleft:= (Screen.Width - Self.Width) div 2;
    Ltop:= Screen.Height - Self.Height;
    Self.SetBounds(Lleft, Ltop, Self.Width, Self.Height);
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
    SetPosition;
end;

end.
Application.OnIdle ist offenbar eines, das erst ausgelöst wird, wenn Delphi alle durch die Auflösungsänderung verschickten/erzeugten Nachrichten bearbeitet hat. Jedenfalls besser, als einen Timer dafür zu missbrauchen...

Falls jemand noch (bessere) Ideen hat, bin ich dafür offen.

Grüße
Dalai
  Mit Zitat antworten Zitat