2012-02-24 71 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