![]() |
استخدام مفتاح الادخالخالد الشقروني, 23 ديسمبر 2000 | |
من الصعب أن تقنع المستخدمين بالتخلّي عن عاداتهم القديمة.
|
المقالة منشورة في Delphi3000.com كلّما ركّبت تطبيقا جديدا يستفسر المستخدمون له عن سبب عدم قيام مفتاح الإدخال بالتصرّف بنفس سلوك مفتاح الجدولة Tab، للتنقّل من حقل لآخر. (حتى الآن لم تستطع ويندوز أن تغيّر من بعض العادات الموروثة عن ثقافة البيئة النصّية). لذا قمت بكتابة هذه الإجرائية البسيطة، و التي يمكن وضعها داخل مناول حدث KeyDown للنافذة التي تحوي شاشة الإدخال. بالتأكيد هناك العديد من الحلول الأخرى أفضل من الذي قمت به، و لكن أحيانا بناء الشيء بنفسك أسرع من محاولة البحث عنه جاهزا في مكان آخر.
procedure TForm1.EditKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then key := #0;
end;
procedure TForm1.FormKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
var
ACtrl: TWinControl;
k: TKeyPressEvent;
begin
if key = 13 then
begin
ACtrl := ActiveControl;
if ACtrl is TCustomMemo then exit;
if ACtrl is TEdit then
begin
if assigned(TEdit(ACtrl).onKeyPress) then
k:= TEdit(ACtrl).OnKeyPress;
TEdit(ACtrl).OnKeyPress := EditKeyPress;
end;
repeat
ACtrl:= FindNextControl(ACtrl,true,true,false);
until (ACtrl is TCustomEdit) or
(ACtrl is TCustomComboBox) or
(ACtrl is TCustomListBox) or
(ACtrl is TCustomCheckBox) or
(ACtrl is TRadioButton);
if ACtrl is TEdit then
begin
if assigned(K) then
TEdit(ACtrl).OnKeyPress := K;
end;
ACtrl.SetFocus ;
end;
end;
لا تنسى بأن تجعل خاصّية KeyPreview التابعة للنموذج موجبة. كما ترى؛ فإن التوليف يعتمد على وظيفة FindNextControl و التي تقوم بعمل جيد من أجل استحضار المتحكم التالي. و حيث أن كل شاشات الإدخال في برامجي ترث شاشة أصلية واحدة؛ فإني أكتفي بوضع التوليف في حدث KeyDown في نموذج تلك الشاشة، ثم مرحى..، كلّ برامجي ستحتفل بهذا الحدث.
|
Shagrouni 2001 Khaled Shagrouni khaled@shagrouni.com