Delphi TListBox OnClick / OnChange?

时间:2014-01-02 18:08:30

标签: delphi onclick subclass onchange tlistbox

使用TListBox获取“OnChange”类型的功能是否有诀窍?我可以子类化组件并添加属性等,然后只有在索引更改时才执行OnClick代码...我也可以使用表单级变量来存储当前索引,但只是想知道我是否忽略了之前的我走了一条路。

2 个答案:

答案 0 :(得分:11)

除了自己实现这一点之外似乎没有别的办法。您需要记住当前选定的项目,每当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;

答案 1 :(得分:0)

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

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