В Windows 7 x64 Statusbar не показывает текст для панелей, начиная с 11 -го правильно
-
25-10-2019 - |
Вопрос
Суммирование:
(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) Образец изображений:
Может ли кто -нибудь помочь прокомментировать возможную причину? Любое предложение ценится!
Решение
Я хотел сказать: «Это работает для меня, в Windows 7, 64 бит, с Delphi XE». На самом деле, это сработало, когда я впервые бросил его в форму, все сработало отлично. И я подумал, что ты делаешь что -то не так. Затем это ударило меня, после второго раз, я вновь открыл форму.
Теперь это всегда терпит неудачу.
Я думаю, что вы должны начать с нового пустого проекта, как я, и сделать только одну вещь. Это берет все остальные вещи, которые вы сделали из кода, которые вас испортят.
Я называю это тестом «Файл новый». Если вы не можете воспроизвести что -то в новом приложении, в котором содержится только код или элементы управления, в которых вы не уверены, не просите кого -нибудь еще сделать это для вас.
Вот моя первоначальная попытка, это сработало:
Во второй раз, когда я открыл форму, она потерпела неудачу в 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-го в времени дизайна:
Но во время выполнения выглядит так:
Все свойства, установленные в файле .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;