2

总结:
(1)这很可能是一个bug。但是,我不能确定它是否与 64 位操作系统、VCL 或 MFC 包装器更相关。请查看以下 Delphi 专家的回答和评论。
(2) 我
的解决方法:情况是我有six键值pairs显示在状态栏中。这些值将在运行时更改。
湾。看来我不能set text超过10面板。
C。在这方面,我将对值使用six调用,并对最后两个键使用调用。因此,我不必超过限制。 d。为了完成工作,我需要提供它已有的不同文本。set 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'

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

在我的 Windows 7 X64 中,状态栏没有正确显示从 11 号开始的面板的文本。

(1)新建一个空的VCL应用项目without保存,如果我在设计时为第11个状态面板设置了文本,在运行时文本根本不会显示。(见附图。)

(2)如果我保存并重新打开它,文本也不会在设计时显示。

(3) 如果我在运行时设置文本,只有当新文本与旧文本不同时才会显示文本。假设第 11 个面板的 Text'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) 似乎该行为与 Windows 版本的关系比与 Delphi 的关系更大。我的意思是,相同的示例应用程序将在 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) 样张图片:
设计时间
朗姆酒

有人可以帮助评论可能的原因吗?任何建议表示赞赏!

4

3 回答 3

3

它在设计时不会超过第 10 位:

在此处输入图像描述

但在运行时是这样的:

在此处输入图像描述

.dfm 文件中设置的所有属性。

至于为什么会这样,我不知道。但由于它在运行时表现良好,我认为不会导致任何严重问题。


按照 Warren 的要求,这是我的 .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

我想说“它适用于我,在 Windows 7、64 位和 delphi XE 上。” 事实上,它确实有效,当我第一次将它放到表单上时,一切都很好。我想,你做错了什么。然后它击中了我,第二次之后,我重新打开了表格。

现在总是失败。

我认为你应该像我一样从一个新的空白项目开始,只做一件事。这会将您所做的所有其他事情从代码中剔除,这会让您感到困惑。

我称之为“文件新”测试。如果您无法在新应用程序中重现某些内容(仅包含您不确定的代码或控件),请不要费心要求其他人为您完成。

在此处输入图像描述

这是我最初的尝试,它奏效了:

我第二次重新打开表单时,它在设计时失败了,就像 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 状态栏包装了一个 MS 公共控件,该控件要么有错误,要么 VCL 包装错误。由于这不会在 XP 上发生,我认为您在 Win7 中发现了一个新的 MS 公共控件错误。

于 2011-03-16T12:24:01.097 回答
2

我发现 ownerdraw 面板有类似的问题。在 Win 7/64 位中索引 > 6 的面板上不会调用 DrawPanel 事件。我发现 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 回答