2

要約:
(1)これはバグである可能性が非常に高いです。ただし、64ビットOS、VCL、MFCラッパーのいずれに関連しているのかはわかりません。Delphiの専門家からの以下の回答とコメントを確認してください。
(2)私にとっての回避策:
a。状況は、ステータスバーに表示するsixKey-Valueがあるということです。pairs値は実行時に変更されます。
b。パネルset text以上のことはできないようです。 c。この点で、値の呼び出しを使用し、最後の2つのキーの呼び出しを使用します。したがって、制限を超える必要はありません。 d。仕事をするために、私はそれがすでに持っている別のテキストを提供する必要があります。10
sixset texttwoset text10
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'

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

私のWindows7X64では、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でのみ発生し、WindowsXPでは発生しません。

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

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

(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)サンプル写真:
デザインタイム
rumtime

考えられる理由について誰かがコメントするのを手伝ってもらえますか?どんな提案でも大歓迎です!

4

3 に答える 3

3

設計時の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
于 2011-03-16T12:27:46.003 に答える
2

「Windows7、64ビット、delphiXEで動作します」と言いたかったのです。実際、それは機能しました。初めてフォームにドロップしたときは、すべてうまく機能しました。そして、私はあなたが何か間違ったことをしていると思いました。それからそれは私を襲いました、2回目の後、私はフォームを再開しました。

今では常に失敗します。

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

私はこれを「ファイル新規」テストと呼んでいます。不明なコードやコントロールのみが含まれている新しいアプリケーションで何かを再現できない場合は、他の人にわざわざそれを依頼しないでください。

ここに画像の説明を入力してください

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

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ステータスバーがMSCommonコントロールをラップしますが、これにはバグがあるか、VCLが間違ってラップしています。これはXPでは発生しないため、Win7で新しいMSCommonControlsのバグを発見したと思います。

于 2011-03-16T12:24:01.097 に答える
2

ownerdrawパネルでも同様の問題が見つかりました。DrawPanelイベントは、Win7/64ビットのインデックスが6を超えるパネルでは呼び出されません。WindowsがこれらのパネルにWM_DRAWITEMメッセージを送信しないことがわかりました。私の場合に機能した解決策は、WS_EX_COMPOSITEDスタイルをステータスバーに設定することです。

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;
于 2011-03-17T10:26:46.917 に答える