تحت أي شروط سوف نيران Tform onResize في العرض؟
سؤال
كملحق هذا السؤال:
يتم تشغيل TForm.OnResize أحيانا قبل إظهار النموذج لأول مرة، ولكن ليس دائما. على سبيل المثال، إذا كان BorderStyle إما BSDialog أو BSNONE، فلن ينطلق OnResize. بالنسبة لجميع قيم Borderstyle الأخرى (ومع جميع الخصائص الأخرى في الإعدادات الافتراضية)، OnResize Doire Fire.
هل هناك أشياء أخرى تؤثر على ما إذا كان OnResize سوف ينطلق قبل عرض النموذج؟ على سبيل المثال، خصائص أخرى، أو مجموعات من الخصائص، والتي يمكن أن تؤثر على هذا؟
حدث onresize هو نتيجة ShowWindow
وظيفة API إرسال WM_SIZE
رسالة إلى النافذة. التي تكررها: تأتي الرسالة من Windows، وليس من دلفي. انها وظيفة ويندوز (ShowWindow
) ذلك (أحيانا) إرسال الرسالة التي تقوم بتشغيل الحدث - وبالتالي فإن رمز مصدر VCL غير مفيد حقا في هذه الحالة.
نقاط المكافأة للإجابات النهائية بناء على موثقة ShowWindow
/ WM_SIZE
السلوك، مثل الإشارات إلى وثائق MSDN أو كتب Petzold.
المحلول
ربما تعتمد حتى على إعدادات عرض المستخدم أو سمة سطح المكتب أو إصدار Windows. إذا كانت OnResize تعطيني مشاكل مثل هذا، فسأبني برنامجي لتتوقع ذلك دائما وتتعامل معها في أي موقف، بغض النظر عن ما أعتقد أنه السبب.
نصائح أخرى
أعتقد أن onresize سوف تطلق النار عندما يقوم الحدث بإرسال رسالة تفيد بأن حجم النموذج (يسار، أسفل، عرض، ارتفاع) سيتم تعديله.
نظرا لأنك اكتشفت بالفعل رسالة تطلق هذا الحدث، فأنت بحاجة الآن إلى تتبع حيث يتم إرسال الرسالة في VCL.
انظر إلى التعليمات البرمجية المصدر VCL لمعرفة ما إذا كان يمكنك تحديد تلك العمليات.
تحرير: دعنا نذهب منخفضا. تحتوي النماذج في Windows (الحديث بشكل صارخ) ما يسمى ب "فئة النافذة" (ليس فئة وكأننا نعرفها OOP). في جميع الأوقات يتم تغيير حجم فئة النافذة من النموذج (والشكل مرئيا)، يتم إرسال WM_SIZE.
لذلك لن يحدث كل الأوقات التي تظهر النموذج، ولكن يتم تغيير أبعادها فقط مقارنة مع فئة النافذة الأساسية.
كما لاحظت، فإن العديد من خصائص Valuez تغيير أبعاد النموذج (حتى بضعة بكسل).
هذا ال سطحي جدا Explanation، هذا طن من التفاصيل الأخرى - لكنه فهمي كيف تعمل الأشياء "تحت غطاء محرك السيارة".
لا يوجد بديل للاختبار. ماذا عن إنشاء نموذج في التعليمات البرمجية، قم بتعيين الخصائص التي تهتم بها وتسجيلها عند استدعاء حدث تغيير الحجم.
إذا كنت ستبذل قصور القبح من التعليمات البرمجية، فإليك دليل تقريبي على المفهوم الذي يختبر جميع مجموعات من Borderstyle والموضع دون ترميز صريح لكل واحد. يمكنك إضافة المزيد من الخصائص وتأخذها بقدر ما تريد. ستجعل أداة مثل CroDesite نظافة تسجيل وتسهيل أيضا.
إنشاء تطبيق مع نموذجين. تأكد من أن المرء الثاني لم يتم إنشاؤه تلقائيا.
في النموذج الثاني، أضف خاصية وإضافة رمز تسجيل قليلا إلى حدث تغيير حجم النموذج:
private
FOnResizeFired: TNotifyEvent;
public
property OnResizeFired: TNotifyEvent read FOnResizeFired write FOnResizeFired;
end;
...
procedure TForm2.FormResize(Sender: TObject);
begin
if Assigned(FOnResizeFired) then
FOnResizeFired(self);
end;
في النموذج الرئيسي، أضف Typinfo إلى جملة الاستخدامات وإفلات زر ومذكرة في النموذج.
إضافة إجراء بسيط:
procedure TForm1.ResizeDetected(Sender: TObject);
begin
Memo1.Lines.Add(' *** Resize detected');
end;
الآن أضف ما يلي إلى حدث ButtonClick:
procedure TForm1.Button1Click(Sender: TObject);
var
lBorderStyle: TFormBorderStyle;
lBorderStyleName: string;
lPosition: TPosition;
lPositionName: string;
lForm: TForm2;
begin
Memo1.Clear;
for lBorderStyle in [low(TFormBorderStyle) .. high(TFormBorderStyle)] do
begin
for lPosition in [low(TPosition) .. high(TPosition)] do
begin
lBorderStyleName := GetEnumName(TypeInfo(TFormBorderStyle), Integer(lBorderStyle));
lPositionName := GetEnumName(TypeInfo(TPosition), Integer(lPosition));
Memo1.Lines.Add(Format('Border: %s Position: %s', [lBorderStyleName, lPositionName]));
Memo1.Lines.Add(' Creating form');
lForm := TForm2.Create(self);
try
Memo1.Lines.Add(' Form Created');
lForm.OnResizeFired := ResizeDetected;
Memo1.Lines.Add(' Setting border style');
lForm.BorderStyle := lBorderStyle;
Memo1.Lines.Add(' Setting Position');
lForm.Position := lPosition;
Memo1.Lines.Add(' Showing form');
lForm.Show;
Memo1.Lines.Add(' Form Shown');
lForm.Close;
Memo1.Lines.Add(' Form Closed');
finally
FreeAndNil(lForm);
Memo1.Lines.Add(' Form Freed');
end;
end;
end;
end;
ستلاحظ أن تغيير حجم الحرائق عند تعيين بعض الخصائص قبل عرض النموذج، وأرى أنه في بعض المجموعات، يبدو أن تغيير الحجم يبدو مرتين عند عرض النموذج. مثير للانتباه.