如何为TFileListBox实现OnSelectionChanged事件?

时间:2012-02-24 21:10:24

标签: delphi

我想为TFileListBox创建一个新事件。我想知道用户何时选择其他项目。

实现它的最佳方法是在用户按下鼠标按钮时调用该事件:

procedure TMyFileList.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
VAR PrevItem: Integer;
begin
 PrevItem:= ItemIndex; <---------- Problem here
 inherited;
 if (Count> 0)
 AND ( PrevItem<> ItemIndex )                                                  
 AND Assigned(FOnSelChaged)
 then FOnSelChaged(Self, PrevItem);
end;

所以,让我们说第一项(ItemIndex = 0)已被选中。 一旦我按下鼠标按钮选择第二个项目,我就进入MouseDown程序。但是这里的ItemIndex已经是1而不是0。 为什么呢?

1 个答案:

答案 0 :(得分:6)

TFileListBox维护一个名为FLastSel的受保护字段,这正是您所需要的。您的代码的另一个大问题是您假设只能通过鼠标更改选择。不要忘记键盘或程序修改。您正在寻找名为Change的虚拟方法。

所以,把它们放在一起,就可以做到你需要的东西:

TMyFileListBox = class(TFileListBox)
protected
  procedure Change; override;
.... 

procedure TMyFileListBox.Change;
begin
  if (Count>0) and (FLastSel<>ItemIndex) and Assigned(FOnSelChanged) then        
    FOnSelChanged(Self, FLastSel, ItemIndex);
  inherited;
end;

我们必须在调用继承的FLastSel方法之前使用Change,因为这是FLastSel更改为等于当前选择的位置。

procedure TFileListBox.Change;
begin
  FLastSel := ItemIndex;
  .... continues