En Windows 7 x64, Statusbar no muestra texto para los paneles que comienzan desde el 11 correctamente
-
25-10-2019 - |
Pregunta
Resumen:
(1) Es muy probable que sea un error. Sin embargo, no puedo decir con certeza si está más relacionado con el sistema operativo de 64 bits, o VCL o Wrapper MFC. Verifique las respuestas y comentarios a continuación de Delphi Experts.
(2) Solución para mí:
una. La situación es que tengo six
valor clave pairs
Para mostrar en la barra de estado. Los valores se cambiarán en tiempo de ejecución.
b. Parece que no puedo set text
Por más de 10
paneles.
C. A este respecto, usaré six
llamadas de set text
para los valores y usar two
llamadas para set text
para las dos últimas llaves. Por lo tanto, no tengo que exceder el 10
límite.
d. Para poder hacer set text
Trabajo, necesito proporcionar un texto diferente que ya tenga.
mi. El código de muestra se puede describir como:
// 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'
==================================================================
En mi Windows 7 x64, el estado no muestra texto para los paneles que comienzan desde el 11 correctamente.
(1) nuevo proyecto de aplicación VCL vacío without
Guardarlo, si configure el texto para el 11 ° panel de estado en el momento de diseño, el texto no se mostrará en absoluto en el momento de ejecución. (Ver las imágenes adjuntas).
(2) Si lo guardo y lo reabro, el texto tampoco se mostrará en el tiempo de diseño.
(3) Si configure el texto en tiempo de ejecución, el texto se mostrará solo cuando el nuevo texto sea diferente del anterior. Digamos que el texto para el 11 ° panel se establece en 'try'
En la hora de diseño:
Self.stat1.Panels[10].Text := 'try'; // 'try' is not shown
self.stat1.Panels[10].Text := 'try_'; // 'try_' is shown
(4) Este comportamiento solo ocurre en mi Windows 7 X64, pero no en mi Windows XP.
(5) Pensaría que las mismas alpías de comportamiento para todas las versiones de Delphi.
(6) Parece que el comportamiento está más relacionado con la versión de Windows que con Delphi. Quiero decir, la misma aplicación de muestra mostrará el comportamiento anterior en Windows 7 pero no en Windows XP.
(7) Un archivo DFM de muestra se descarga como se muestra a continuación:
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) Imágenes de muestra:
¿Podría alguien ayudar a comentar sobre la posible razón? ¡Se agradece cualquier sugerencia!
Solución
Quería decir "Funciona para mí, en Windows 7, 64 bits, con Delphi Xe". De hecho, funcionó, la primera vez que lo dejé caer en el formulario, todo funcionó muy bien. Y pensé que estás haciendo algo mal. Luego me golpeó, después de la segunda vez, reabrí el formulario.
Ahora siempre falla.
Creo que deberías comenzar con un nuevo proyecto en blanco como yo, y hacer solo lo único. Eso saca todas las otras cosas que hiciste del código, que te están arruinando.
Llamo a esto la prueba de "archivo nuevo". Si no puede reproducir algo en una nueva aplicación, eso contiene solo el código o los controles que no está seguro, no se moleste en pedirle a nadie que lo haga por usted.
Aquí está mi intento inicial, funcionó:
La segunda vez que reabrí el formulario, falló en Designtime, de la misma manera que falló para David H.
Volcar los anchos de los paneles a una nota como esta:
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;
La barra de estado de VCL envuelve un control común MS, que tiene un error, o el VCL lo está envolviendo mal. Como esto no sucede en XP, creo que ha encontrado un nuevo error de controles de MS Common en Win7.
Otros consejos
No se muestra más allá del décimo en el tiempo de diseño:
Pero en el tiempo de ejecución es esto:
Todas las propiedades establecidas en el archivo .dfm.
En cuanto a por qué es así, no tengo idea. Pero dado que se comporta bien en tiempo de ejecución, no creo que cause problemas graves.
Según lo solicitado por Warren, aquí está mi .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
Encontré un problema similar para los paneles de propietario. El evento Drawpanel no se llama en paneles con un índice> 6 en Win 7/64bit. Descubrí que Windows no envía un mensaje WM_Drawitem a estos paneles. La solución que funcionó en mi caso es establecer el estilo WS_EX_COMposited en 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;