2012-04-06 12 views
25

Trovato un problema tecnico con gli stili VCL: quando si aggiorna la didascalia del modulo, gli altri controlli precedentemente ridisegnati all'interno della stessa procedura non vengono ridipinti e si è costretti a chiamare Repaint, perdere tempo prezioso di elaborazione per ridisegnare.Stili Delphi XE2 VCL, aggiornamento didascalia blocca altri controlli invalidazione

Esempio: (stile Imposta opzioni di progetto/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

Questo è solo un esempio per mostrare chiaramente il problema. – hikari

+1

Va bene modificato il codice, anche se non era necessario, non mi lamento da questo punto, il problema era abbastanza chiaro con l'esempio iniziale. – hikari

+1

Non si lamenta. Se hai un problema con il tuo codice, la pubblicazione di un codice inventato non ti aiuterà a ottenere una risposta. Leggi il mio ultimo commento: posso creare il codice per duplicare quasi tutti i problemi che vuoi creare, ma ciò non significa che il mio codice inventato sia ciò che sta causando il problema nella vita reale. Se vuoi aiuto, pubblica il tuo codice. E BTW: assumere un atteggiamento nei confronti delle persone a cui chiedi aiuto gratuito non è di solito una buona idea - fa sì che le persone non vogliano aiutare. :) –

risposta

2

Impostare la didascalia chiama in sequenza.

  • Prima form.caption, quindi child.caption.

Dopo aver chiamato la sequenza sbagliata, quindi smesso di funzionare la sequenza corretta. Ecco perché uso qui, il pulsante "imposta predefinito".

Questo procedere, finché non c'è una soluzione per esso, posso vivere con quello.

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. 

Se hai trovato un'altra soluzione. Dimmelo, ti prego.