如何在Delphi中记下ComBoBox

时间:2017-04-13 13:12:42

标签: delphi

在我的项目中,当用户将鼠标移到ComboBox项目上时,我想做一些注意事项, 例如:我有一个ComboBox,而物品是:鲍勃的手机,罗伯特的手机...... 当用户将鼠标移到Bob的手机上时,标签将出现在ComboBox中鼠标的位置,标签的内容为:05498762,。

请帮助我,谢谢!

2 个答案:

答案 0 :(得分:2)

如果要在用户主动将鼠标移到TComboBox项目上时显示提示,您可以执行以下操作:

如果TComboBox.Style属性设置为csSimple,则ComboBox的ListBox始终可见。但是,OnMouseMove事件未公开,即使您手动分配它,也不会在将鼠标移到ComboBox的ListBox上时触发它,只会触发它的编辑字段。但是,您可以使用TApplication.OnShowHint事件,或者将TComboBox本身子类化为直接拦截CM_HINTSHOW消息。无论哪种方式都会为您提供指向THintInfo记录的引用/指针。您可以使用THintInfo.CursorPos字段来确定当前鼠标下的ListBox项目:

  • 致电GetComboBoxInfo()以获取ComboBox的ListBox HWND

  • 然后调用MapWindowPoints()CursorPos坐标从ComboBox客户端坐标转换为ListBox客户端坐标。

  • 然后使用翻译的坐标向ListBox发送LB_ITEMFROMPOINT消息。

这将为您提供最接近坐标的项目的索引。然后,您可以使用所需的文本设置THintInfo.HintStr字段。您还应该通过向ListBox发送THintInfo.CursorRect消息来设置带有返回矩形的LB_GETITEMRECT字段(使用MapWindowPoints()将矩形从ListBox客户端坐标转换为ComboBox客户端坐标)。当鼠标移动到矩形之外时,将发出新的OnShowHint / CM_HINTSHOW,然后您可以使用鼠标下的ListBox项目中的详细信息更新THintInfo

如果TComboBox.Style属性未设置为csSimple,则ListBox仅在下拉时才可见。在这种情况下,OnShowHint / CM_HINTSHOW技巧不起作用。但是,您可以使用TComboBox.OnDropDown事件直接手动子类化ListBox(以及OnCloseUp事件以删除子类),使用SetWindowLongPtr()SetWindowSubclass()。这将允许您拦截直接发送到ListBox的WM_MOUSEMOVE消息,然后您可以使用提供的鼠标坐标将LB_ITEMFROMPOINT发送到ListBox。

然而,要实际显示提示,仅在这种情况下设置TComboBox.Hint属性是不够的(它不会显示,因为下拉列表基本上作为模态窗口并阻止正常的提示机制)。您必须手动显示自己的提示窗口,例如直接使用THintWindow类。

答案 1 :(得分:1)

function fun= f(t,y) myu=398600.4418E+9; J2=1.08262668E-3; req=6378137; r2=(y(1)**2 + y(2)**2 + y(3)**2); r3=r2**(3/2); w=1+1.5*J2*(req*req/r2)*(1-5*y(2)*y(2)/r2); fun=[y(4),y(5),y(6),-myu*y(1)*w/r3,-myu*y(2)*w/r3,-myu*y(3)*w/r3]; endfunction t0=86400*2.3567000000000000E+04; tN= 86400*2.3567250000000000E+04; t = linspace(t0,tN); y0 = [-9.0656779992979474E+05, -4.8397431127596954E+06, -5.0408120071376814E+06, -7.6805804020022015E+02, 5.4710987127502622E+03, -5.1022193482389539E+03]; x = ode23s (f, t, y0 ); disp(x); 设置为true后,选择后鼠标移动将起作用:

ShowHint