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