максимизацией окна. То есть, если окно развёрнуто, я хочу при выходе сохранить его старую позицию и потом восстановить её.
Для этого я делаю так. В FormClose (в Destroy немного ломается эта схема) пишу:
WinSizeMax := WindowState = wsMaximized;
if WinSizeMax then WindowState := wsNormal; // иначе Windows и Height содержат не те значения
WinSizeX := Width;
WinSizeY := Height;
В FormShow (чтобы если чел отменит разворачивание, размер был нормальным):
Width := WinSizeX;
Height := WinSizeY;
И в FormActivate:
if WinSizeMax then
begin
WindowState := wsMaximized;
WinSizeMax := False;
end;
Почему в FormActivate? Потому что иначе окно съезжает в сторону, ибо изначально Position = poScreenCenter, а при установке положения окна (если такая опция включена), меняется на poDesigned.
Короче, это какая-то черезжопная система. Как минимум потому, что окно сначала появляется неразвёрнутое, а потом разворачивается (и это заметно). Благо при закрытии сворачивания до обычного размера визуально не заметно (хотя, может, это только у меня так).
Как это можно реализовать нормально?
Может перехватить виндовые сообщения? и записывать последние данные о размере окна? Например procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
Да в принципе так и надо, только работай через BoundsRect
Чтобы не деркать два раза изменение размеров и соответствующий вызов SetWindowPos
Обсуждают сегодня