दिलचस्प पोस्ट
मैं onClick हैंडलर के अंदर जावास्क्रिप्ट कोड के अंदर एक स्ट्रिंग से कैसे बचूं? क्या स्विफ्ट-आधारित एप्लिकेशन ओएस एक्स 10.9 / आईओएस 7 और कम पर काम करते हैं? जावा Enum परिभाषा छोरों के लिए टपल अनपैकिंग में जीमेल त्रुटि: एसएमटीपी सर्वर को एक सुरक्षित कनेक्शन की आवश्यकता होती है या क्लाइंट को प्रमाणित नहीं किया गया था। सर्वर प्रतिक्रिया थी: 5.5.1 प्रमाणीकरण आवश्यक डिवाइस से मेरी ऐप को कैसे अनइंस्टॉल किया गया है …? JSON को PHP ऑब्जेक्ट को सीरियल करना इंटरफेस अमूर्त वर्गों को पसंद क्यों करते हैं? Chrome स्थानीय jQuery कुकीज़ क्यों अनदेखा करता है? PHP – अतिभारित संपत्ति का अप्रत्यक्ष संशोधन दिनांक का उपयोग करते हुए कल की तारीख प्राप्त करें कैसे "एम्बेडेड" SQL 2008 डेटाबेस फ़ाइल बनाने के लिए अगर यह मौजूद नहीं है? $ .jax का उपयोग करते हुए JSON डेटा पोस्ट करते समय मैं एक एंटीफ़ोर्गरी टोकन कैसे प्रदान कर सकता हूं? स्रोत फ़ाइल नाम और सीनेनम्बर को सी # में मुद्रित करें लूप से पहले या लूप में घोषित करने के बीच अंतर?

माउस व्हील इनपुट को नियंत्रित करने के बजाए कर्सर के नीचे नियंत्रित करने के लिए कैसे करें?

मैं कई स्क्रॉलिंग नियंत्रणों का उपयोग करता हूं: टीटीआरिविज़, टीएलआईस्ट वीज, डिवएक्सप्रेस सीएक्सग्रीड और सीएक्सटीरी सूची, आदि। जब माउस व्हील काटना होता है, फ़ोकस के साथ नियंत्रण इनपुट को प्राप्त करता है चाहे माउस कर्सर को खत्म हो जाने पर नियंत्रण न हो।

माउस कर्सर को नियंत्रित करने के लिए माउस व्हील इनपुट को कैसे निर्देशित करना है? डेल्फी आईडीई इस संबंध में बहुत अच्छी तरह से काम करता है।

Solutions Collecting From Web of "माउस व्हील इनपुट को नियंत्रित करने के बजाए कर्सर के नीचे नियंत्रित करने के लिए कैसे करें?"

इस तरह अपने फार्म का MouseWheelHandler विधि को ओवरराइड करने का प्रयास करें (मैंने इसे पूरी तरह से परीक्षण नहीं किया है):

 procedure TMyForm.MouseWheelHandler(var Message: TMessage); var Control: TControl; begin Control := ControlAtPos(ScreenToClient(SmallPointToPoint(TWMMouseWheel(Message).Pos)), False, True, True); if Assigned(Control) and (Control <> ActiveControl) then begin Message.Result := Control.Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam); if Message.Result = 0 then Control.DefaultHandler(Message); end else inherited MouseWheelHandler(Message); end; 

TApplication को ओवरराइड करें .ऑनमार्क ईवेंट (या एक TApplicationEvents घटक बनाएं) और ईवेंट हैंडलर में WM_MOUSEWHEEL संदेश को रीडायरेक्ट करें:

 procedure TMyForm.AppEventsMessage(var Msg: tagMSG; var Handled: Boolean); var Pt: TPoint; C: TWinControl; begin if Msg.message = WM_MOUSEWHEEL then begin Pt.X := SmallInt(Msg.lParam); Pt.Y := SmallInt(Msg.lParam shr 16); C := FindVCLWindow(Pt); if C = nil then Handled := True else if C.Handle <> Msg.hwnd then begin Handled := True; SendMessage(C.Handle, WM_MOUSEWHEEL, Msg.wParam, Msg.lParam); end; end; end; 

