首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TListBox多选择风格

TListBox多选择风格
EN

Stack Overflow用户
提问于 2011-12-26 20:02:52
回答 1查看 1.9K关注 0票数 0

是否有可能用标准的TListBox来改变多重选择行为?

我希望项目只能通过按住Ctrl键而不是Shift键进行多选择。

我有TActions,它根据选定的项目更新,例如:

代码语言:javascript
复制
TAction(Sender).Enabled := ListBox1.ItemIndex <> -1;

当选择一个列表框项时,分配给动作的控件会闪烁,当持有shift到multiselect时,这不是仅通过按住ctrl键而发生的。

因此,我只想使用Ctrl键进行多重选择。

简单地说,我怎样才能:

multiselect

  • Shift
  • 多重选择TListBox
  • 使用Ctrl对

没有影响

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-26 21:49:59

项选择由基础列表框api控件的默认窗口过程处理。正因为如此,没有任何VCL属性可以做到这一点。尽管如此,用户可能不喜欢这样,但是您可以通过处理WM_LBUTTONDOWN消息来更改行为,即发布触发项选择的控件。以任何您喜欢的方式对控件进行子类。或者,由于发布了WM_LBUTTONDOWN,您可以使用ApplicationEvents组件的OnMessage事件。或者,就像下面的一个例子一样,如果控件立即由窗体父级生成,则可以使用发送给父控件的通知:

代码语言:javascript
复制
type
  TForm1 = class(TForm)
    ..
  private
    procedure WMParentNotify(var Msg: TWMParentNotify); message WM_PARENTNOTIFY;
    ..

procedure TForm1.WMParentNotify(var Msg: TWMParentNotify);
var
  Pt: TPoint;
  State: TKeyboardState;
begin
  if (Msg.Event = WM_LBUTTONDOWN) then begin
    Pt := SmallPointToPoint(SmallPoint(Msg.XPos, Msg.YPos));
    MapWindowPoints(Handle, ListBox1.Handle, Pt, 1);
    if PtInRect(ListBox1.ClientRect, Pt) then begin
      GetKeyboardState(State);
      State[VK_SHIFT] := 0;
      SetKeyboardState(State);
    end;
  end;
  inherited;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8638781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档