2012-04-06 14 views
25

Znaleziono błąd w stylach VCL: po zaktualizowaniu podpisu formularza inne formanty uprzednio przerysowane w ramach tej samej procedury nie zostaną przemalowane, a użytkownik będzie musiał wywołać funkcję Odśwież, tracąc cenny czas przetwarzania na przerysowanie.Delphi XE2 Style VCL, aktualizowanie bloków podpisów innych formantów unieważniających

Przykład: (opcje projektu SET/VCL styl ręcznie)

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

To tylko przykład, aby jasno pokazać problem. – hikari

+1

W porządku, zmodyfikowałem kod, chociaż było to niepotrzebne, nie zgłaszam tu narzekania, kwestia ta była dość wyraźna w przypadku pierwszego przykładu. – hikari

+1

To nie narzeka. Jeśli masz problem z kodem, wysłanie wymyślonego kodu nie pomoże ci uzyskać odpowiedzi. Przeczytaj mój ostatni komentarz - mogę utworzyć kod, aby skopiować niemal każdy problem, który chcesz utworzyć, ale to nie znaczy, że mój wymyślony kod jest przyczyną problemu w prawdziwym życiu. Jeśli potrzebujesz pomocy, opublikuj swój kod. I BTW - przyjmowanie postaw wobec osób, o które prosisz, o bezpłatną pomoc, zwykle nie jest dobrym pomysłem - sprawia, że ​​ludzie nie chcą pomagać. :) –

Odpowiedz

2

Ustaw podpis wywołuje w sekwencji.

  • Pierwsza form.caption, a następnie child.caption.

Po wywołaniu niewłaściwej sekwencji przestał działać poprawna sekwencja. Dlatego używam tutaj przycisku "ustaw domyślny".

To się toczy, o ile nie ma na to żadnego rozwiązania, mogę z tym żyć.

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. 

Jeśli znalazłeś inne rozwiązanie. Powiedz mi, Proszę.

Powiązane problemy