gpt4 book ai didi

delphi - 禁用 TListView 控件中的取消选择

转载 作者:行者123 更新时间:2023-12-01 21:35:08 25 4
gpt4 key购买 nike

我想使用 TListView (vsIcon) 作为一种选项卡 - 这样只能像选项卡一样选择一个项目。仅选择一项没有问题(禁用 Multiselect 属性)。问题是单击 ListView 中图标和文本之间的空白点时取消选择项目。

这是我迄今为止尝试过的:

void __fastcall TForm::ListViewChanging(TObject *Sender, TListItem *Item, TItemChange Change, bool &AllowChange)
{
if (Change == ctState)
{
TPoint CursorRel = ListView->ScreenToClient(Mouse->CursorPos);
AllowChange = (ListView->GetItemAt(CursorRel.x, CursorRel.y) != NULL);
StatusBar->SimpleText = (AllowChange)? "YES" : "NO";
}
}

上面的方法可以工作,但是有一个问题。当鼠标单击空白区域时,它会取消选择该项目,并且键盘上/下箭头不再起作用,尽管该项目看起来仍然被选中。如果我忽略键盘,对于鼠标选择,它可以正常工作,并且会忽略对空白区域的点击,并在状态栏中显示消息“NO”。

有什么想法可以解决这个问题,以便它适用于所有可能的选择方法(键盘、鼠标(任何其他?))。

最佳答案

拦截发送到控件的WM_LBUTTONDOWN,如果点击不在某个项目上,则停止默认处理。子类化控件,或使用 ApplicationEvents 组件等。带有插入器类的 Delphi 代码示例:

type
TListView = class(comctrls.TListView)
protected
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
end;

TForm1 = class(TForm)
ListView1: TListView;
private
..

procedure TListView.WMLButtonDown(var Message: TWMLButtonDown);
begin
if GetItemAt(Message.XPos, Message.YPos) <> nil then
inherited;
end;

关于delphi - 禁用 TListView 控件中的取消选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8636455/

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