سؤال

كملحق هذا السؤال:

يتم تشغيل 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;

ستلاحظ أن تغيير حجم الحرائق عند تعيين بعض الخصائص قبل عرض النموذج، وأرى أنه في بعض المجموعات، يبدو أن تغيير الحجم يبدو مرتين عند عرض النموذج. مثير للانتباه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top