مشاكل في showmodal بعد التعيين إلى setParent (..)
-
27-09-2019 - |
سؤال
لقد قمت بإنشاء اثنين من التطبيقات 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". في الواقع ، ليس لدي أي فكرة عما إذا كان يمكنك القيام بذلك. قد يكون من المستحيل ، أو فكرة سيئة. في الواقع ، فإن السؤال برمته يعطيني رائحة "الفكرة السيئة".