gpt4 book ai didi

delphi - 检测到 "whitespace"在列表框中单击

转载 作者:行者123 更新时间:2023-12-03 15:46:31 25 4
gpt4 key购买 nike

我有一个高列表框,其中包含可变数量的项目。它不会总是满的。我知道当用户没有通过此代码选择项目时:

if ( lstbox.ItemIndex = -1 ) then
ShowMessage('here');

但是,当我选择一个项目然后单击列表框的“空白”时,这不起作用。我如何检测这种情况?

最佳答案

您可以通过多种方式做到这一点。一种是在 OnMouseDown 事件中使用该事件的 XY 参数,它们是列表框中的客户端坐标,用户点击:

procedure TMyForm.ListBox1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
if TListbox(Sender).ItemAtPos(Point(X, Y), TRUE) <> -1 then
// item was clicked
else
// 'whitespace' was clicked
end;

但这不会影响任何 OnClick 事件中的行为。如果您需要在 OnClick 中执行此测试,那么您需要获取鼠标位置并将其转换为列表框客户端坐标,然后再进行相同的测试:

procedure TMyForm.ListBox1Click(Sender: TObject);
var
msgMousePos: TSmallPoint;
mousePos: TPoint;
begin
// Obtain screen co-ords of mouse at time of originating message
//
// Note that GetMessagePos returns a TSmallPoint which we need to convert to a TPoint
// in order to make further use of it

msgMousePos := TSmallPoint(GetMessagePos);

mousePos := SmallPointToPoint(msgMousePos);
mousePos := TListbox(Sender).ScreenToClient(mousePos);

if TListbox(Sender).ItemAtPos(mousePos, TRUE) <> -1 then
// item clicked
else
// 'whitespace' clicked
end;

注意:GetMessagePos() 获取最近观察到的鼠标消息时的鼠标位置(在本例中应该是发起 Click 事件的消息) )。但是,如果直接调用 Click 处理程序,则 GetMessagePos() 返回的鼠标位置可能与处理程序中的处理几乎没有相关性或没有相关性。如果任何此类直接调用可能合理地利用当前鼠标位置,则可以使用 GetCursorPos() 来获取。

GetCursorPos() 使用起来也更加简单,因为它直接获取 TPoint 值中的鼠标位置,避免了从 TSmallPoint< 转换的需要/强>:

GetCursorPos(mousePos);
无论哪种方式,您的处理程序以任何方式依赖于鼠标位置这一事实都会导致直接调用此事件处理程序出现问题,因此如果这是一个考虑因素,那么您可能希望将事件处理程序中的任何位置独立响应隔离到一个方法中如果/需要时可以显式调用,独立于鼠标与控件的交互。

关于delphi - 检测到 "whitespace"在列表框中单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25982417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com