यह ठीक काम करता है, यद्यपि आप कुछ सुरक्षा जोड़ना चाहते हैं ताकि इसे अनजाने से कुछ होने पर पुनरारंभ हो।

आपको ये लेख उपयोगी पा सकते हैं: मोज़ेविल का उपयोग करते हुए सूचीबॉब्स पर स्क्रॉल करें संदेश भेजें, लेकिन सूचीबॉक्स पर ध्यान केंद्रित नहीं है [1] , यह सी # में लिखा है, लेकिन डेल्फी में परिवर्तित करना बहुत बड़ी समस्या नहीं होनी चाहिए। यह वांछित प्रभाव को पूरा करने के लिए हुक का उपयोग करता है

यह पता लगाने के लिए कि माउस वर्तमान में कौन सा घटक है, आप FindVCLWindow फ़ंक्शन का उपयोग कर सकते हैं, इस का एक उदाहरण इस लेख में पाया जा सकता है: माउस के तहत एक डेल्फी आवेदन में नियंत्रण प्राप्त करें [2]

[1] http://social.msdn.microsoft.com/forums/en-US/winforms/thread/ec1fbfa2-137e-49f6-b444-b634e4f44f21/
[2] http://delphi.about.com/od/delphitips2008/qt/find-vcl-window.htm

यह वह समाधान है जिसका उपयोग मैं कर रहा हूं:

  1. फॉर्म यूनिट के बाद अपने फॉर्म की इकाई के कार्यान्वयन अनुभाग के उपयोग के खंड में amMouseWheel जोड़ें:

     unit MyUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, // Fix and util for mouse wheel amMouseWheel; ... 
  2. निम्नलिखित कोड को amMouseWheel.pas सहेजें:

     unit amMouseWheel; // ----------------------------------------------------------------------------- // The original author is Anders Melander, anders@melander.dk, http://melander.dk // Copyright © 2008 Anders Melander // ----------------------------------------------------------------------------- // License: // Creative Commons Attribution-Share Alike 3.0 Unported // http://creativecommons.org/licenses/by-sa/3.0/ // ----------------------------------------------------------------------------- interface uses Forms, Messages, Classes, Controls, Windows; //------------------------------------------------------------------------------ // // TForm work around for mouse wheel messages // //------------------------------------------------------------------------------ // The purpose of this class is to enable mouse wheel messages on controls // that doesn't have the focus. // // To scroll with the mouse just hover the mouse over the target control and // scroll the mouse wheel. //------------------------------------------------------------------------------ type TForm = class(Forms.TForm) public procedure MouseWheelHandler(var Msg: TMessage); override; end; //------------------------------------------------------------------------------ // // Generic control work around for mouse wheel messages // //------------------------------------------------------------------------------ // Call this function from a control's (eg a TFrame) DoMouseWheel method like // this: // // function TMyFrame.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; // MousePos: TPoint): Boolean; // begin // Result := ControlDoMouseWheel(Self, Shift, WheelDelta, MousePos) or inherited; // end; // //------------------------------------------------------------------------------ function ControlDoMouseWheel(Control: TControl; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; implementation uses Types; procedure TForm.MouseWheelHandler(var Msg: TMessage); var Target: TControl; begin // Find the control under the mouse Target := FindDragTarget(SmallPointToPoint(TCMMouseWheel(Msg).Pos), False); while (Target <> nil) do begin // If the target control is the focused control then we abort as the focused // control is the originator of the call to this method. if (Target = Self) or ((Target is TWinControl) and (TWinControl(Target).Focused)) then begin Target := nil; break; end; // Let the target control process the scroll. If the control doesn't handle // the scroll then... Msg.Result := Target.Perform(CM_MOUSEWHEEL, Msg.WParam, Msg.LParam); if (Msg.Result <> 0) then break; // ...let the target's parent give it a go instead. Target := Target.Parent; end; // Fall back to the default processing if none of the controls under the mouse // could handle the scroll. if (Target = nil) then inherited; end; type TControlCracker = class(TControl); function ControlDoMouseWheel(Control: TControl; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; var Target: TControl; begin (* ** The purpose of this method is to enable mouse wheel messages on controls ** that doesn't have the focus. ** ** To scroll with the mouse just hover the mouse over the target control and ** scroll the mouse wheel. *) Result := False; // Find the control under the mouse Target := FindDragTarget(MousePos, False); while (not Result) and (Target <> nil) do begin // If the target control is the focused control then we abort as the focused // control is the originator of the call to this method. if (Target = Control) or ((Target is TWinControl) and (TWinControl(Target).Focused)) then break; // Let the target control process the scroll. If the control doesn't handle // the scroll then... Result := TControlCracker(Target).DoMouseWheel(Shift, WheelDelta, MousePos); // ...let the target's parent give it a go instead. Target := Target.Parent; end; end; end. 

