我試圖實現IP編輯。這是我的代碼:更改寬度SysIPAddress32
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
結果Btn1.Click
後:控制自己的改變寬度,但不會改變寬度內編輯。
我通過兩種方式
- 使用RecreateWnd嘗試修復。這工作,但恕我直言,其醜陋的解決方案。
- 修正了內部編輯寬度的問題。這工作,但很難 執行,由於控制的內部工作
也許我錯過了什麼,有一個更簡單的解決方案?
編輯:
我測試RecreateWnd,但使用的DevExpress佈局控制時,它不能使用。似乎佈局控件使用繞過SetBounds方法的API直接調用。在這種情況下RecreateWnd不能使用。
最後的結論是:
- RecreateWnd是一些ristrictions
- RepeatUntil簡單的解決方案answer比較困難,但總是工作
VCL中的很多東西都使用'RecreateWnd'來應用窗口更改。它有時可能不是最佳解決方案,但它也不是一個難看的解決方案。 –