私は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
前後編集。
は、私は2つの方法
- 使用RecreateWndで修正をしてみてください。これは動作しますが、IMHOはその醜い解決策です。
- 内部編集幅を手動で修正しました。これは動作しますが、たぶん私は何かを逃し、簡単な解決策があるため、制御
の内部作業に、実装 に難しいですか?
は編集:
は私がRecreateWndをテストしたが、DevExpress社のレイアウトコントロールを使用する際には使用できません。レイアウトコントロールは、SetBoundsメソッドをバイパスするAPIの直接呼び出しを使用するようです。この場合RecreateWndは使用できません。
最終的な結論は次のとおりです。
- RecreateWndは、いくつかのristrictionsでシンプルなソリューション
- あるRepeatUntil answerより難しいが、常に制御を更新するためのメカニズムを提供していません
VCLの多くは、ウィンドウの変更を適用するために 'RecreateWnd'を使用しています。時には最適なソリューションではないかもしれませんが、醜い解決策ではありません。 –