Dans Windows 7 X64, statusBar ne montre pas de texte pour les panneaux à partir du 11 correctement

StackOverflow https://stackoverflow.com/questions/5325137

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:
DesignTime
rumtime

pourrait-il quelqu'un aide à commenter la raison possible? Toute suggestion est appréciée!

Était-ce utile?

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.

entrer image description ici

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:

entrer image description ici

Mais au moment de l'exécution est ressemble à ceci:

entrer image description ici

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top