Dans Windows 7 X64, statusBar ne montre pas de texte pour les panneaux à partir du 11 correctement
-
25-10-2019 - |
Question
Summarization:
(1) Ceci est très susceptible d'être un bug. Cependant, je ne peux pas dire avec certitude si elle est plus liée à 64bit OS ou VCL, ou wrapper MFC. S'il vous plaît vérifier les réponses et les commentaires ci-dessous des experts Delphi.
(2) Solution pour moi:
une. La situation est que j'ai six
pairs
valeur de clé pour afficher dans la barre d'état. Les valeurs seront modifiées en temps d'exécution.
b. Il semble que je ne peux pas set text
plus de panneaux 10
.
c. À cet égard, je vais utiliser les appels six
de set text
pour les valeurs et les appels de l'utilisation two
pour set text
pour les deux dernières touches. Ainsi, je ne dois pas dépasser la limite de 10
.
ré. Afin de rendre le travail de set text
, je dois fournir un texte différent qu'il a déjà.
e. Exemple de code peut ainsi être décrit comme suit:
// Designtime
stat1.Panels[0].Text := 'Key1'
stat1.Panels[2].Text := 'Key2'
stat1.Panels[4].Text := 'Key3'
stat1.Panels[6].Text := 'Key4'
stat1.Panels[8].Text := 'Key5__'
stat1.Panels[10].Text := 'Key6__'
// runtime
stat1.Panels[1].Text := 'Value1'
stat1.Panels[3].Text := 'Value2'
stat1.Panels[5].Text := 'Value3'
stat1.Panels[6].Text := 'Value4'
stat1.Panels[9].Text := 'Value5'
stat1.Panels[11].Text := 'Value6'
stat1.Panels[8].Text := 'Key5'
stat1.Panels[10].Text := 'Key6'
=============================================== ===================
Dans mon Windows 7 X64, la barre d'état ne montre pas de texte pour les panneaux à partir du 11 correctement.
(1)
Nouveau projet d'application VCL vide without
enregistrer, si je mets le texte du 11 panneau d'état au moment de la conception, le texte ne sera pas affiché du tout au moment de l'exécution. (Voir les photos ci-jointes).
(2) Si je l'enregistre et le rouvrir, le texte sera également pas affiché dans le temps de conception.
(3)
Si je définir le texte lors de l'exécution, le texte sera affiché que lorsque le nouveau texte est différent de l'ancien. Dites le texte pour le panneau 11 est réglé sur 'try'
au moment de la conception:
Self.stat1.Panels[10].Text := 'try'; // 'try' is not shown
self.stat1.Panels[10].Text := 'try_'; // 'try_' is shown
(4) Ce comportement ne se produit que sur mon Windows 7 X64, mais pas sur mon Windows XP.
(5) Je pense que les mêmes allpies de comportement à toutes les versions Delphi.
(6) Il semble que le comportement est plus lié à la version de Windows que de Delphi. Je veux dire, la même application de l'échantillon ci-dessus montre le comportement sur Windows 7, mais pas sous Windows XP.
(7) Un exemple de fichier DFM est vidé comme ci-dessous:
object Form3: TForm3
Left = 0
Top = 0
Caption = 'Form3'
ClientHeight = 202
ClientWidth = 731
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object stat1: TStatusBar
Left = 0
Top = 183
Width = 731
Height = 19
Panels = <
item
Text = '0'
Width = 50
end
item
Text = '1'
Width = 50
end
item
Text = '2'
Width = 50
end
item
Text = '3'
Width = 50
end
item
Text = '4'
Width = 50
end
item
Text = '5'
Width = 50
end
item
Text = '6'
Width = 50
end
item
Text = '7'
Width = 50
end
item
Text = '8'
Width = 50
end
item
Text = '9'
Width = 50
end
item
Text = '10'
Width = 50
end
item
Text = '11'
Width = 50
end>
ExplicitLeft = 248
ExplicitTop = 152
ExplicitWidth = 0
end
object btn1: TButton
Left = 152
Top = 40
Width = 433
Height = 89
Caption = 'btn1'
TabOrder = 1
OnClick = btn1Click
end
end
(8)
Exemple d'images:
pourrait-il quelqu'un aide à commenter la raison possible? Toute suggestion est appréciée!
La solution
Je voulais dire "Ça marche pour moi, sur Windows 7, 64 bits, avec delphi XE." En fait, il a fait le travail, la première fois que je laissai tomber sur la forme, tout fonctionnait très bien. Et je pensais, que vous faites quelque chose de mal. Puis il m'a frappé, après la deuxième fois, je l'ai rouverte le formulaire.
Maintenant, il échoue toujours.
Je pense que vous devriez commencer par un nouveau projet vierge comme je l'ai fait, et faire juste une chose. Cela prend toutes les autres choses que vous avez sur le code, qui vous la pagaille dans.
J'appelle cela le test « fichier nouveau ». Si vous ne pouvez pas quelque chose de se reproduire dans une nouvelle application, qui ne contient que le code ou les contrôles que vous allez pas sûr, ne prenez pas la peine de demander à personne d'autre à faire pour vous.
Voici mon essai initial, il a travaillé:
La deuxième fois que je réouvert la forme, il a échoué à designtime, de la même manière, il a échoué pour David H.
Vider les largeurs des panneaux d'une note comme suit:
procedure TForm3.DumpWidths;
var
t:Integer;
begin
for t := 0 to StatusBar1.Panels.Count-1 do begin
Memo1.Lines.Add( '#'+IntToStr(t)+
' width '+
IntToStr(StatusBar1.Panels.Items[t].Width));
end;
end;
La barre d'état VCL encapsule un contrôle MS Common, qui a soit un bug, ou la VCL est enveloppait mal. Étant donné que cela ne se produit pas sur XP, je pense que vous avez trouvé un nouveau contrôles MS Common bogue dans Win7.
Autres conseils
Il ne montre pas au-delà du 10 au moment de la conception:
Mais au moment de l'exécution est ressemble à ceci:
Toutes les propriétés défini dans le fichier .dfm.
Quant à savoir pourquoi il est comme cela, je n'ai aucune idée. Mais comme il se comporte bien au moment de l'exécution, je ne pense pas que causera des problèmes graves.
Comme demandé par Warren, voici mon .dfm:
object Form3: TForm3
Left = 0
Top = 0
Caption = 'Form3'
ClientHeight = 105
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object StatusBar1: TStatusBar
Left = 0
Top = 86
Width = 635
Height = 19
Panels = <
item
Text = '1'
Width = 50
end
item
Text = '2'
Width = 50
end
item
Text = '3'
Width = 50
end
item
Text = '4'
Width = 50
end
item
Text = '5'
Width = 50
end
item
Text = '6'
Width = 50
end
item
Text = '7'
Width = 50
end
item
Text = '8'
Width = 50
end
item
Text = '9'
Width = 50
end
item
Text = '10'
Width = 50
end
item
Text = '11'
Width = 50
end
item
Text = '12'
Width = 50
end
item
Text = '13'
Width = 50
end>
end
end
J'ai trouvé un problème similaire pour les panneaux OwnerDraw. événement DrawPanel n'est pas appelé sur les panneaux avec un indice> 6 Win 7 / 64bit. J'ai trouvé que les fenêtres ne pas envoyer un message WM_DRAWITEM à ces panneaux. Solution qui a fonctionné dans mon cas est de définir le style WS_EX_COMPOSITED à la barre d'état.
procedure TForm1.FormCreate(Sender: TObject);
var
SBHandle: THandle;
begin
...
if CheckWin32Version(5, 1) then
begin
SBHandle:= StatusBar.Handle;
SetWindowLong(SBHandle, GWL_EXSTYLE, GetWindowLong(SBHandle, GWL_EXSTYLE) or WS_EX_COMPOSITED);
end;
...
end;