دلفي:كيف تعرف متى يتغير حجم TEdit؟
سؤال
أحتاج إلى تحديث العناصر الموجودة حول مربع التحرير عندما يتغير حجمه.
TEdit لا يوجد لديه OnResize حدث.
يمكن تغيير حجم مربع التحرير في أوقات مختلفة، على سبيل المثال:
- تغيير العرض/الارتفاع في الكود
- تم تغيير حجم النموذج لقياس DPI
- تم تغيير الخط
وأنا متأكد من الآخرين الذين لا أعرفهم.
أحتاج إلى حدث واحد لمعرفة متى تغير حجم مربع التحرير.هل هناك رسالة 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
لا تنتمي إلى StackOverflow