كيف يمكنني التقاط الحدث Click للزر الذي يحتوي على TDBGrid كوالدي؟

StackOverflow https://stackoverflow.com/questions/748190

  •  09-09-2019
  •  | 
  •  

سؤال

لدي زر صغير أريد إضافته إلى الركن الأيسر العلوي من مكون Delphi TDBGrid (في خلايا الرأس / العنوان). أنا قادر على وضع الزر بسهولة، ولكن الآن لا يتم التعامل مع الحدث Click. أنا أظن أن الحدث يجري اشتعلت من قبل الشبكة. بأي طريقة يمكنني إجبار هذا الحدث المحدد للذهاب إلى الزر بدلا من ذلك؟ ملاحظة ما زلت بحاجة إلى الشبكة لمعالجة الأحداث انقر فوق أزرار عنوانها كما يفعل حاليا.

procedure TForm38.FormCreate(Sender: TObject);
begin
   button1.Parent := grid;
   button1.Top := 0;
   button1.Left := 0;
   button1.Width := 12;
   button1.Height := 18;
   button1.OnClick := Button1Click;
end;

** التحديث: ** لقد وجدت أنني كنت قادرا على استخدام حدث Mousedown في الزر الذي يبدو أنه يعمل بشكل جيد، لكنني لم أستطع استخدام الحدث Click.

procedure TForm38.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if ( Button = mbLeft ) then
      TButton(Sender).Click;
end;
هل كانت مفيدة؟

المحلول

لست متأكدا من السبب في تناول رسالة Click. يمكنك بالفعل محاكاة الحدث Click من خلال معالج أحداث الماوس.

procedure TForm38.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ctrl: TButton;
begin
  ctrl := Sender as TButton;
  if (x > 0) and (x < ctrl.Width) and (y > 0) and (y < ctrl.Height)  then
    ctrl.Click;
end;

إذا قمت باختبار زر عادي، فسترى أن حدث النقر لا يحدث حتى تحرير الماوس. محاكاة النقر على زر أسفل يخلق سلوكا فرديا.

نصائح أخرى

نجاح باهر، هذه تشويلة. لا يحتوي TDBGRID على معالج الأحداث "OnClick" عام، ويجعل وضع زرك صعوبة في مزيفه. الشيء الوحيد الذي يمكنني التفكير فيه هو إنشاء مكون الخاص بك. هذا ليس صعبا كما قد يبدو في البداية. ينزل من TDBGrid وتجاوز طريقة الماوس. ألق نظرة على الطريقة التي يتم بها تنفيذ tcustomdbgrid.mouseup. لم أختبر هذا، ولكن ربما يمكنك تجربة شيء مثل هذا: بعد بيان إذا اختبارات

(cell.x >= FIndicatorOffset)

وينطلق عند النقر فوق الأحداث، هل أطلق النار على titleclick (nil) أو شيء ما إذا كانت cell.x <findicatoroffet. ثم قم بتوصيل معالج حدث إلى حدث ONTITLECLICK الخاص بالشبكات التي تستدعي button1.click إذا كان العمود = NIL. (نعم، نوع من الاختراق، لكنني لا أستطيع التفكير في طريقة أسهل للقيام بذلك. إذا كنت أنت سأبلغ هذا واحد إلى مراقبة الجودة كحزع.)

فيما يلي حل نظيف، حاول بنجاح كل من Delphi 1 و Delphi 2007:

procedure TForm38.FormCreate(Sender: TObject);
begin
   button1.Parent := grid;
   button1.Top := 0;
   button1.Left := 0;
   button1.Width := 12;
   button1.Height := 18;
   button1.OnClick := Button1Click;

   // only add this line
   button1.ControlStyle := button1.ControlStyle + [csClickEvents];

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