سؤال

في الطريقة الأولى في شكل دلفي، حدد أنه يجب فتح مربع حوار تلقائيا بمجرد فتح النموذج - ويجب أن أكون قادرا على القيام بذلك عن طريق محاكاة النقر على menuitem.

ومع ذلك، فإن الاتصال menuitem.click يجلب الحوار قبل فتح النموذج الرئيسي - وهذا ليس ما أريد.

أتوقع أن تفعل ما أريد، لكن لا يمكنني العثور على المعلمات التي سيتم تمريرها من أجل "WPARAM" لإرسال النقر إلى My Menuitem.

PostMessage(handle, WM_COMMAND, wparam, 0)

ال MSDN WM_COMMAND DOCS. تحدث عن معرفات IDM_ *، ولكن كيف يظهر ذلك في دلفي؟

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

المحلول

ربما يمكنك محاولة فتح مربع الحوار في الحدث OnActivate؟ أنا لست متأكدا حقا ما إذا كان OnActivate يتم إطلاق النار مرة أخرى بخلاف متى يظهر النموذج ولكن إذا كان بإمكانك استخدام:

procedure TForm1.FormActivate(Sender: TObject);
begin
  Form2.ShowModal;
  Self.OnActivate := nil;
end;

نصائح أخرى

(أعرف أن هذا سؤال قديم للغاية ولكن على الرغم من حلها بطريقة ما سؤال حقيقي لقد ذهب حقا دون إجابة.)
--

معرف عنصر الأوامر ل "Tmenuitem" هو في Command خاصية. وفقا ل WM_COMMAND's توثيق سيكون الكلمة العالية من "WPARAM" هي "0" والكلمة المنخفضة هي معرف القائمة؛

PostMessage(Handle, WM_COMMAND, MakeWParam(MyMenuItem.Command, 0), 0);

أو ببساطة؛

PostMessage(Handle, WM_COMMAND, MyMenuItem.Command, 0);


مع عنصر القائمة المنبثقة، سيكون هناك فرق بسيط: تعالج VCL رسائل القوائم المنبثقة مع نافذة فائدة مختلفة. العالمية profupplist. المتغير لديه المقبض لذلك في Window خاصية؛

PostMessage(PopupList.Window, WM_COMMAND, MyPopupMenuItem.Command, 0);

ألا تضطر إلى القيام بذلك مع توقيت لمرة واحدة، إذا كنت تريد أن تظهر النموذج وفقا لمعرض / ShowModal عادي، فسيتم رسم (إلخ) بالكامل، و ومن بعد تفعل على الفور شيء آخر؟

tmrkickoff: ttimer، 100 ms الفاصل الزمني، تعطيل في وقت التصميم، والحرائق قبالة حدث "Tmrkickofftimer". في شكل إنشاء، tmrkickoff.Enabled: = خطأ؛ / / فقط في حالة حدوث شيء ما في IDE في عرض النموذج، في نهاية جميع الاشياء الأخرى؛ tmrkickoff.enabled: = صحيح؛ في tmrkickofftimer تبدأ tmrkickofftimer.enabled: = خطأ؛ menuitemclick (nil)؛ نهاية؛

مع الاعتذار عن الأناقة، شكل وأي محاصرة خطأ :-)

بدلا من ذلك، قم بتعامل مع تطبيق التطبيق.

if not DialogDone then
begin
    MyDialogForm.ShowModal; // or menuItem.Click ....
    DialogDone := true;
end;

لن ينطلق Onidle (لأول مرة) حتى يتم عرض النموذج وتنطيب الرسائل فارغة.

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

-علامة

procedure WMPostStartup(var Message: TMessage); message WM_POSTSTARTUP;

procedure TMainForm.WMPostStartup(var Message: TMessage);
begin
  Self.Refresh;
  // Now show the dialog box.
end;

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

const
  wm_SpecialProc = wm_User + 1;

procedure TForm1.WMSpecialProc(var Message:tMessage); message wm_SpecialProc;
begin
  Form2.ShowModal;
end;

procedure TForm1.OnShow(Sender:tObject);
begin
  if true then
    PostMessage(Application.MainForm.Handle,wm_SpecialProc,0,0);
end;

الشيء الجميل في هذه الطريقة هو أنك تتحكم في جيل الرسائل، لذلك يمكن أن تملأ أي lparam أو wparam تريد استخدامها لاحقا من قبل معالجتك. لقد أرسلت الرسالة مباشرة من خلال التطبيق. Mainform ولكنك يمكن أن تقول أيضا التعامل مع النموذج الحالي.

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