質問

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 に新しい値を割り当てることにより、コントロールをサブクラス化します。 プロパティ。他のメッセージを委任できるように、必ず古い値を保存してください。

参照: wm_WindowPosChanged

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top