2009-09-14 8 views
3

J'ai besoin de mettre à jour des éléments autour d'une boîte d'édition quand elle change de taille.Delphi: Comment savoir quand un TEdit change de taille?

TEdit n'a pas d'événement OnResize.

Une zone d'édition peut redimensionner à plusieurs reprises, par exemple:

  • changer largeur/hauteur sous forme de code
  • mis à l'échelle pour DPI mise à l'échelle
  • police
  • changé

Et je suis sûr que d'autres je ne sais pas.

J'ai besoin d'un seul événement pour savoir quand une boîte d'édition a changé de taille. Y at-il un message Windows que je peux sous-classer la boîte d'édition pour et saisir?

+0

Vous voulez tirer le OnResize lorsque vous modifiez le code? Comment c'est? – Havenard

+0

@Havenard: Hein? –

+0

@Havenard: Ian signifie que la taille change dans le code au moment de l'exécution, et non s'il change réellement le code au moment du design. –

Répondre

9

OnResize est déclaré comme propriété protégée de TControl. Vous pourriez l'exposer en utilisant une classe dite "cracker". C'est un peu un hack, cependant.

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; 
+1

Plus élégant, et montre des fuites d'abstraction qui fuient dans la plupart des bibliothèques OO. –

3

Avez-vous essayé quelque chose comme ceci:

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. 

ou ceci:

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. 
1

Gérer le message wm_Size. Sous-classer un contrôle en affectant une nouvelle valeur à sa propriété WindowProc; assurez-vous de stocker l'ancienne valeur afin de pouvoir y déléguer d'autres messages.

Voir aussi: wm_WindowPosChanged

Questions connexes