Установка формы в WindowState = wsMaximized
иногда приведет к максимизации формы, но не:
Долгосрочная ошибка: это вопрос, который я впервые задал в группах новостей Borland в 2003 году:
а затем снова в 2006 году:
а затем снова в 2008 году:
Кто-то спросил его на форумах Embarcadero в 2012 году:
Теперь пришло время перенести 18-летнюю ошибку в Stackoverflow. Возможно, кто-то, наконец, выяснил обходное решение.
Шаги по воспроизведению:
Мои сообщения содержали полдюжины отказов, но самый легкий из них:
-
Отпустите
Label
иEdit
в форме: -
Добавьте
OnEnter
событиеTEdit
:procedure TForm1.Edit1Enter(Sender: TObject); begin Label1.Font.Style := Label1.Font.Style + [fsBold]; end;
-
и задайте форму:
-
WindowState
wsMaximized -
AutoScroll
до False
-
И bazinga, терпит неудачу.
Один из других шагов от публикации в 2008 году:
- Создайте новое приложение и форму.
- Задайте форму для максимизации (WindowState = wsMaximized) во время разработки.
- Отбросить элемент управления ListView в форме
Во время OnShow добавьте 20 пустых элементов в список:
procedure TForm1.FormShow(Sender: TObject); var i: Integer; begin for i := 1 to 20 do ListView1.Items.Add; end;
Задайте для свойства AutoScroll формы значение false (AutoScroll = False) во время разработки
Конечно, то, что мне не нужно, "исправлено в версии n
RadStudio. Просто используйте это". Я ищу фактическое исправление (если оно есть); который может включать в себя цитирование соответствующих изменений в источнике VCL, когда CodeGear наконец-то его исправил. (Если он даже фиксирован).
Примечание: Изменение Position
от poDesigned ни к чему еще не исправляет.
Обход
Ужасный, уродливый, ужасный, отвратительный, обходной путь, который я использовал, заключался в том, чтобы запустить таймер во время OnShow
, а затем, когда срабатывает таймер, увеличьте форму:
procedure TForm1.tmrVclMaximizeHackTimer(Sender: TObject);
begin
Self.WindowState := wsMaximized;
end;
Я позже улучшил этот хак, чтобы опубликовать сообщение во время OnShow
; который по существу совпадает с сообщением таймера, без использования таймера:
const
WM_MaximizeWindow = WM_APP + $03;
procedure TForm1.FormShow(Sender: TObject);
begin
if (Self.WindowState = wsMaximized) then
begin
Self.WindowState := wsNormal;
PostMessage(Self.Handle, WM_MaximizeWindow , 0, 0);
end;
end;
private
procedure WMMaximizeWindow(var Message: TMessage); message WM_MaximizeWindow;
procedure TForm1.WMMaximizeWindow(var Message: TMessage);
begin
Self.WindowState := wsMaximized;
end;
Иногда я придумываю событие OnAfterShow
, которое Delphi никогда не делал:
const
WM_AfterShow = WM_APP + $02;
procedure TForm1.FormShow(Sender: TObject);
begin
PostMessage(Self.Handle, WM_AfterShow, 0, 0);
if (Self.WindowState = wsMaximized) then
begin
Self.WindowState := wsNormal;
FMaximizeNeeded := True;
end;
end;
private
procedure WMAfterShow(var Message: TMessage); message WM_AfterShow;
procedure TForm1.WMAfterShow(var Message: TMessage);
begin
if FMaximizeNeeded then
begin
FMaximizeNeeded := False;
Self.WindowState := wsMaximized;
end;
end;
Но никакие хаки не лучше хаков.