В Windows 7 X64 statusBar не отображает текст для панелей, начиная с 11-го правильно - PullRequest
2 голосов
/ 16 марта 2011

Обобщение:
(1) С большой вероятностью это будет ошибкой.Однако я не могу с уверенностью сказать, имеет ли это отношение к 64-битной ОС, или к VCL, или к оболочке MFC.Пожалуйста, проверьте ответы и комментарии ниже от экспертов Delphi.
(2) Обходной путь для меня:
a.Ситуация такова, что у меня есть six ключ-значение pairs для отображения в строке состояния.Значения будут изменены во время выполнения.
b.Кажется, я не могу set text для более чем 10 панелей.
c.В этом отношении я буду использовать six вызовы set text для значений и использовать two вызовы set text для последних двух ключей.Таким образом, мне не нужно превышать предел 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 строка состояния не отображаетсятекст для панелей начиная с 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

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

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Это не показывает после 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
2 голосов
/ 17 марта 2011

Я обнаружил похожую проблему для панелей владельца.Событие DrawPanel не вызывается на панелях с индексом> 6 в Win 7 / 64bit.Я обнаружил, что Windows не отправляет WM_DRAWITEM сообщение на эти панели.Решение, которое сработало в моем случае, это установить стиль WS_EX_COMPOSITED в строку состояния.

2 голосов
/ 16 марта 2011

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

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

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

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

enter image description here

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

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

Дамп ширины панелейна заметку, подобную этой:

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.

...