gpt4 book ai didi

delphi - 复合组件的选择框未正确绘制

转载 作者:行者123 更新时间:2023-12-03 15:01:51 24 4
gpt4 key购买 nike

我有一个由 TEditTButton 组成的复合组件(是的,我知道 TButtonedEdit),它继承自 TCustomControl。编辑和按钮在其构造函数中创建并放置在其自身上。

在设计时,选择框未正确绘制 - 我的猜测是编辑和按钮隐藏了它,因为它是为自定义控件绘制的,然后被它们 overdraw 了。

这里是比较:

enter image description here

我在其他第 3 方组件中也看到过这种情况(例如 TcxGrid 也只绘制选择指示器的外部部分)

问题:我该如何更改?

最简单的重现情况:

unit SearchEdit;

interface

uses
Classes, Controls, StdCtrls;

type
TSearchEdit = class(TCustomControl)
private
fEdit: TEdit;
public
constructor Create(AOwner: TComponent); override;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Custom', [TSearchEdit]);
end;

{ TSearchEdit }

constructor TSearchEdit.Create(AOwner: TComponent);
begin
inherited;
fEdit := TEdit.Create(Self);
fEdit.Parent := Self;
fEdit.Align := alClient;
end;

end.

最佳答案

正如我在评论中所说,我能想到的最简单的事情就是在父级中绘制控件并在设计时向设计者“隐藏”它们。您可以通过调用SetDesignVisible(False)来做到这一点在每个子控件上。然后你使用 PaintTo在父级上进行绘画。

使用您的示例我们得到:

type
TSearchEdit = class(TCustomControl)
...
protected
procedure Paint; override;
...
end;

constructor TSearchEdit.Create(AOwner: TComponent);
begin
inherited;
fEdit := TEdit.Create(Self);
fEdit.Parent := Self;
fEdit.Align := alClient;
fEdit.SetDesignVisible(False);
end;

procedure TSearchEdit.Paint;
begin
Inherited;
if (csDesigning in ComponentState) then
fEdit.PaintTo(Self.Canvas, FEdit.Left, FEdit.Top);
end;

关于delphi - 复合组件的选择框未正确绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33823898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com