मुझे एक ही समस्या थी और इसे कुछ थोड़ा हैक के साथ हल किया, लेकिन यह काम करता है

मैं संदेशों के साथ गड़बड़ नहीं करना चाहता था और मुझे ड्यूमॉज व्हाल विधि को नियंत्रित करने के लिए सिर्फ तय करने का निर्णय लिया गया था। हैक है कि DoMouseWheel विधि सुरक्षित है और इसलिए प्रपत्र यूनिट फ़ाइल से सुलभ नहीं है, इसीलिए मैंने अपनी कक्षा को फ़ॉर्म यूनिट में परिभाषित किया है:

 TControlHack = class(TControl) end; //just to call DoMouseWheel 

फिर मैंने TForm1.onMouseWheel ईवेंट हैंडलर लिखा था:

 procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); var i: Integer; c: TControlHack; begin for i:=0 to ComponentCount-1 do if Components[i] is TControl then begin c:=TControlHack(Components[i]); if PtInRect(c.ClientRect,c.ScreenToClient(MousePos)) then begin Handled:=c.DoMouseWheel(shift,WheelDelta,MousePos); if Handled then break; end; end; end; 

जैसा कि आप देखते हैं, यह फ़ॉर्म पर सभी नियंत्रणों की खोज करता है, केवल न केवल तत्काल बच्चों को, और माता-पिता से बच्चों तक खोज करने के लिए निकलता है यह बच्चों पर रिकर्सिव खोज करने के लिए बेहतर (लेकिन अधिक कोड) होगा, लेकिन उपरोक्त कोड ठीक काम करता है।

म्यूसवील ईवेंट पर केवल एक नियंत्रण का जवाब देने के लिए, आपको हमेशा संभाला जाना चाहिए: = यह कार्यान्वित होने पर सही है। उदाहरण के लिए यदि आपके पास पैनल के अंदर सूचीबैक है, तो पैनल पहले DoMouseWheel को निष्पादित करेगा, और अगर यह ईवेंट को संभाल नहीं करेगा, तो सूचीबॉक्स। DoMouseWheel निष्पादित होगा। यदि माउस कर्सर के तहत कोई नियंत्रण DoMouseWheel संभाला, केंद्रित नियंत्रण, यह बल्कि पर्याप्त व्यवहार लगता है।

केवल DevExpress नियंत्रणों के साथ उपयोग करने के लिए

यह XE3 पर काम करता है इसे अन्य संस्करणों पर परीक्षण नहीं किया गया था।

 procedure TMainForm.DoApplicationMessage(var AMsg: TMsg; var AHandled: Boolean); var LControl: TWinControl; LMessage: TMessage; begin if AMsg.message <> WM_MOUSEWHEEL then Exit; LControl := FindVCLWindow(AMsg.pt); if not Assigned(LControl) then Exit; LMessage.WParam := AMsg.wParam; // see TControl.WMMouseWheel TCMMouseWheel(LMessage).ShiftState := KeysToShiftState(TWMMouseWheel(LMessage).Keys); LControl.Perform(CM_MOUSEWHEEL, LMessage.WParam, AMsg.lParam); AHandled := True; end; 

अगर आप DevExpress नियंत्रणों का उपयोग नहीं करते हैं, तो प्रदर्शन करें -> भेजें मेसेज

 SendMessage(LControl.Handle, AMsg.message, AMsg.WParam, AMsg.lParam); 

प्रत्येक स्क्रॉल नियंत्रण के लिए OnMouseEnter घटना में सेटफोकस के लिए एक संबंधित कॉल जोड़ें

तो ListBox1 के लिए:

 procedure TForm1.ListBox1MouseEnter(Sender: TObject); begin ListBox1.SetFocus; end; 

क्या यह वांछित प्रभाव हासिल करता है?