سؤال

لقد بذلت قصارى جهدي ولا يمكنني معرفة ما حدث هنا. لقد عملت بشكل جيد في Delphi 4. بعد الترقية إلى Delphi 2009 ، لا أعرف ما إذا كانت هذه هي الطريقة التي من المفترض أن تعمل بها ، أو إذا كانت مشكلة:

هذا ما يبدو عليه قائمة برنامج برنامجي في وضع التصميم ضمن Delphi 2009:

enter image description here

لاحظ أن كل كلمة في القائمة الرئيسية والرسم الفرعي للملف لها خطاب واحد. من المفترض أن يكون هكذا. يُطلق على هذا الحرف الذي تحته خطًا مفتاح Accelerator وهو قياسي في تطبيقات Windows بحيث يمكنك استخدام مفتاح Alt-key وتلك الحرف لتحديد عنصر القائمة بسرعة ثم عنصر القائمة الفرعية مع لوحة المفاتيح بدلاً من الماوس.

يمكنك الحصول عليها بهذه الطريقة باستخدام حرف "&" كجزء من تعليق العنصر ، على سبيل المثال: حفظ و AS ...

عندما أقوم بتشغيل طلبي ، وأستخدم الماوس لفتح قائمة الملف ، يبدو أن هذا:

enter image description here

تم التأكيد على الأحرف في القائمة الرئيسية ، ولكن لا يتم التأكيد عليها في قائمة الملفات.

إذا كنت بدلاً من ذلك ، فأنا أستخدم مفتاح Alt-F لفتح القائمة الفرعية للملفات ، فإنه يبدو صحيحًا مثل هذا:

enter image description here

ويتم تسطير جميع رسائل أسرع أسرع بشكل صحيح.

لقد لعبت مع خيار AutoHotkeys ولكن هذه ليست المشكلة.

هل واجه شخص ما هذه المشكلة من قبل؟ هل المثال في الصورة الثانية الصحيح السلوك الذي لا أعرفه؟ أم أن هناك بعض الخيارات أو خطأ الترميز الذي قد فاتني؟


نوفمبر 2009 (بعد عام واحد): يبدو أن Mghie قد وصل إلى جذر هذا واكتشف المشكلة. انظر إجابته المقبولة أدناه.

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

المحلول

يوجد إعداد قياسي لنظام التشغيل Windows (ضمن خصائص العرض) لإخفاء هذه التسريع عادة ما لم يتم وضع مفتاح ALT. هذا من شأنه أن يفسر لماذا فتح القائمة مع ALT+F10 يوضح لك لك. ربما هذا هو السبب؟

تحرير]: لا ، إنه ليس كذلك. لقد جربت للتو ، وتوضح TForm بسيطًا مع عنصر قائمة القائمة مسرع ، ولكن بمجرد إضافة timagelist وأعين ImageIndex لعنصر القائمة المفردة ، أو ببساطة تعيين Ownerdraw على True ، ثم يختفي تسطير Accelerator. أعتقد أن هذا بالفعل خطأ في VCL.

راجع للشغل ، هذا على Windows XP.

الحل البديل:

لقد قمت بتصحيح هذا باستخدام Delphi 2009 على Windows XP 64 ، ويبدو أن السبب الجذري للمسرعات المفقودة هو أن Windows يرسل WM_DRAWITEM الرسائل مع ODS_NOACCEL مجموعة العلم ، والتي لا ينبغي أن إذا تم تعيين النظام لإظهار مسرعات في جميع الأوقات. لذلك يمكنك القول أنه ليس خطأ VCL ، ولكن مشكلة Windows التي لا تعمل VCL.

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

protected
  procedure WndProc(var Message: TMessage); override;

مثل ذلك:

procedure TYourForm.WndProc(var Message: TMessage);
const
  ODS_NOACCEL = $100;
var
  pDIS: PDrawItemStruct;
  ShowAccel: BOOL;
begin
  if (Message.Msg = WM_DRAWITEM) then begin
    pDIS := PDrawItemStruct(Message.LParam);
    if (pDIS^.CtlType = ODT_MENU)
      and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0)
    then begin
      if ShowAccel then
        pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL;
    end;
  end;
  inherited;
end;

هذا هو رمز العرض التوضيحي فقط ، يجب ألا تتصل SystemParametersInfo() في كل مرة أ WM_DRAWITEM تم استلام الرسالة ، ولكن بمجرد بدء تشغيل البرنامج ، ثم في كل مرة يتلقى فيها البرنامج ملف WM_SETTINGCHANGE رسالة.

نصائح أخرى

إنها "ميزة" تم تقديمها مع Windows 2000:

الشيء الجديد القديم: لماذا يخفي Windows مسرعات لوحة المفاتيح وتركيز المستطيلات بشكل افتراضي؟

يبدو أن Delphi 4 لم تدعم ميزة Windows هذه.

للحصول على مفاتيح مسرعات 2000 و XP ، انقر بزر الماوس الأيمن على بقعة فارغة على سطح المكتب ، واختر الخصائص ، وانقر فوق علامة التبويب "المظهر" ، وتحت الآثار ، دون التحقق إخفاء الرسائل المسطحة للتنقل في لوحة المفاتيح حتى أضغط على مفتاح Alt. انقر فوق موافق مرتين.

لست متأكدًا من كيفية القيام بذلك في Vista.

لا أعتقد أنه خطأ تم إنشاؤه في Delphi لأن لديك نفس السلوك مع Notepad على Vista. أيضا في دلفي نفسها راجع للشغل ...
يجب أن أعترف أنني لم أهتم قبل سؤالك. شكرا لتوجيهها.

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

لقد تم تكوين XP الخاص بي لإظهار المسرعات في جميع الأوقات ، لكن اختبارًا سريعًا مع هذا الخيار الذي تم تغييره يؤكد أن القوائم يجب ألا تُظهر السلة أيضًا (استجابت Visual Studio كما كنت أتوقع ، لا توجد خطوط أسطية عند استخدام الماوس). ومع ذلك ، تتجاهل Microsoft Office هذا الإعداد ويظهر دائمًا السلة. لذلك يبدو وكأنه خطأ في كيفية رسم القوائم في دلفي (ليس لدي أي خبرة مع دلفي بنفسي).

لقد وجدت خيار Vista أيضًا: http://www.vistax64.com/vista-general/42125-always-how-menu-underline-keyboard-accelerators.html

يمكنك تشغيل هذا في مركز Access Center الجديد (انتقل إلى لوحة التحكم ، وانقر فوق سهولة الوصول ، ثم انقر فوق Ease of Access Center). في سهولة الوصول إلى مركز الوصول ، انقر فوق جعل لوحة المفاتيح أسهل في الاستخدام ، وفي الجزء السفلي للغاية حدد اختصارات لوحة المفاتيح المتطرفة ومربع الاختيار مفاتيح الوصول.

أثناء إجراء مزيد من الأبحاث ، وجدت أن هذا الخطأ ذو الصلة في منتديات Delphi: http://qc.codegear.com/wc/qcmain.aspx؟d=37403

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

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