Delphi: كيفية تعيين اختصار لوحة مفاتيح UP إلى Action/Menuitem ، والحفاظ عليه فعليًا للتنقل في القائمة (Listbox/VTV)؟
سؤال
الرجاء مساعدتي: كيفية تعيين اختصار لوحة مفاتيح UP إلى عنصر أو عنصر القائمة ، والاحتفاظ به فعليًا للتنقل في القائمة عن التحكم (على سبيل المثال Listbox/Virtual TreeView/آخر) في نفس الوقت؟
شكرًا!
المحلول
تعلق:
وماذا عن لاعب Winamp؟ يحتوي على ميزات رفع مستوى الصوت/مستوى الصوت المعين لمفتاح APSER ARROW ومفتاح السهم لأسفل في المقابل .. حسنًا ، إذا كان ذلك مستحيلًا في دلفي ، ثم ...
لكن من الممكن بالتأكيد ، ليس من الجيد القيام بذلك ، وخلاف إرشادات التفاعل عن تجربة مستخدم Windows.
ولكن إذا كنت قد تم تعيينها على تنفيذها ، فإليك كيف. تجاوز الطريقة التالية في فئة النماذج التي تحتوي على مكونات الإجراء:
function IsShortCut(var Message: TWMKey): Boolean; override;
وفيه يمكنك منع المفتاح لأعلى ولأسفل من إطلاق الإجراءات التي يتم اختصاراتها لـ:
function TWeirdForm.IsShortCut(var Message: TWMKey): Boolean;
begin
if (Message.CharCode in [VK_UP, VK_DOWN])
// insert test whether message needs to go to the focused control instead
and (...)
then begin
// insert calls to code that should be executed instead
Result := False;
exit;
end;
inherited;
end;
لاحظ أنه يجب عليك اختبار حالة التحول الصحيحة أيضًا ، وتحقق من أن الكود لا يكسر أي سلوك آخر يتوقعه المستخدمون ، مثل نقل النافذة باستخدام مفاتيح الأسهم.
نصائح أخرى
على مجموعة خصائص النموذج KeyPreview := true
ثم في حدث keyup لحدث كتابة النموذج للتحقق مما إذا كنت قد تم الضغط على مفتاح UP وجعله يتصل بعنصر القائمة (في عنصر قائمة الحالة هذا يسمى Action1):
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_UP) and (ActiveControl = ListBox1)then
Action11.Click;
end;
procedure TForm1.Action11Click(Sender: TObject);
begin
if ListBox1.ItemIndex >=0 then
ShowMessage(ListBox1.Items[ListBox1.ItemIndex]);
end;
إذا كنت بحاجة إلى تنفيذ Action1 حتى لو لم يكن التحكم الحالي هو صندوق القائمة ، فقم بإزالة ملف and
جزء من IF
بيان