首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi-2009表格面板中标签闪烁问题

Delphi-2009表格面板中标签闪烁问题
EN

Stack Overflow用户
提问于 2020-09-08 07:16:52
回答 2查看 504关注 0票数 1

我有一个简单的应用程序与一个面板包含2个标签(例如。A& B)和一个按钮C由Delphi 2009创建。当我移动面板区域内的鼠标时,标签A将显示光标的位置。标签B只显示静态文本(在应用程序运行期间标题不会更改)

如果我移动面板内的鼠标,标签A会闪烁.

当我启用形式的“双缓冲区”时,闪烁将丢失。按钮C将演示启用/禁用“双缓冲区”属性

我想问‘’为什么面板上的标签会闪烁?根本原因是什么?我们怎样才能彻底解决这个问题呢?

这是我的代码:

代码语言:javascript
复制
unit DemoFlicker;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  System.StrUtils,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;


type
  TForm1 = class(TForm)
    pnlCtr: TPanel;
    btnDoubleBuffer: TButton;
    lblName: TLabel;
    lblNumber: TLabel;
    procedure btnDoubleBufferClick(Sender: TObject);
    procedure pnlCtrMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FDoubleBuffer: Boolean;
  public
    { Public declarations }
  end;

 
var
  Form1: TForm1;

 
implementation

{$R *.dfm}

procedure TForm1.btnDoubleBufferClick(Sender: TObject);
begin
     FDoubleBuffer := not FDoubleBuffer;
     Self.DoubleBuffered := FDoubleBuffer;

     if FDoubleBuffer then
     begin
         btnDoubleBuffer.Caption := 'Not Apply Double Buffer';
     end
     else
     begin
         btnDoubleBuffer.Caption := 'Apply Double Buffer';
     end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    FDoubleBuffer := False;
    Self.DoubleBuffered := False;
end;

procedure TForm1.pnlCtrMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
    mousePos: string;
begin
    mousePos := Format('(X=%d, Y=%d)', [Mouse.CursorPos.X, Mouse.CursorPos.Y]);
    lblNumber.Caption := mousePos  ;
end;

end.
EN

回答 2

Stack Overflow用户

发布于 2020-09-08 08:02:44

发生闪烁是因为绘图是如何完成的。如果没有双缓冲区,则绘制(绘制)背景,然后绘制标签。因此,在某个时刻,你只看到背景,然后你看到背景上方的标签。如果你重复更新,它会闪烁。

当使用“双缓冲区”时,绘图是在一个不可见的缓冲区中完成的,然后当绘图完成时,该缓冲区将在屏幕上呈现。所以你只能同时看到完整的图像,而不是闪烁。

要解决这个问题,请自己使用双缓冲。

您还可以创建一个新的组件,它在他的画图过程中完成自己的绘制。

票数 0
EN

Stack Overflow用户

发布于 2022-05-31 23:20:45

我也遇到过同样的问题,德尔菲10.4

以这种方式设置封闭的TPanel -

代码语言:javascript
复制
DoubleBuffered = True

ParentBackground = False

好像修好了。VCL在其实现上变得过于复杂,特别是在引入主题之后,使得它的行为变得非常错误和不可预测的IMHO。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63788893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档