Windows 7 X64では、StatusBarは11日から正しく始まるパネルのテキストを表示しません
-
25-10-2019 - |
質問
要約:
(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)サンプル写真:
誰かが考えられる理由についてコメントするのを手伝うことができますか?どんな提案も感謝しています!
解決
「Windows 7、64ビット、Delphi Xeと一緒に機能する」と言いたかったのです。実際、それはうまくいきました、私がそれをフォームに最初に落としたとき、それはすべてうまくいきました。そして、私は思った、あなたは何か間違ったことをしている。それからそれは私を襲った、二度目の後、私はフォームを再開した。
今では常に失敗しています。
私のように新しい空白のプロジェクトから始めて、ただ一つのことをするべきだと思います。それはあなたがコードから出した他のすべてのことを取り、それはあなたを台無しにしています。
これを「ファイル新しい」テストと呼びます。新しいアプリケーションで何かを再現できない場合、それにはあなたが不確かなコードまたはコントロールのみが含まれている場合、他の誰かにあなたのためにそれをするように頼まないでください。
これが私の最初の試みです、それはうまくいきました:
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日を超えて表示されません。
しかし、実行時には次のように見えます:
.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;