سؤال

لقد قمت بإنشاء اثنين من التطبيقات MainApps و subaps ، و subapps لديها مربع الحوار نوع مشروط مثل نموذج تسجيل الدخول/تسجيل الدخول وما إلى ذلك وعمله بشكل جيد.

بعد إرفاقه بـ MainApps ، يظهر مربع الحوار الوسيط مثل نموذج المربع العادي. يتصرف مثل "Dialog.show" بدلاً من "Dialog.ShowModal" ؛

أنا أستخدم برنامج التحويل البرمجي Delphi

subapps buttlick.

  begin
    with TfrmDialog.Create(Self, dtLogout) do
    try
      iMsgResult := ShowModal;
    finally
      Free;
    end;
    if iMsgResult = mrOk then
    begin
      dmVoca.FHomeworkXMLDoc.Active := False;
      //Disabled Double Login
      dmVoca.tmrDoubleLogin.Enabled := False;
      ................
    end;  
  end;

MainApps buttlick

begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
هل كانت مفيدة؟

المحلول

لا تتفاجأ ، ما تحاوله أمر غير عادي في أحسن الأحوال. ShowModal يحقق التأثير المشروط عن طريق تعطيل جميع نوافذ مؤشر ترابط الاتصال ولكن النموذج المشروط. نظرًا لأن نموذج الوالدين لا ينتمي إلى نفس الخيط ، ولا حتى في نفس العملية ، فإنه لا يتم تعطيله. نرى DisableTaskWindows في forms.pas لفهم كيفية تعطيل النماذج عند استدعاء "showmodal".

يجب عليك وضع الإجراء الخاص بك ؛ اختبر ما إذا كان التطبيق قد تم وضعه في نافذة المستوى الأعلى الذي لا يكون سطح المكتب ، وقم بتعطيل تلك النافذة إذا كان هذا هو الحال.

ولكن إذا كنت أنت ، فسأفكر في التصميم أولاً ، ماذا لو كنت تغلق نموذج الوالدين ، كيف يمكنك إنهاء عملية النموذج الوالدين؟


تعديل: للحصول على التعليق الثالث أدناه - قد تحاول الحصول على النموذج المشروط "المملوك" حسب نموذج MainApps. مشابه للنماذج التي تملكها النموذج الرئيسي للتطبيق أثناء التطبيق MainFormOnTaskbar صحيح. نرى النوافذ المملوكة على ميزات النافذة موضوع MSDN.

var
  frmDialog: TfrmDialog;
begin
  [...]
  frmDialog := TfrmDialog.Create(Self, dtLogout);
  try
    SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
    iMsgResult := frmDialog.ShowModal;
    [...]


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

نصائح أخرى

حاول جعل نظام Windows "Modal" بدلاً من "Modal Application". في الواقع ، ليس لدي أي فكرة عما إذا كان يمكنك القيام بذلك. قد يكون من المستحيل ، أو فكرة سيئة. في الواقع ، فإن السؤال برمته يعطيني رائحة "الفكرة السيئة".

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