سؤال

لدي شكل مع MAINMENU وأريد اعتراض متى يحدد المستخدم عنصر أمر من قائمة. هذا يعمل في دلفي:

type
  TForm1 = class(TForm)
    ... // Memo and MainMenu created
  protected
    procedure WMCommand(var Info: TWMCommand); message WM_COMMAND;
  end;


procedure TForm1.WMCommand(var Info: TWMCommand);
begin
  if (Info.ItemID < 10) then
    Memo1.Lines.Add('WMCommand ' + IntToStr(Info.ItemID));
end;

في Mainmenu أضفت بعض العناصر وعندما حدد العناصر من القائمة ثم ملء My Memo1 مع:

WMCommand 2
WMCommand 3
WMCommand 3
WMCommand 2
WMCommand 5
...

قمت باستكشاف هذا التطبيق إلى FPC / Lazarus، ولكن يبدو أن معالج WM_COMMAND لا يسمى! عندما وضعت نقطة توقف في TForm1.WMCommand في دلفي ثم توقف دلفي عدة مرات قبل ظهور النموذج الرئيسي. لا تتوقف لعازر أبدا على نقطة التوقف هذه. أعتقد أن شيئا ما مكسور مع WM_COMMAND في لازاروس، ولكن ربما لا أعرف شيئا. اي فكرة؟

أنا استخدم Lazarus 0.9.28.2 Beta مع FPC 2.2.4 على WinXP.

تعديل:

باستخدام WinSpector، راجعت أن Mainmenu يولد WM_COMMAND:

WM_COMMAND
    Code: 0
    Control ID: 2
    Control HWND: 0x00000000
    Message Posted
    Time: 09:37:14.0968

أعتقد أن هناك علة في Lazarus / FPC في طريقة التعامل مع طريقة الرسائل WM_COMMAND وأبلغت ذلك: http://bugs.freepascal.org/view.php؟id=15521.

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

المحلول

في تطبيق LCL لديك الطبقات التالية:

  • تطبيق
  • LCL.
  • واجهة مجموعة القطعة (مثل Win32 / Win64، كيو تي، GTK2، الكربون)
  • مجموعة القطعة

WM_COMMAND هي رسالة Winapi من طبقة Widgetset إلى طبقة واجهة مجموعة القطعة. لا يتم تمرير هذه الرسائل إلى الطبقات العليا، بعد أخذ قابلية النقل في الاعتبار، لا تنتج مجموعات القطعة الأخرى هذه الرسائل.

إذا كنت ترغب في التقاط الرسالة، فيجب عليك كتابة رمز عنصر واجهة مستخدم غير قابل للتحمل (رمز Winapi في هذه الحالة). يمكنك تجاوز WindowProc مع setwindowlong. انظر لازاروس ويكي مثال.

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