2012-04-06 17 views
25

Se ha detectado un error con los estilos VCL: cuando actualiza el título del formulario, otros controles previamente redibujados dentro del mismo procedimiento no se vuelven a pintar, y se ve obligado a llamar a Repintura, perdiendo un valioso tiempo de procesamiento para volver a dibujar.Estilos Delphi XE2 VCL, actualización de los subtítulos bloquea la invalidación de otros controles

Ejemplo: (estilo de juego de opciones del proyecto/VCL manualmente)

unit Unit11; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; 

type 
    TForm11 = class(TForm) 
    Button1: TButton; 
    Panel1: TPanel; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form11: TForm11; 

implementation 

{$R *.dfm} 

procedure TForm11.Button1Click(Sender: TObject); 
begin 
    Panel1.Caption := 'test'; 
    caption := 'glitch'; 
end; 

end. 

object Form11: TForm11 
    Left = 0 
    Top = 0 
    Caption = 'Form11' 
    ClientHeight = 89 
    ClientWidth = 352 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object Button1: TButton 
    Left = 8 
    Top = 8 
    Width = 121 
    Height = 57 
    Caption = 'Button1' 
    TabOrder = 0 
    OnClick = Button1Click 
    end 
    object Panel1: TPanel 
    Left = 135 
    Top = 8 
    Width = 185 
    Height = 57 
    Caption = 'Panel1' 
    TabOrder = 1 
    end 
end 

program Project10; 

uses 
    Vcl.Forms, 
    Unit11 in 'Unit11.pas' {Form11}, 
    Vcl.Themes, 
    Vcl.Styles; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    TStyleManager.TrySetStyle('Cobalt XEMedia'); 
    Application.CreateForm(TForm11, Form11); 
    Application.Run; 
end. 
+1

Es solo un ejemplo para mostrar claramente el problema. – hikari

+1

Alright modificó el código, aunque no era necesario, no me quejo aquí, el problema fue bastante claro con el ejemplo inicial. – hikari

+1

No se queja. Si tiene un problema con su código, publicar código inventado no lo ayudará a obtener una respuesta. Lea mi último comentario: puedo crear código para duplicar casi cualquier problema que quiera crear, pero eso no significa que mi código inventado sea el que causa el problema en la vida real. Si quieres ayuda, publica tu código. Y, por cierto, adoptar una actitud hacia las personas a las que les pides ayuda gratuita no suele ser una buena idea: hace que las personas no quieran ayudar. :) –

Respuesta

2

Establecer el título llama en la secuencia.

  • Primero form.caption, y luego child.caption.

Una vez que ha llamado a la secuencia incorrecta, dejó de funcionar la secuencia correcta. Es por eso que uso aquí, el botón "establecer por defecto".

De este modo, mientras no haya solución, puedo vivir con eso.

enter image description here

procedure TForm11.Button1Click(Sender: TObject); 
begin // wrong order 
    Panel1.Caption := 'test'; 
    caption := 'glitch'; 
end; 

procedure TForm11.Button2Click(Sender: TObject); 
begin // right order 
    caption := 'glitch'; 
    Panel1.Caption := 'test'; 
end; 

procedure TForm11.Button3Click(Sender: TObject); 
var 
i:integer; 
begin // count no refresh 
    for i:= 1 to 300 do begin 
    caption := 'glitch '+intToStr(i); 
    Panel1.Caption := 'test '+intToStr(i); 
    end; 
end; 

procedure TForm11.Button4Click(Sender: TObject); 
var 
i:integer; 
begin // count with refresh 
    for i:= 1 to 300 do begin 
    caption := 'glitch '+intToStr(i); 
    Panel1.Caption := 'test '+intToStr(i); 
    Panel1.Refresh; 
    end; 
end; 

procedure TForm11.Button5Click(Sender: TObject); 
begin // set default 
    caption := 'Form11'; 
    Panel1.Caption := 'Panel1'; 
    Panel1.Refresh; 
end; 

end. 

Si has encontrado otra solución. Por favor dime.

Cuestiones relacionadas