In Windows 7 x64 wird der StatusBar nicht ordnungsgemäß Text für die Panels angezeigt
-
25-10-2019 - |
Frage
Zusammenfassung:
(1) Dies ist sehr wahrscheinlich ein Fehler. Ich kann jedoch nicht sicher sagen, ob es mehr mit 64 -Bit -Betriebssystem-, VCL- oder MFC -Wrapper zusammenhängt. Bitte überprüfen Sie die Antworten und Kommentare unten von Delphi -Experten.
(2) Problemumgehung für mich:
a. Die Situation ist, dass ich habe six
Schlüsselwert pairs
in der Statusleiste zeigen. Die Werte werden in der Laufzeit geändert.
b. Es scheint, ich kann nicht set text
für mehr als 10
Panels.
c. In dieser Hinsicht werde ich verwenden six
Anrufe von set text
für die Werte und verwenden Sie two
fordert set text
für die letzten beiden Schlüssel. Daher muss ich die nicht übertreffen 10
Grenze.
d. Damit set text
Arbeit, ich muss einen anderen Text bereitstellen, den es bereits hat.
e. Beispielcode kann daher als:
// 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'
==================================================================
In meinem Windows 7 x64 zeigt die Statusbar nicht ordnungsgemäß Text für die Panels.
(1) Neu ein leeres VCL -Anwendungsprojekt without
Wenn ich den Text für das 11. Statusbereich zur Entwurfszeit festlegt, wird der Text zur Laufzeit überhaupt nicht angezeigt. (Siehe die beigefügten Bilder.)
(2) Wenn ich es speichere und wiedereröffnet, wird der Text auch in der Designzeit nicht angezeigt.
(3) Wenn ich den Text zur Laufzeit festlegt, wird der Text nur angezeigt, wenn sich der neue Text von der alten unterscheidet. Sagen Sie, der Text für das 11. Feld ist auf 'try'
Zur Entwurfszeit:
Self.stat1.Panels[10].Text := 'try'; // 'try' is not shown
self.stat1.Panels[10].Text := 'try_'; // 'try_' is shown
(4) Dieses Verhalten findet nur unter meinem Windows 7 x64 statt, aber nicht unter meinem Windows XP.
(5) Ich würde den gleichen Verhalten für alle Delphi -Versionen denken.
(6) Es scheint, dass das Verhalten mehr mit der Windows -Version als mit Delphi zusammenhängt. Ich meine, dieselbe Beispielanwendung zeigt das obige Verhalten unter Windows 7, jedoch nicht unter Windows XP.
(7) Eine Beispiel -DFM -Datei wird wie unten abgeladen:
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) Beispielbilder:
Könnte jemand helfen, den möglichen Grund zu kommentieren? Jeder Vorschlag wird geschätzt!
Lösung
Ich wollte sagen: "Es funktioniert für mich, unter Windows 7, 64 Bit, mit Delphi Xe." Tatsächlich hat es funktioniert, als ich es zum ersten Mal auf das Formular fallen ließ, hat alles großartig funktioniert. Und ich dachte, du machst etwas falsch. Dann traf es mich, nach dem zweiten Mal eröffnete ich die Form wieder.
Jetzt scheitert es immer.
Ich denke, Sie sollten mit einem neuen leeren Projekt beginnen, wie ich es getan habe, und genau das einzige tun. Das nimmt all die anderen Dinge, die Sie aus dem Code gemacht haben, die Sie durcheinander bringen.
Ich nenne dies den "neuen" -Test. Wenn Sie etwas in einer neuen Anwendung nicht reproduzieren können, enthält nur der Code oder die Steuerelemente, über die Sie sich nicht sicher sind. Bitten Sie niemanden, ihn für Sie zu tun.
Hier ist mein erster Versuch, es hat funktioniert:
Das zweite Mal, als ich das Formular wiedereröffnete, scheiterte es bei Designtime, so wie es David H. fehlgeschlagen war.
Lassen Sie die Breiten der Paneele in ein Memo wie dieses abgeben:
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;
Die VCL -Statusleiste wickelt eine MS Common Control, die entweder einen Fehler hat, oder die VCL wickelt ihn falsch. Da dies bei XP nicht passiert, haben Sie meiner Meinung nach einen neuen MS Common Controls -Fehler in Win7 gefunden.
Andere Tipps
Es zeigt sich nicht über den 10. in der Designzeit hinaus:
Aber zur Laufzeit sieht so aus:
Alle Eigenschaften, die in der .dfm -Datei festgelegt sind.
Warum es so ist, habe ich keine Ahnung. Aber da es sich in der Laufzeit gut verhält, wird ich nicht wohl ernsthafte Probleme verursachen.
Wie von Warren verlangt, hier ist mein .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
Ich fand ein ähnliches Problem für Eigentümerpaneele. Das Drawpanel -Event ist nicht auf Panels mit einem Index> 6 in Win 7/64bit eingerufen. Ich fand, dass Windows keine WM_Drawitem -Nachricht an diese Panels sendet. Lösung, die in meinem Fall funktioniert hat, besteht darin, den Stil von WS_EX_COMPOSDED auf StatusBar festzulegen.
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;