Delphi XE2 VCL样式,更新标题块其他控件无效

Delphi XE2 VCL样式,更新标题块其他控件无效,delphi,styles,delphi-xe2,vcl,skinning,Delphi,Styles,Delphi Xe2,Vcl,Skinning,发现VCL样式存在问题:当您更新表单标题时,以前在同一过程中重新绘制的其他控件无法重新绘制,并且您被迫调用重新绘制,从而损失了重新绘制的宝贵处理时间 示例:(手动设置项目选项/vcl样式) 按顺序设置标题调用 首先是form.caption,然后是child.caption 一旦调用了错误的序列,就停止使用正确的序列。这就是我在这里使用“设置默认值”按钮的原因 这样继续下去,只要没有解决办法,我可以接受 procedure TForm11.Button1Click(Sender: TObje

发现VCL样式存在问题:当您更新表单标题时,以前在同一过程中重新绘制的其他控件无法重新绘制,并且您被迫调用重新绘制,从而损失了重新绘制的宝贵处理时间

示例:(手动设置项目选项/vcl样式)


按顺序设置标题调用

  • 首先是form.caption,然后是child.caption
一旦调用了错误的序列,就停止使用正确的序列。这就是我在这里使用“设置默认值”按钮的原因

这样继续下去,只要没有解决办法,我可以接受

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.


如果你找到了另一个解决方案。请告诉我

这只是一个例子,清楚地说明了问题。好吧,修改了代码,虽然这是不必要的,但我没有听到你在这里抱怨,问题在最初的例子中非常清楚。它没有抱怨。如果您的代码有问题,发布编造的代码不会帮助您获得答案。请阅读我的最后一条评论——我可以编写代码来复制您想要创建的几乎任何问题,但这并不意味着我编写的代码是导致实际问题的原因。如果需要帮助,请发布代码。顺便说一句——对你要求免费帮助的人采取一种态度通常不是一个好主意——这会让人们不想帮助我可以复制这个问题,很奇怪,似乎跟奎的消息有关。当您设置标题时,两条消息被发送到控件WM_SETTEXT和CM_TEXTCHANGED,在某些情况下,第二条消息被吞没,也许我可以找到问题的根源,但这需要一些时间,因为解决方法可以调用Application.ProcessMessages;这样
Panel1.Caption:=“测试”;Application.ProcessMessages;标题:=‘故障’
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.