delphi - 创建 TFrame 并将其分配给父控件时如何避免显示 "flicker"

标签 delphi flicker tframe

例如:我有一个 TFrame(称为 TPageFrame),它有许多控件,例如TreeView 左对齐、拆分器和由编辑和 RichEdit 组成的主客户区域,如下图所示:

enter image description here

代码看起来像这样:

type
  TPageFrame = class(TFrame)
    Panel1: TPanel;
    Splitter1: TSplitter;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Edit1: TEdit;
    RichEdit1: TRichEdit;
    TreeView1: TTreeView;
  private
    { Private declarations }
  public
  end;

在主窗体中,我有一个带有几个选项卡的 RzTabControl。当我移动到新选项卡时,将创建一个新框架(存储在框架数组中),并将其父级设置为 RzTabControl。

type
  TForm1 = class(TForm)
    RzTabControl1: TRzTabControl;
    procedure RzTabControl1Change(Sender: TObject);
  private
    { Private declarations }
    FFrameArr: array[0..5] of TPageFrame;
  public
    { Public declarations }
  end;

procedure TForm1.RzTabControl1Change(Sender: TObject);
var
  Index: Integer;
  PageFrame: TPageFrame;
begin
  Index := RzTabControl1.TabIndex;
  Self.Caption := Index.ToString;

  if FFrameArr[Index] = nil then
  begin
    PageFrame := TPageFrame.Create(Self);
    PageFrame.Name := 'PageFrame' + Index.ToString;
    PageFrame.Parent := RzTabControl1;
    PageFrame.Align := alClient;
    PageFrame.Visible := True;
    FFrameArr[Index] := PageFrame;
  end;
end;

问题:在创建框架并设置其父框架时,存在大量“显示噪音”:

enter image description here

了解编辑控件如何在 2 个位置绘制两次。 (用视频来演示会更容易...)

如何避免这种闪烁?

最佳答案

@RaelB 的代码存在一些问题,例如 try/finally 的错误使用、未处理本地创建的变量可能出现的任何异常等。

正确的(IMO)代码应该是:

if not Assigned(FFrameArr[Index]) then begin
  Screen.Cursor := crHourGlass;
  try
    // Defer updates
    SendMessage(Handle, WM_SETREDRAW, WPARAM(False), 0);
    try
      PageFrame := TPageFrame.Create(Self);
      try
        PageFrame.Name := 'PageFrame' + Index.ToString;
        PageFrame.Visible := False;
        PageFrame.Parent := RzTabControl1;
        PageFrame.Align := alClient;
        PageFrame.Visible := True;
        FFrameArr[Index] := PageFrame;
      except
        PageFrame.Free;
        raise
      end;
    finally
      // Make sure updates are re-enabled
      SendMessage(Handle, WM_SETREDRAW, WPARAM(True), 0);
    end;
    PageFrame.Hide;
    PageFrame.Show;
    RzTabControl1.Invalidate;
  finally
    Screen.Cursor := crDefault;
  end;
end;

关于delphi - 创建 TFrame 并将其分配给父控件时如何避免显示 "flicker",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56158955/

相关文章:

c++ - 双缓冲故障(2013 年 12 月 17 日更新)

delphi - 如何以最优雅的方式将字符数组分配给字符串?

css - asp .net 背景图像在回发时闪烁

image - 在backgroundImage之前插入路线时出现白色闪烁

forms - Delphi - 如何从该表单上的 TFrame 内关闭表单?

delphi - 框架继承和包中的重复文件

德尔福:F2084 内部错误 T2575

delphi - 识别运行 Delphi 7 程序的服务器

Delphi 自动完成 ButtonClick 程序

delphi - 我应该使用 delphi tframes 来处理多页表单吗?