gpt4 book ai didi

delphi - 代码更改后如何获取组件原始(设计)的Width属性?

转载 作者:行者123 更新时间:2023-12-02 11:12:59 25 4
gpt4 key购买 nike

我在这里放置了最简单的代码来向您展示我的问题。有两个按钮:btnTestbtnChangeTestWidth

我为它们添加了 OnClick 事件:1) btnChangeTestWidthClick 更改 btnTest Width 属性并设置值对于 100 和 2) btnTestClick 恢复按钮的原始(设计)宽度

问题是:您知道如何引用和获取组件的原始(设计)尺寸吗?

在本例中,它是按钮和宽度属性。我发现只有这种方法才能获得按钮的原始宽度。问题是我必须为每个按钮创建变量以保持此宽度,然后从 FromCreate 过程中获取它。我正在研究工具栏的自动调整大小,我需要为其中的许多工具栏执行此操作,但这并不是为每个工具栏创建变量的方法。

unit Unit4;

interface

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

type
TForm4 = class(TForm)
btnTest: TButton;
btnChangeTestWidth: TButton;
procedure btnChangeTestWidthClick(Sender: TObject);
procedure btnTestClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
iOrignalWidth: Integer;
public
{ Public declarations }
end;

var
Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.btnChangeTestWidthClick(Sender: TObject);
begin
btnTest.Width := 100;
end;

procedure TForm4.btnTestClick(Sender: TObject);
begin
btnTest.Width := iOrignalWidth;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
iOrignalWidth := btnTest.Width;
end;

end.

最佳答案

我知道这个问题的两个解决方案:

1)创建所有者表单的新虚拟实例

2)读取并解析组件的DFM代码

解决方案1

新的VCL应用程序在表单上放置一个面板和一个按钮创建一个 OnFormCreate 事件:

过程 TForm1.FormCreate(Sender: TObject);开始 面板1.宽度:= 100;结束;

向按钮添加 OnClick 处理程序:

procedure TForm1.Button1Click(Sender: TObject);
var
Form: TForm1;
begin
Form := TForm1.CreateNew(Application);
try
ReadComponentRes(Form1.ClassName, Form);
Panel1.Width := Form.Panel1.Width;
finally
Form.Free;
end;
end;

就这么简单!

优点:代码简单

缺点:如果您的负载很重,则可能需要一段时间才能加载。

解决方案2

新的VCL应用程序在表单上放置一个面板和一个按钮创建一个 OnFormCreate 事件:

uses
uDFMParser;

procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.Width := 100;
end;

向按钮添加 OnClick 处理程序:

procedure TForm1.Button2Click(Sender: TObject);
var
rs: TResourceStream;
ms: TMemoryStream;
DfmTree: TDfmTree;
DfmObject: TDfmObject;
DfmProperty: TDfmProperty;
i: Integer;
begin
rs := TResourceStream.Create(hinstance, TForm32.ClassName, RT_RCDATA);
ms := TMemoryStream.Create;
DfmTree := TDfmTree.Create;
try
rs.Position := 0;
ObjectBinaryToText(rs, ms);
ms.Position := 0;
ObjectTextToTree(ms, DfmTree);

DfmObject := nil;
for i := 0 to DfmTree.OwnedObjectCount - 1 do
if DfmTree.OwnedObject[i].ObjectName = Panel1.Name then
begin
DfmObject := DfmTree.OwnedObject[i];
break;
end;

if DfmObject = nil then
exit;

DfmProperty := DfmObject.PropertyByName('Width');

if DfmProperty = nil then
exit;

Panel1.Width := DfmProperty.IntegerValue;

finally
DfmTree.Free;
ms.Free;
rs.Free;
end;
end;

要使此解决方案发挥作用,您需要 Robert Love 的 DFM parser 的副本

优点: 现在创建虚拟表单的工作量 读取并解析DFM代码

缺点: 更复杂的代码。 第三方库

这两种解决方案都只是一个快速而肮脏的演示,因此您必须自己添加错误处理并使代码更加通用(我刚刚对组件名称进行了硬编码)

我个人会选择解决方案 2。

关于delphi - 代码更改后如何获取组件原始(设计)的Width属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34296604/

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