gpt4 book ai didi

delphi - 更改宽度 SysIPAddress32

转载 作者:行者123 更新时间:2023-12-03 15:55:50 26 4
gpt4 key购买 nike

我正在尝试实现 IP 编辑。这是我的代码:

unit Main;

interface

uses
System.SysUtils, System.Classes,
Winapi.Windows, Winapi.Messages, Winapi.CommCtrl,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.ComCtrls;

type

TIpEdit = class(TWinControl)
strict protected
procedure CreateParams(var Params: TCreateParams); override;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
procedure WMSetFont(var Message: TWMSetFont); message WM_SETFONT;
end;

TMainForm = class(TForm)
Btn1: TButton;
procedure FormCreate(Sender: TObject);
procedure Btn1Click(Sender: TObject);
private
FIpEdit: TIpEdit;
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

{$R *.dfm}

{ TIPEdit }

procedure TIPEdit.CreateParams(var Params: TCreateParams);
begin
InitCommonControl(ICC_INTERNET_CLASSES);
inherited CreateParams(Params);
CreateSubClass(Params, WC_IPADDRESS);
Params.Style := Params.Style or WS_TABSTOP or WS_CHILD;
end;

procedure TIPEdit.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := Message.Result or DLGC_WANTARROWS;
end;

procedure TIPEdit.WMSetFont(var Message: TWMSetFont);
var
LF: LOGFONT;
begin
if GetObject(Message.Font, SizeOf(LF), @LF) <> 0 then
begin
Message.Font := CreateFontIndirect(LF);
inherited;
end;
end;

{ TMainForm }

procedure TMainForm.Btn1Click(Sender: TObject);
begin
FIpEdit.Width := FIpEdit.Width + 100;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
FIpEdit := TIpEdit.Create(Self);
FIpEdit.Parent := Self;
FIpEdit.SetBounds(10, 10, 120, 21);
end;

end.

在 Btn1.Click 之前

enter image description here

Btn1.Click 之后

enter image description here

结果:控制更改自己的宽度,但不更改内部编辑的宽度。

我尝试通过两种方式修复

  • 使用RecreateWnd。这可行,但恕我直言,这是一个丑陋的解决方案。
  • 手动修复内部编辑宽度。这可行,但很难由于控制的内部工作而实现

也许我错过了一些东西并且有一个更简单的解决方案?

编辑:

我测试了RecreateWnd,但在使用DevExpress布局控件时无法使用。看来布局控制是绕过SetBounds方法直接调用API。在这种情况下,无法使用RecreateWnd

最终结论是:

  • RecreateWnd是一个简单的解决方案,但有一些限制
  • 重复直到 answer 更困难,但始终有效

最佳答案

该控件不提供在创建后更新其布局的机制。是的,您可以破解内部编辑控件,但这很危险。您将依赖于可能会发生变化的未记录的实现细节。

总之,我想说重新创建窗口是最好的解决方案。

关于delphi - 更改宽度 SysIPAddress32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45630282/

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