Shagrouni

استخدام مفتاح الادخال

خالد الشقروني, 23 ديسمبر 2000

إنكليزي

من الصعب أن تقنع المستخدمين بالتخلّي عن عاداتهم القديمة.

أوراق دلفي

المقالة منشورة في Delphi3000.com
و في www.sourcer.ur (بالروسية)
وفي مكان آخر (بالصينية)

كلّما ركّبت تطبيقا جديدا يستفسر المستخدمون له عن سبب عدم قيام مفتاح الإدخال بالتصرّف بنفس سلوك مفتاح الجدولة 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