دلفي: كيف يمكنني التوقف عن مفاتيح اختصار التواء التلقائي؟
-
20-08-2019 - |
سؤال
أنا أستخدم قائمة TacedList Delphi ، مع مفاتيح الاختصار لبعض الإجراءات.
أرغب في منع تشغيل بعض الإجراءات عدة مرات عن طريق التكرار التلقائي للوحة المفاتيح ، لكنني أفعل ليس تريد التأثير على عملية التكرار التلقائي على مستوى العالم. ما هي أفضل طريقة للقيام بذلك؟
توضيح: ما زلت بحاجة إلى التعامل مع العديد من المفاتيح السريعة - إنه فقط keypresses الناتجة عن التكرار التلقائي الذي أريد تجاهله.
المحلول
اعتراض wm_keydown الرسائل ، وانظر إلى Bit 30 لمعرفة ما إذا كان التكرار تلقائيًا. إذا كان الأمر كذلك ، فلا تمرر الرسالة كالمعتاد ولن يتم رؤيتها.
قد تحتاج إلى تمكين Form Key-Preview لجعل هذا العمل.
نصائح أخرى
يمكنك إسقاط TTIMER ، تعيين timer.interval على القيمة التي تريدها (1000 = 1SEC) ، ثم في قائمة TaceList تفعل شيئًا مثل:
procedure TfrmMain.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
if Timer1.Enabled then
begin
Handled := True;
Exit;
end;
Handled := false;
Timer1.Enabled := true;
end;
لا تنس أيضًا تعطيل المؤقت Timer.Ontimer.
يمكنك حفظ آخر مرة يتم فيها استخدام إجراء وتجاهله إذا كان الوقت بينهما قصيرًا جدًا. للحصول على عمل واحد يمكنك القيام به مثل:
procedure TForm.FormCreate(const Sender: TObject);
begin
// ...
FLastActionTime := Now; //
end;
proceudure TForm.Action1Execute(const Sender: TObject);
const
cThreshold = 1/(24*60*60*10); // 0.1 sec
begin
if Now-FLastActionTime<cThreshold then
Exit; // Ignore two actions within 0.1 sec
FLastActionTime := Now;
end;
يمكنك الجمع بين هذا مع حل dmajkic للحصول على أكثر من Aproach عام. وإذا كنت طموحًا حقًا ، فيمكنك إنشاء إصدار جديد من قائمة TACTION/TACETING.