标签: tpanel

Delphi:如何使用align = alTop以编程方式调整组件的可视排序

我有一个带有多个面板的表单,每个面板都有Align = alTop,因此它们从表单的顶部很好地堆叠.

但是,我想动态更改这些面板的外观顺序 - 即上下移动它们.这样做的最佳方法是什么?

delphi alignment tpanel

12
推荐指数
2
解决办法
2万
查看次数

制作Delphi TPanel字幕包

有没有办法将文本包装在Delphi的TPanel.Caption中(在我的案例中是Delphi 6)?

谢谢!

delphi tpanel delphi-6

8
推荐指数
1
解决办法
4249
查看次数

如何消除TPaintBox右边缘的闪烁(例如调整大小时)

总结:
假设我有一个TForm和两个面板.面板与alTop和alClient对齐.alClient面板包含一个TPaintBox,其OnPaint涉及绘图代码.

组件上DoubleBuffered的默认值为false.

在绘图过程中,闪烁是显而易见的,因为表格,面板都绘制了它们的背景.

由于表单由面板覆盖,因此拦截其WM_ERASEBKGND消息可能很好.如果没有,可以看到面板上的闪烁,并在调整窗体大小时在面板的右边缘闪烁,因为窗体会绘制其背景.

其次,因为alTop面板是一个按钮的容器,所以将DoubleBuffered设置为true可能很好,让Delphi确保它没有闪烁.它可能不会带来太多的性能负担.

第三,由于alClient面板仅用作另一个绘图组件的容器,因此该面板很可能参与组成最终绘图.在这方面,使用TPanel后代而不是标准TPanel可能是好事.在这个TPanel后代中,覆盖受保护的过程Paint并在过程中不执行任何操作,尤其是不继承调用以避免在基类TCustomPanel.Paint中进行FillRect调用.此外,拦截WM_ERASEBKGND消息并且内部也不执行任何操作.这是因为当TPanel.ParentBackground为False时,Delphi负责重新绘制背景,当它为True时,ThemeService负责.

最后,在TPaintBox中绘制没有闪烁:
(1)使用VCL内置绘图例程,可能更好......
(2)使用OpenGL,启用OpenGL的双缓冲.
(3)......

===问:如何消除TPaintBox右边缘的闪烁?===

假设对于一个TForm,我有两个面板.顶部相对于表格对齐alTop并被视为按钮的容器.另一个是相对于表单对齐的alClient,并被视为绘制组件的容器(例如来自VCL的TPaintBox,或来自Graphics32的TPaintBox32).对于后一个面板,它的WM_ERASEBKGND消息被截获.

现在,我在以下示例代码中使用TPaintBox实例.在它的OnPaint处理程序中,我有两个选择来绘制一个我希望无闪烁的绘图.选择1是在填充矩形后绘制的.由于其父面板不应擦除背景,因此绘图应无闪烁.选择2绘制在TBitmap上,然后将其Canvas复制回paintbox.

然而,两种选择都是闪烁的,第二种选择尤其是闪烁.我主要关心的是选择1.如果你调整表格的大小,你可以看到闪烁的主要部分发生在右边缘.为什么会这样?有人可以帮助评论原因和可能的解决方案吗?(注意,如果我在这里使用TPaintBox32而不是TPaintBox,右边缘根本不会闪烁.)

我的第二个担忧是,当使用选项1时,闪烁的次要部分会随机出现在绘图箱上.如果您快速调整表单大小,它不是很明显但仍然可以观察到.此外,当使用选择2时,这种闪烁变得更加严重.我没有找到原因.有人可以帮助评论可能的原因和解决方案吗?

任何建议表示赞赏!!

    unit uMainForm;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      ExtCtrls, Dialogs;

    type
      TMainForm = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        FPnlCtrl, FPnlScene: TPanel;
        FPbScene: TPaintBox;

        OldPnlWndProc: TWndMethod;

        procedure PnlWndProc(var Message: TMessage);
        procedure OnScenePaint(Sender: TObject);
      public
        { Public declarations }
      end;

    var
      MainForm: TMainForm;

    implementation

    {$R *.dfm}

    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      Self.Color := clYellow;
      Self.DoubleBuffered := …
Run Code Online (Sandbox Code Playgroud)

delphi doublebuffered flicker tpanel paintbox

7
推荐指数
1
解决办法
6065
查看次数

如何最好地在右上方创建一个带有"十字"按钮的TPanel?

有几个第三方控件(例如Raize组件)有一个紧密的"交叉"按钮"选项"(例如页面控件).我的要求更简单,我想将一个十字'按钮'对齐到TPanel右上方并访问其点击的事件.是否有一种简单的方法可以在不创建TPanel后代的情况下执行此操作,或者是否可以使用付费或免费的库组件?

