В Windows 7 x64 Statusbar не показывает текст для панелей, начиная с 11 -го правильно

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

Вопрос

Суммирование:
(1) Это, вероятно, будет ошибкой. Тем не менее, я не могу сказать наверняка, связано ли это с 64 -битной ОС, или VCL или MFC. Пожалуйста, проверьте ответы и комментарии ниже от Delphi Experts.
(2) обходной путь для меня:
а Ситуация в том, что у меня есть six Ключевая стоимость pairs Показать в строке состояния. Значения будут изменены во время выполнения.
беременный Кажется, я не могу set text для более чем 10 панели.
в В этом отношении я буду использовать six вызовы set text Для значений и использования two призывает для set text Для последних двух ключей. Таким образом, мне не нужно превышать 10 предел
дюймовый Чтобы сделать set text Работа, мне нужно предоставить другой текст, который он уже имеет.
е - Таким образом, пример кода можно описать как:

// 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) Кажется, что поведение больше связано с версией 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) Образец изображений:
Designtime
rumtime

Может ли кто -нибудь помочь прокомментировать возможную причину? Любое предложение ценится!

Это было полезно?

Решение

Я хотел сказать: «Это работает для меня, в Windows 7, 64 бит, с Delphi XE». На самом деле, это сработало, когда я впервые бросил его в форму, все сработало отлично. И я подумал, что ты делаешь что -то не так. Затем это ударило меня, после второго раз, я вновь открыл форму.

Теперь это всегда терпит неудачу.

Я думаю, что вы должны начать с нового пустого проекта, как я, и сделать только одну вещь. Это берет все остальные вещи, которые вы сделали из кода, которые вас испортят.

Я называю это тестом «Файл новый». Если вы не можете воспроизвести что -то в новом приложении, в котором содержится только код или элементы управления, в которых вы не уверены, не просите кого -нибудь еще сделать это для вас.

enter image description here

Вот моя первоначальная попытка, это сработало:

Во второй раз, когда я открыл форму, она потерпела неудачу в Designtime, так же, как и Дэвида Х.

Сбросьте ширину панелей в записку, подобную этой:

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, я думаю, что вы нашли новую ошибку MS Common Controls в Win7.

Другие советы

Он не показывает 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 не вызывается на панелях с индексом> 6 в Win 7/64Bit. Я обнаружил, что Windows не отправляет сообщение WM_Drawitem на эти панели. Решение, которое сработало в моем случае, состоит в том, чтобы установить стиль WS_EX_COMPOSITED в 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