Définition d'un formulaire d' WindowState = wsMaximized
peut parfois entraîner le formulaire pour être maximisée, mais non:
Long-temps bug: c'est une question que j'ai d'abord demandé dans le Borland groupes de discussion en 2003:
et puis à nouveau en 2006:
et puis de nouveau en 2008:
Quelqu'un a demandé sur l'Embarcadero forums en 2012:
Maintenant, il est temps de port de 18 ans d'un bug de Stackoverflow. Peut-être que quelqu'un a enfin trouvé une solution de contournement.
Étapes pour reproduire:
Mes messages contenait une demi-douzaine de modes de défaillance, mais le plus simple est:
-
Déposez un
Label
etEdit
sur un formulaire: -
Ajouter un
OnEnter
événement pour l'TEdit
:procedure TForm1.Edit1Enter(Sender: TObject); begin Label1.Font.Style := Label1.Font.Style + [fsBold]; end;
-
et de définir la forme:
-
WindowState
de wsMaximized -
AutoScroll
de Faux
-
Et bazinga, échoue.
L'une des autres étapes de l'2008 post:
- Créez une nouvelle application et une forme.
- Définir la forme de maximisée (WindowState = wsMaximized) au moment de la conception.
- Déposez un contrôle ListView sur la forme
Au cours de OnShow, ajouter 20 éléments vides à l'affichage de la liste:
procedure TForm1.FormShow(Sender: TObject); var i: Integer; begin for i := 1 to 20 do ListView1.Items.Add; end;
Définir la forme de l'AutoScroll valeur false à la propriété (AutoScroll = False) au moment de la conception
Bien sûr que je suis de ne pas avoir "corrigé dans la version n
de RadStudio. L'utiliser". Je suis à la recherche d'une véritable correction (si il y en a un); ce qui pourrait inclure citant les modifications apportées à la CLASSIFICATION de la source lors de CodeGear finalement fait le fixer. (Si elle est encore fixé).
Remarque: Évolution des Position
de poDesigned à rien d'autre ne résout pas le problème.
Solution de contournement
Un horrible, horrible, horrible, dégoûtant, solution de contournement que j'avais utilisé était de démarrer une minuterie pendant OnShow
, et puis quand le compte à rebours incendies, de maximiser la forme:
procedure TForm1.tmrVclMaximizeHackTimer(Sender: TObject);
begin
Self.WindowState := wsMaximized;
end;
Plus tard, j'ai amélioré ce hack pour poster un message lors de la OnShow
; ce qui est essentiellement le même comme un message de la minuterie, sans avoir à utiliser un timer:
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;
Parfois j'invente l' OnAfterShow
événement que Delphi n'a jamais fait:
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;
Mais pas de hacks sont mieux que les hacks.