مشكلة مع الكشف عن حركات الماوس في TcxGrid عندما سحب الملفات من مستكشف ويندوز

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

سؤال

لقد أضافت مؤخرا ميزة تطبيق كبير مكتوب في دلفي (نسخة 2009) التي تسمح للمستخدم بسحب الملفات من مستكشف Windows وإسقاط لهم على TcxGrid التحكم.لقد حققت ذلك عبر الطريقة الشائعة ربط بلدي نافذة proc إلى الشبكة و اعتراض WM_DROPFILES الرسالة:

 originalGridWindowProc := cxGrid.WindowProc; // remember the old one
 cxGrid.WindowProc := GridWindowProc;  // assign the new one
 DragAcceptFiles(cxGrid.Handle, LongBool(True)); // setup to accept dropped files

أنا الآن أحاول أن تعزيز هذه الميزة للكشف عن عندما يقوم المستخدم قطرات الملف على صف موجود في الشبكة ، والتي سوف تبدأ عملية الكتابة فوق ملف موجود مع نسخة جديدة.

كانت فكرتي الأولى لمعرفة ما إذا كان عنصر تحكم الشبكة تمرير الماوس الحدث من شأنه العمل.لا ، ولكن ليس أثناء عملية السحب.

وبعد ذلك استخدم برنامج يسمى Winspector أن نرى ما هي الرسائل التي تم إرسالها إلى الشبكة التحكم كما يتم نقل الماوس على الشبكة, و لا يمكن الآن الكشف عن ما صف الماوس فوق و تسليط الضوء عليه.أنا باستخدام نفس الأسلوب على النحو الوارد أعلاه, ولكن في هذه الحالة أنا المهيمن النافذة proc عن GridSite وليس الشبكة نفسها ، لأن هذا هو من حيث الرسائل تظهر أن تسير وفقا Winspector:

  originalGridSiteWindowProc := cxGrid.ActiveView.Site.WindowProc;
  cxGrid.ActiveView.Site.WindowProc := GridSiteWindowProc;

هنا هو جسد GridSiteWindowProc:

procedure Tfrm.GridSiteWindowProc(var message: TMessage);
var
  hitTest: TcxCustomGridHitTest;
  gridRecord: TcxCustomGridRecord;
begin
  //Log(IntToStr(message.Msg));
  case message.Msg of
    WM_NCHITTEST: begin
      hitTest := cxGrid.ActiveView.GetHitTest(cxGrid.ScreenToClient(Mouse.CursorPos));
      if hitTest is TcxGridRecordCellHitTest then begin
        gridRecord := TcxGridRecordCellHitTest(HitTest).GridRecord;
        if Not gridRecord.Focused then
          gridRecord.Focused := True;
      end;
      originalGridSiteWindowProc(message);
    end
    else
      originalGridSiteWindowProc(message);
  end;
end;

كما ترون أنا محاصرة WM_NCHITTEST الرسالة لتحقيق ذلك.وفقا Winspector هذه الرسالة أيضا يحصل إرسالها إلى الشبكة موقع النافذة أثناء عملية السحب ، ولكن إذا كنت uncomment أن سجل() البيان الذي سيتم إخراج الرسالة القيمة إلى سلسلة قائمة (التي يدويا تفريغ حقل المذكرة بعد ذلك) ، لقد قرر أن لسبب ما, أنا فقط الحصول على واحد أو اثنين من هذه الرسائل عند سحب الملف عبر الشبكة.

الآن - هنا الجزء المثير:إذا كان لدي Winspector تشغيل ومراقبة الرسائل الذهاب إلى تلك النافذة ، وفجأة تبدأ في الحصول على كل WM_NCHITTEST الرسائل خلال ملف عملية السحب.هذا هو الحال أيضا إذا كنت إخراج قيمة عدد صحيح من جميع الرسائل القادمة إلى النافذة proc مباشرة إلى سجل منفصل النافذة بدلا من أن سلسلة قائمة العازلة الأولى.وأنا على أمل أن شخصا ما سوف تكون قادرة على تقديم بعض فكرة لماذا يحدث هذا أو كيفية الحصول على هذا العمل.

هل كانت مفيدة؟

المحلول

بدلا من استخدام WM_DROPFILES الرسالة, يجب عليك استخدام OLE drag'n'drop.نظرة على RegisterDropTarget API.يمكنك الحصول على معلومات أكثر تفصيلا حول حيث سحب أو إسقاط يجري.يمكنك أيضا قبول أكثر أنواع السحب الكائنات.

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