我想为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。 为什么呢?
答案 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