Windows 7 X64では、StatusBarは11日から正しく始まるパネルのテキストを表示しません

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

質問

要約:
(1)これはバグになる可能性が非常に高いです。ただし、64ビットOS、VCL、またはMFCラッパーに関連しているかどうかは確かではありません。 Delphiの専門家から以下の回答とコメントを確認してください。
(2)私のための回避策:
a。状況は私が持っていることです six キー価値 pairs ステータスバーに表示します。値は実行時に変更されます。
b。できないようです set text よりも多くの 10 パネル。
c。この点で、私は使用します six の呼び出し set text 値のために、そして使用します two 要求 set text 最後の2つのキーについて。したがって、私はそれを超える必要はありません 10 制限。
d。作るために set text 仕事、私はそれがすでに持っている異なるテキストを提供する必要があります。
e。したがって、サンプルコードは次のように説明できます。

// 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'

==================================================================

Windows 7 X64では、StatusBarには11日から正しく始まるパネルのテキストが表示されません。

(1)新しい空のVCLアプリケーションプロジェクト without 保存すると、デザイン時に11番目のステータスパネルのテキストを設定した場合、実行時にテキストはまったく表示されません。 (添付の写真を参照してください。)

(2)保存して再開した場合、テキストは設計時間にも表示されません。

(3)実行時にテキストを設定すると、新しいテキストが古いテキストと異なる場合にのみテキストが表示されます。 11番目のパネルのテキストはに設定されています 'try' 設計時:

Self.stat1.Panels[10].Text := 'try';         // 'try' is not shown   
self.stat1.Panels[10].Text := 'try_';        // 'try_' is shown

(4)この動作は、Windows 7 x64でのみ発生しますが、Windows XPでは発生しません。

(5)私は同じ動作がすべてのDelphiバージョンにすべてのものを提供すると思います。

(6)動作は、DelphiよりもWindowsバージョンに関連しているようです。つまり、同じサンプルアプリケーションでは、Windows 7では上記の動作が表示されますが、Windows XPでは表示されません。

(7)サンプルDFMファイルは以下のようにダンプされています。

    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)サンプル写真:
Designtime
rumtime

誰かが考えられる理由についてコメントするのを手伝うことができますか?どんな提案も感謝しています!

役に立ちましたか?

解決

「Windows 7、64ビット、Delphi Xeと一緒に機能する」と言いたかったのです。実際、それはうまくいきました、私がそれをフォームに最初に落としたとき、それはすべてうまくいきました。そして、私は思った、あなたは何か間違ったことをしている。それからそれは私を襲った、二度目の後、私はフォームを再開した。

今では常に失敗しています。

私のように新しい空白のプロジェクトから始めて、ただ一つのことをするべきだと思います。それはあなたがコードから出した他のすべてのことを取り、それはあなたを台無しにしています。

これを「ファイル新しい」テストと呼びます。新しいアプリケーションで何かを再現できない場合、それにはあなたが不確かなコードまたはコントロールのみが含まれている場合、他の誰かにあなたのためにそれをするように頼まないでください。

enter image description here

これが私の最初の試みです、それはうまくいきました:

2回目のフォームを再開したとき、David Hで失敗したのと同じように、設計時に失敗しました。

パネルの幅をこのようなメモにダンプします。

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;

VCLステータスバーは、バグがあるか、VCLが間違っているMS Common Controlをラップします。これはXPでは起こらないので、Win7で新しいMS Common Controls Bugを見つけたと思います。

他のヒント

デザイン時間の10日を超えて表示されません。

enter image description here

しかし、実行時には次のように見えます:

enter image description here

.dfmファイルに設定されたすべてのプロパティ。

なぜそうなのかについては、私にはわかりません。しかし、それは実行時にはうまく振る舞うので、私は深刻な問題を引き起こすとは思わない。


ウォーレンが要求したように、ここに私の.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

オーナードローパネルについても同様の問題が発見されました。 Drawpanelイベントは、Win 7/64bitでインデックス6を超えるインデックスを持つパネルでは呼ばれません。 Windowsはこれらのパネルにwm_drawitemメッセージを送信しないことがわかりました。私のケースで機能したソリューションは、WS_EX_COMPOSIED STYLEをStatusBarに設定することです。

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top