gpt4 book ai didi

delphi - Firemonkey组件中旋转时如何避免重复图像?

转载 作者:行者123 更新时间:2023-12-03 05:01:13 27 4
gpt4 key购买 nike

我做了什么?

我正在尝试开发 FMX Gauge 组件。目前它只有一根针。我创建了一个新包并添加了以下代码: 单位FMX.VDO;

interface

uses
System.SysUtils,
System.Classes,
FMX.Types,
FMX.Controls,
FMX.MultiResBitmap,
FMX.Layouts,
FMX.Objects;

type
TVdoLayout = class(TScaledLayout)
private
FNeedle : TImage;

function GetBitMapNeedle: TFixedMultiResBitmap;
procedure SetBitMapNeedle(const Value: TFixedMultiResBitmap);
function GetValue: Double;
procedure SetValue(const Value: Double);
{ Private declarations }

protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
property BitMapNeedle : TFixedMultiResBitmap read GetBitMapNeedle write SetBitMapNeedle;
property Value : Double read GetValue write SetValue;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TVdoLayout]);
end;

{ TVdoLayout }

constructor TVdoLayout.Create(AOwner: TComponent);
begin
inherited;
Self.Size.Width := 326;
Self.Size.Height := Self.Size.Width;

FNeedle := TImage.Create(Self);
FNeedle.Parent := Self;
FNeedle.Width := 262;
FNeedle.Height := 21;
FNeedle.Position.X := 40;
FNeedle.Position.Y := 270;
FNeedle.Height := Self.Height * 0.04901;
FNeedle.Width := Self.Width * 0.7485;
FNeedle.RotationCenter.X := 0.935;
FNeedle.RotationCenter.Y := 0.27;

FNeedle.RotationAngle := 45;
end;

function TVdoLayout.GetBitMapNeedle: TFixedMultiResBitmap;
begin
Result := FNeedle.MultiResBitmap;
end;

procedure TVdoLayout.SetBitMapNeedle(const Value: TFixedMultiResBitmap);
begin
FNeedle.MultiResBitmap := Value;
end;

function TVdoLayout.GetValue: Double;
begin
Result := FNeedle.RotationAngle;
end;

procedure TVdoLayout.SetValue(const Value: Double);
begin
FNeedle.RotationAngle := Value;
end;

end.

此后,我构建了项目并安装了我的组件。

我创建了一个新的 FMX 项目并放置了我的组件。我在设计时加载了一张针的图片。见下文:

Needle design time

在设计时我可以更改属性Value。如果您看到上面的代码,Value 会更改针的 RotationAngle。它在设计时完美运行。

有什么问题吗?

在运行时,当我通过 TEdit 将组件的 Value 属性更改为 90 时,它可以工作,但会拍摄初始针的快照,并且它似乎是重复的,如下所示:

Needle run time

我尝试过但没有成功的其他事情?

我尝试调用调整大小和重绘函数。还按照 @UweRaabe 的建议在 Create 期间添加了 FNeedle.SetSubComponent(True); 。如果我在运行时加载针图像,它就会起作用。但这不是一个理想的解决方案。

详细信息

  • 德尔福 10.1 柏林
  • FireMonkey(在 Windows 上)

最佳答案

在我的搜索中,我在这里找到了解决方案:Firemonkey: How to define a component that contain another component?

我只需将属性Stored 设置为False。见下文:

FNeedle.Stored := false;

关于delphi - Firemonkey组件中旋转时如何避免重复图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51859918/

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