usan - Estilos VCL Delphi XE2, la actualización de los subtítulos bloquea la invalidación de otros controles
seo h3 (1)
Se ha encontrado un problema con los estilos de 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 Repaint, perdiendo un valioso tiempo de procesamiento para volver a dibujar.
Ejemplo: (establecer opciones de proyecto / estilo 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.
Establezca las llamadas de subtítulos en la secuencia.
- Primero form.caption, luego child.caption.
Una vez que haya llamado a la secuencia incorrecta, entonces dejó de funcionar la secuencia correcta. Es por eso que uso aquí, el botón "establecer por defecto".
Esto procede, mientras no haya una solución para eso, puedo vivir con eso.
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 encontraste otra solución. Por favor dime.