سؤال

وعندما يقوم المستخدم بالنقر نقرا مزدوجا فوق dbgrid، I إظهار نموذج غير مشروط.

وعندما يغلق هذا الشكل، أريد لتحديث الشبكة.

لتحقيق ذلك، لقد حاولت ما يلي:

1 - تعريف ثابت رسالة مخصصة:

const
  WM_REFRESH_MSG = WM_USER + 1;  //defined in a globally available unit

2 - في حال عند_الإغلاق بلدي شكل غير مشروط، ولدي هذا:

procedure TMyNonModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PostMessage(Self.Handle,WM_REFRESH_MSG,0,0);
end;

و3 - في تصريحات خاصة للنموذج الذي يحمل dbGrid، ولدي هذا:

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;

...

procedure TMyFormWithADBGrid.OnRefreshRequest(var Msg: TMessage);
begin
  RefreshGrid;
end;

وبعد القيام بهذه الأشياء، وPostMessage يطلق على ما يرام، ولكن OnRefreshRequest الإجراء يعمل أبدا. ما أفعل الخطأ؟

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

المحلول

وبصرف النظر عن اسم الرسالة في الرد الأخرى، التي تقوم بالإرسال رسالة إلى Self.Handle في حين يجري الذاتي بعيدا. ربما كنت تعني للنشر إلى مقبض مختلفة (النافذة التي أطلقت مشروط واحد). إعطاء الخاص بك الوصول إطار غير مشروط لذلك المقبض عند إنشائه، ونشر الرسالة هناك بدلا من ذلك.

نصائح أخرى

لاحظ أن WM_USER ليست ثابتة الصحيح لقاعدة الرسائل الخاصة بك على، إلا إذا كنت تكتب عنصر تحكم مخصص تنازلي مباشرة من TWinControl. استخدام WM_APP بدلا من ذلك.

وكما انها تعتبر اسلوب جيد لاستخدام UM_ للعضو الرسالة بدلا من WM_ لأن من المفترض أن تكون محفوظة لرأس الملفات ويندوز التي البادئة.

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

وبخلاف ذلك، وتنفيذ WM_REFRESH_MSG بشكل صحيح (CheGueVerra قد يصح) يجب أن تعمل بشكل جيد.

وكنت قد تحاول وتغيير نهاية التصريح لتتناسب مع الرسالة التي تحاول إرسال.

procedure OnRefreshRequest(var Msg: TMessage); message WM_CEA_REFRESH;

وينبغي أن يكون هذا

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;

ولقد قمت بتحميل مثال "ما الذي كيفن تفعل؟" لembarcadero.public.attachments منتدى الأخبار EMBARCADERO ل.

واساسا انها حدث مخصص أن النموذج الرئيسي (أو أيا كان شكلها / يعترض تريد) يشترك في عند إغلاق النموذج غير مشروط. في النموذج الرئيسي (أو أيا كان) ...

var
  NonModalForm :TfmNonModalForm;
begin
  NonModalForm := TfmNonModalForm.Create(nil); 
  NonModalForm.Execute(NonModalFormClosingListener);

في أسلوب التنفيذ

procedure TfmNonModalForm.Execute(YourListenerMethod: THeyIClosedEvent);
begin
   FHeyIClosedEvent := YourListenerMethod;
   Show();
end;

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

وحظا سعيدا

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