2012-02-24 36 views
3

我想为TFileListBox创建一个新的事件。我想知道用户何时选择不同的项目。如何实现TFileListBox的OnSelectionChanged事件?

实现它会在用户按下这样的鼠标按钮来调用该事件的最好办法:

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

Delphi的哪个版本? – Dampsquid 2012-02-24 21:27:32

+0

看起来您对选择更改的位置不正确。显然,选择的变化较早。找到那个地方。我可以帮忙,但我不知道TFileList是什么,所以我无法阅读它的源代码。 – 2012-02-24 21:30:37

+0

对不起。我的确在谈论tFileListBox。该代码在Delphi 7/XE下的行为相同。 – Ampere 2012-02-24 21:59:04

回答

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 
+0

我知道这件事。但这不是我所需要的。我想要一个可以显示以前选择的项目的事件。 – Ampere 2012-02-24 21:58:06

+0

我花了一段时间才弄清楚你需要什么,但我想我最终到了那里。 – 2012-02-24 23:17:06

+1

+1。很好的解决这个问题的方法,我知道你不熟悉的组件,David。 :) – 2012-02-24 23:43:07