3

サイズが変更されたときに編集ボックスの周りのアイテムを更新する必要があります。

TEditにはOnResizeイベントはありません。

編集ボックスは、さまざまな時点でサイズを変更できます。例:

  • コードの幅/高さを変更する
  • DPIスケーリング用にスケーリングされたフォーム
  • フォントが変更されました

そして、私は私が知らない他の人を確信しています。

編集ボックスのサイズがいつ変更されたかを知るために、単一のイベントが必要です。編集ボックスをサブクラス化して取得できるWindowsメッセージはありますか?

4

3 に答える 3

9

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;
于 2009-09-14T19:45:44.853 に答える
3

次のようなことを試しましたか?

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.
于 2009-09-14T19:45:55.503 に答える
1

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

参照:wm_WindowPosChanged

于 2009-09-14T20:31:53.637 に答える