Delphi XE2 VCL styles, updating caption blocks other controls invalidation

delphi, delphi-xe2, skinning, styles, vcl

Solution

Set the caption calls in the sequence.

- First form.caption, then child.caption.

Once you've called the wrong sequence, then stopped working the correct sequence. That's why I use here, the "set default" button.

This proceed, as long as there is no fix for it, I can live with that.

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.

If you found another solution. Please tell me.

Problem

Found a glitch with VCL styles: when you update the form caption, other controls previously redrawn within the same procedure don't get repainted, and you are forced to call Repaint, losing valuable processing time to redraw. Example: (set project options/vcl style manually) ``` 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. ```

Original source