Delphi: Come sapere quando un TEdit cambia dimensione?
Domanda
Ho bisogno di aggiornare gli elementi attorno a una casella di modifica quando cambia dimensione.
TEdit non ha eventi OnResize .
Una casella di modifica può essere ridimensionata in vari momenti, ad esempio:
- modifica larghezza / altezza nel codice
- modulo ridimensionato per il ridimensionamento DPI
- font modificato
E sono sicuro che altri non lo so.
Ho bisogno di un singolo evento per sapere quando una casella di modifica ha cambiato la sua dimensione. Esiste un messaggio di Windows che posso sottoclassare la casella di modifica e prendere?
Soluzione
OnResize è dichiarato come proprietà protetta di TControl. Potresti esporlo usando un cosiddetto "cracker" classe. È un po 'un trucco, tuttavia.
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;
Altri suggerimenti
Hai provato qualcosa del genere:
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.
o questo:
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.
Gestisci il messaggio wm_Size
. Sottoclasse un controllo assegnando un nuovo valore a WindowProc
proprietà; assicurati di archiviare il vecchio valore in modo da poter delegare altri messaggi lì.
Vedi anche: wm_WindowPosChanged