【问题标题】:Delphi TListBox OnClick / OnChange?Delphi TListBox OnClick / OnChange?
【发布时间】:2014-01-02 18:08:29
【问题描述】:

使用 TListBox 获得“OnChange”类型的功能是否有技巧?我可以对组件进行子类化并添加属性等,然后仅在索引更改时才执行 OnClick 代码...我还可以使用表单级变量对其进行破解以存储当前索引,但只是想知道我是否忽略了之前的明显我选择一种方式。

【问题讨论】:

  • OnChange 类型功能是什么意思?内容变化、选择变化、组合,还有什么?
  • @TLama "...如果 Index 发生变化..." ;o)
  • TListBox 没有 OnChange 事件,只有 OnClick。基本上,如果您使用 OnClick 并单击控件而不是某个项目,它仍会触发 OnClick 事件,该事件可以重新触发代码,除非您还跟踪先前选择的索引。我正在寻找的可能是针对控件设计的,但更像是列表形式的 TComboBox。
  • 每当用户通过鼠标或键盘选择一个项目时,OnClick 事件(在这种情况下是一个非常混乱的名称)都会被触发,但当您通过ItemIndex 属性在代码中设置它时不会触发(您可以通过覆盖 SetItemIndex 方法并从那里调用 Click 来绕过它)。
  • 如果您单击列表框中的任何位置,OnClick 似乎会触发...您不必实际单击某个项目。如果您单击已选择的项目,它也会触发。所以我只希望 OnClick 在选择了不是前一个项目或列表框本身的实际项目时触发。 IE。模拟 OnChange 事件。

标签: delphi onclick subclass onchange tlistbox


【解决方案1】:

似乎除了自己实现之外别无他法。您需要记住当前选定的项目,并且每当ItemIndex 属性从代码更改或当控件收到LBN_SELCHANGE 通知(当前触发OnClick 事件)时,您将比较您存储的项目索引使用当前选择的项目索引,如果它们不同,请触发您自己的 OnChange 事件。在插入类的代码中,它可能是:

type
  TListBox = class(StdCtrls.TListBox)
  private
    FItemIndex: Integer;
    FOnChange: TNotifyEvent;
    procedure CNCommand(var AMessage: TWMCommand); message CN_COMMAND;
  protected
    procedure Change; virtual;
    procedure SetItemIndex(const Value: Integer); override;
  published
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
  end;

implementation

{ TListBox }

procedure TListBox.Change;
begin
  if Assigned(FOnChange) then
    FOnChange(Self);
end;

procedure TListBox.CNCommand(var AMessage: TWMCommand);
begin
  inherited;
  if (AMessage.NotifyCode = LBN_SELCHANGE) and (FItemIndex <> ItemIndex) then
  begin
    FItemIndex := ItemIndex;
    Change;
  end;
end;

procedure TListBox.SetItemIndex(const Value: Integer);
begin
  inherited;
  if FItemIndex <> ItemIndex then
  begin
    FItemIndex := ItemIndex;
    Change;
  end;
end;

【讨论】:

  • 谢谢...我正在考虑派生一个新组件,但没有考虑插入。
  • if (AMessage.NotifyCode in [LBN_SELCHANGE, LBN_SETFOCUS]) and (FItemIndex ItemIndex) then ...
【解决方案2】:

与OnClick事件是这样的...你需要存储最后一个值来比较它。

if ListBox1.Items[ListBox1.ItemIndex]<> Edit1.Text then
    Edit1.Text := ListBox1.Items[ListBox1.ItemIndex];

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2017-07-30
    • 2013-06-17
    • 2012-01-30
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多