En Windows 7 x64, Statusbar no muestra texto para los paneles que comienzan desde el 11 correctamente

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

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:
Designtime
rumtime

¿Podría alguien ayudar a comentar sobre la posible razón? ¡Se agradece cualquier sugerencia!

¿Fue útil?

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.

enter image description here

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:

enter image description here

Pero en el tiempo de ejecución es esto:

enter image description here

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top