تطبيقات ومربعات حوار دلفي متعددة الأشكال

StackOverflow https://stackoverflow.com/questions/21749

  •  09-06-2019
  •  | 
  •  

سؤال

لدي تطبيق دلفي 7 يحتوي على عرضين للمستند (على سبيل المثال:قد يحتوي تحرير WYSIWYG HTML على عرض WYSIWYG وعرض مصدر - وليس تطبيقي الحقيقي).ويمكن فتحها في نوافذ منفصلة، ​​أو تثبيتها في علامات التبويب في النافذة الرئيسية.

إذا قمت بفتح مربع حوار مشروط من أحد النماذج المنفصلة، ​​فسيتم إحضار النموذج الرئيسي إلى المقدمة، ويتم عرضه كنافذة محددة في شريط مهام Windows.لنفترض أن النموذج الرئيسي هو عرض WYSIWYG، وأن العرض المصدر قد انبثق.تذهب إلى نقطة معينة في العرض المصدر وتقوم بإدراج علامة صورة.يظهر مربع حوار يسمح لك بتحديد وإدخال الخصائص التي تريدها للصورة.إذا تداخل عرض WYSIWYG مع عرض المصدر، فسيتم إحضار عرض WYSIWYG إلى المقدمة وسيتم إخفاء عرض المصدر.بمجرد رفض مربع الحوار، يعود العرض المصدر إلى الأفق.

لقد حاولت تعيين المالك وخصائص ParentWindow إلى النموذج المرتبط به:

dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;

كيف يمكنني حل هذه المشكلة؟ماذا يجب أن أحاول؟

نظرًا لأن الناس يبدو أنهم يتعثرون في مثالي، فربما يمكنني تجربة مثال أفضل:محرر نصوص يسمح لك بفتح أكثر من ملف في نفس الوقت.الملفات التي قمت بفتحها موجودة إما في علامات تبويب (كما هو الحال في Delphi IDE) أو في نافذتها الخاصة.لنفترض أن المستخدم يعرض مربع حوار التدقيق الإملائي أو مربع حوار البحث.ما يحدث، هو أنه إذا كان الملف يتم تحريره في نافذته الخاصة، فسيتم إرسال تلك النافذة إلى أسفل النموذج الرئيسي بالترتيب z عندما يظهر مربع الحوار المشروط؛بمجرد إغلاق مربع الحوار، يتم إعادته إلى ترتيبه الأصلي.

ملحوظة:إذا كنت تستخدم دلفي 7 وتبحث عن حل لهذه المشكلة، راجع إجابتي في أسفل الصفحة لترى ما انتهى بي الأمر إلى فعله.

هل كانت مفيدة؟

المحلول

سأستخدم هذا الكود...(في الأساس ما قاله لارس)

dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();

نصائح أخرى

انتهى بي الأمر في النهاية بالعثور على إجابة باستخدام مجموعات جوجل.باختصار، تحتاج جميع مربعات الحوار المشروطة إلى إضافة ما يلي إليها:


procedure TDialogForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_POPUP;
  Params.WndParent := (Owner as TWinControl).Handle;
end;

أعتقد أن هذا يعادل إجابات لارس وماريوس في دلفي 7.

هل يظهر مربع الحوار باستخدام ShowModal أم يظهر فقط؟ربما ينبغي عليك تعيين خاصية PopupMode بشكل صحيح في مربع الحوار الخاص بك.من المحتمل أن يكون تطبيقpmAuto هو خيارك الأفضل.راجع أيضًا ما إذا كنت بحاجة إلى تعيين خاصية PopupParent.

أولاً، لست متأكدًا تمامًا من متابعتي، قد تحتاج إلى تقديم بعض التفاصيل الإضافية لمساعدتنا في فهم ما يحدث وما هي المشكلة.أعتقد أنني لست متأكدًا من أنني أفهم بالضبط ما تحاول تحقيقه وما هي المشكلة.

ثانيًا، لا يجب أن تحتاج إلى تعيين أصل مربع الحوار لأن هذا هو ما يحدث بشكل أساسي مع استدعاء الإنشاء (تمرير الأصل).تبدو مربعات الحوار التي تصفها وكأنها يمكن أن تستخدم بعض "إعادة التفكير" قليلاً لنكون صادقين.هل مربع الحوار هذا لإدخال خصائص الصورة تابع للنافذة المصدر أم نافذة WYSIWYG؟

لست متأكدًا من أنني أفهم تمامًا ما تريده، ولكن إليك بعض الأشياء التي يمكنني أن أقترح عليك تجربتها...

  1. يتغير هذا السلوك بين إصدارات دلفي المختلفة.أود أن أقترح أن هذا يرجع إلى الأطواق التي قفزوا من خلالها لدعم نظام التشغيل Windows Vista في دلفي 2007.
  2. إذا كنت تستخدم Delphi 2007، حاول إزالة السطر من الملف المصدر للمشروع الذي يقوم بتعيين المتغير المنطقي Application.MainFormOnTaskBar.
  3. بعد إزالة هذا، يجب أن تكون قادرًا على استخدام أساليب BringToFront / SendToBack المتنوعة للنموذج لتحقيق الترتيب Z الذي تسعى إليه.

أظن أن ما اكتشفته قد تمت مناقشته هذا الرابطبالطبع، ربما فاتني وجهة نظرك تمامًا، لذا أعتذر مقدمًا!

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