delphi button tpanel

7
推荐指数
1
解决办法
2942
查看次数

如何使用Delphi的TSplitter和面板避免这种不必要的行为?

包括一个展示我的问题的小项目.我有一个TPageControl与主表格对齐的.在两个标签页中的每一个上,我都有面板客户端对齐.在每个面板上,我有2个子面板和一个分割器.LH面板和分离器左对齐,RH面板客户端对齐.

基本上问题是两个选项卡之间的交互.展示:

  • 运行程序
  • 水平拉伸主窗体.第3小组将会增长
  • 将分离器尽可能向右移动.面板2将增长,面板3将缩小到其10像素的最小宽度约束.
  • 选择标签页2.面板5按设计,面板6在主窗体拉伸时生长
  • 将主窗体宽度减小到原始宽度.面板6收缩太多(不合需要)
  • 单击标签页1.主窗体再次增加宽度(不合需要)

好的,这种行为可能是根据对齐面板的规则来解释的,但有人可以建议改进操作吗?

unit Unit17;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls;

type
  TForm17 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Panel1: TPanel;
    Panel2: TPanel;
    Splitter1: TSplitter;
    Panel3: TPanel;
    Panel4: TPanel;
    Splitter2: TSplitter;
    Panel5: TPanel;
    Panel6: TPanel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form17: TForm17;

implementation

{$R *.dfm}

end.


object Form17: TForm17
  Left = 0
  Top = 0
  Caption …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2006 tpanel ttabsheet

6
推荐指数
1
解决办法
4319
查看次数

何时使用TPanel FullRepaint?

我注意到,resize flicker获得当我设置好很多TPanel.FullRepaintFalse.由于该属性存在且True默认情况下,因此必须有一些原因.

如何决定是否应该设置?

帮助只是声明:

FullRepaint控制面板调整大小时的响应方式.当FullRepaint为true时,整个面板(包括斜面边框)会在尺寸更改时重新绘制.当FullRepaint为false时,只有斜面边框内的区域重新绘制.

http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.ExtCtrls.TPanel.FullRepaint

该文本说它做了什么,但不是为什么......

delphi resize tpanel

6
推荐指数
1
解决办法
1963
查看次数

使用onmousedown,onmouseup和click事件时无法捕获所有点击

我正在尝试从TPanel组件创建自定义按钮.为此,我为onmousedown和onmouseup事件提供了一个覆盖(做一些绘图),并且我使用了onclick事件来处理点击.

不幸的是,如果我快速点击我的面板,其他每一次点击都会"丢失",但我无法弄清楚原因.

即便是最简单的例子也没有在这方面失败.我创建了一个新的VCL应用程序,添加了一个列表框,一个面板,并按如下方式实现了事件:

procedure TForm1.Panel1Click(Sender: TObject);
begin
  listbox1.Items.Add('click');
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  listbox1.Items.Add('mouse down');
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  listbox1.Items.Add('mouse up');
end;
Run Code Online (Sandbox Code Playgroud)

结果如下:

mouse down
click
mouse up
mouse down
mouse up
Run Code Online (Sandbox Code Playgroud)

等等......每次点击都会被忽略,但我不明白为什么.

有人可以解释一下吗?

delphi click onmousedown onmouseup tpanel

6
推荐指数
1
解决办法
352
查看次数

如何在TPanel上绘图

我需要在TPanel上绘制,理想情况下是直接的,所以我没有其他组件可以阻止鼠标事件陷阱(我想在它上面画一点"尺寸 - 抓握").我应该怎么做呢?

delphi components canvas tpanel

3
推荐指数
2
解决办法
2万
查看次数

如何在delphi中完全删除Panel边框?

在我的应用程序中,我创建了一个注册表单,每当Edit为空或包含一些错误时我都需要显示一个错误图标.但是图像没有Name属性,因此我无法通过名称来调用隐藏图像.因此我决定将图像放入面板并隐藏面板.就像是 :

    if(lenght(edit1.text)=0) then
       Panel1.show else Panel1.hide;  // this code shows or hide the image
Run Code Online (Sandbox Code Playgroud)

问题是在将BorderStyle设置为bsNone后,面板的边框仍然出现.

如何完全隐藏面板的边框?

delphi image border tpanel delphi-2010

2
推荐指数
1
解决办法
4321
查看次数

如何创建一个像Tpanel一样的TCustomControl?

如何创建一个像Tpanel一样的TCustomControl?例如MyCustomComponent,我可以删除类似标签,图像等组件.

delphi tpanel tcustomcontrol custom-component

1
推荐指数
1
解决办法
1470
查看次数