Delphi:TEditがサイズを変更したときを知る方法は?
質問
iサイズが変更された場合、編集ボックスの周りのアイテムを更新する必要があります。
TEditには OnResize イベントはありません。
編集ボックスは、さまざまなタイミングでサイズを変更できます。例:
- コードで幅/高さを変更する
- DPIスケーリング用にスケーリングされたフォーム
- フォントが変更されました
そして、私は知らない他の人たちと確信しています。
iは、編集ボックスのサイズがいつ変更されたかを知るための単一のイベントを必要とします。編集ボックスをサブクラス化して取得できるWindowsメッセージはありますか?
解決
OnResizeは、TControlの保護されたプロパティとして宣言されています。いわゆる「クラッカー」を使用して公開できます。クラス。ただし、ちょっとしたハックです。
type
TControlCracker = class(TControl);
...
procedure TForm1.FormCreate(Sender: TObject);
begin
TControlCracker(Edit1).OnResize := MyEditResize;
end;
procedure TForm1.MyEditResize(Sender: TObject);
begin
Memo1.Lines.Add(IntToStr(Edit1.Width));
end;
他のヒント
次のようなものを試しましたか:
unit _MM_Copy_Buffer_;
interface
type
TMyEdit = class(TCustomEdit)
protected
procedure Resize; override;
end;
implementation
procedure TMyEdit.Resize;
begin
inherited;
if not (csLoading in ComponentState) then
begin
// react on new size
end;
end;
end.
またはこれ:
unit _MM_Copy_Buffer_;
interface
type
TCustomComboEdit = class(TCustomMaskEdit)
private
procedure WMSize(var Message: TWMSize); message WM_SIZE;
end;
implementation
procedure TCustomComboEdit.WMSize(var Message: TWMSize);
begin
inherited;
if not (csLoading in ComponentState) then
begin
// react on new size
end;
UpdateBtnBounds;
end;
end.
wm_Size
メッセージを処理する。 WindowProc
に新しい値を割り当てることにより、コントロールをサブクラス化します。 プロパティ。他のメッセージを委任できるように、必ず古い値を保存してください。
所属していません StackOverflow