Delphi - TEdit标签未显示(仅限Windows 7 / Vista)

时间:2011-12-02 15:31:13

标签: forms delphi windows-7 repaint

我在另一个表单上插入了很少的TEdit表单,但是在我更改窗口大小之前它们的标签不会显示。这种情况仅发生在Windows Vista / Windows 7上.Windows XP的所有内容都标记正确。

我已经测试了重绘/刷新(只是TEdit /所有表格等)而没有结果。

Delphi 7.

感谢您的回答

糟糕的版本 enter image description here

正确的版本 enter image description here

代码将很快添加:)

6 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

我能够在我的项目中解决同样的问题。这似乎是一个绘画订单问题。解决方案最终是在未正确显示的帧上调用frame.Refresh;。但是,弄清楚放置刷新的正确位置有点棘手,我在找到一个有用的地方之前尝试了几个地方。在我选择在选项面板上显示哪个嵌套框架的方法中,在物理上显示嵌套框架的方法中,在不绘制的标签周围的最内框架上调用frame.Refresh;正常。在内框架上调用刷新而不是整个窗口的框架似乎是关键。

从您正在显示的屏幕截图中,您看起来可能有类似的复杂框架设置,其中可能会在框架顶部显示框架,这些框架可能会在最初显示框架后动态更改。这似乎是首先会产生问题的设置,最初显示的框架似乎从未出现过问题。

然而,一个注意事项是,如果窗口移出屏幕或重新调整大小,另一个窗口被拖到它前面,或者正在消失的鼠标悬停按钮是这些操作可能导致问题重新出现自发地出现。可能还有其他位置,例如在窗口调整大小等特殊处理程序中,或者在定时调用框架上的刷新的计时器上,类似于针对ALT Key错误提到的一些解决方案。问题的类型似乎有一些重叠以及如何解决它但不是完全相同的原因(无论Alt键如何,这个bug似乎都会发生)

答案 2 :(得分:0)

{ Labels no Windows Vista, 7, 8 to Fix the problem, Delphi 7 32 bits }

在FormShow上:

var
  i : Integer;
begin
   For i := 0 to (Form1.ComponentCount - 1) do
     begin
        If (Form1.Components[i].ClassType = TLabel) then
            TLabel(Form1.Components[i]).Refresh;
     end;
end;

跑吧。

答案 3 :(得分:0)

我得到同样的东西,除了它只是一个问题,而应用程序是主题。如果它是未经过训练的(即Project-> Options-> Application-> Appearance-> Default Style = Windows),它可以正常工作,无需刷新或重新绘制。

似乎与TFrame类具体相关,所以我想知道重绘处理程序的某些东西是不是(与Invalidate相关)。 ChangeNotify进程中的某些内容或VCL中的Windows消息泵可能无法通过父控制链进行响应,并通过级联重绘进行响应,并对所有内容进行回流处理"无效"。

我尝试成功的另一个问题是在一行上将主机控件Visible属性设置为False,然后在下一行中将其设置为true,即:

procedure TFrame1.UpdatePanel;
  Panel1.Visible := False;
  Panel1.Visible := True;
end;

然后在需要正确绘图的地方调用此方法。

Panel1的所有其他子控件都被完美绘制。如果在修改其中一个子控件(如TEdit或TMemo)的内容时发生更新,则可能必须缓存文本光标的位置。与追捕问题原因的时间相比,这应该是微不足道的。也许在有问题的控制主机(例如TPanel)上查看可见属性的Setter方法的VCL源可能会提供一些有关为什么Repaint和Refresh似乎不能正常工作的整体问题的见解。这种情况。

答案 4 :(得分:0)

实际上它比目前提出的任何解决方案都简单得多。 唯一需要的是响应WM_UPDATEUISTATE消息。 在窗体中添加类似下面的过程:

...
  protected
  procedure WmUpdateUIState(var Msg: TMessage); message WM_UPDATEUISTATE;
...

procedure TForm1.WmUpdateUIState(var Msg: TMessage);
begin
  inherited;
  Invalidate;
end; { WmUpdateUIState }

完成!

在Windows 10 64位上测试。

通过创建这样一个单元,可以加快速度:

unit FixAltKeyForm;

interface

uses
  Windows, Messages, Classes, Forms;


type
  TForm = class(Forms.TForm)
  protected
    procedure WmUpdateUIState(var Msg: TMessage); message WM_UPDATEUISTATE;
  end; { TForm }

implementation

{ TForm }

procedure TForm.WmUpdateUIState(var Msg: TMessage);
begin
  inherited;
  Invalidate;
end; { WmUpdateUIState }

end.

将单位的名称添加到任何需要此行为的表单的接口会话的uses子句中,并且您已完成。只有确保将该单位的名称放在AFTER' Forms'在使用条款中。无需创建包也不需要安装任何东西。这就是我所谓的Visual Subclassing,因为缺乏更好的术语。

答案 5 :(得分:0)

与Windows主题一起运行时,TButton中存在错误。 您可以在StdCtrls.pas中搜索“ ThemesEnabled”,删除/注释其所有相关分支,如下所示:

procedure TButton.CNCtlColorBtn(var Message: TWMCtlColorBtn);
begin
    with ThemeServices do
    {
        if ThemesEnabled then
        begin
            DrawParentBackground(Handle, Message.ChildDC, nil, False);
            // Return an empty brush to prevent Windows from overpainting we just have created. 
        Message.Result := GetStockObject(NULL_BRUSH);
        end
        else
    }
    inherited;
end;

然后编译它,并用修补程序版本替换lib / StdCtrls.dcu。