2017-10-12 40 views
1

Firemonkey App,Windows和MacOS目標。Delphi Firemonkey TListView.selected始終爲零onItemsChange

我需要知道當用戶使用光標鍵滾動或用鼠標點擊列表視圖項目時選擇了什麼項目。

我可以通過onItemClick事件對鼠標點擊做出反應,這很好,當我用光標鍵移動選區時觸發onItemsChange事件,但是listview的選定屬性始終保持在該事件的零位。

這是一個錯誤還是有我想念的東西?

如何知道用戶在控件中使用光標鍵時選擇了哪個項目?

回答

2

您正在使用錯誤的事件。 OnItemsChange事件是

在項目列表發生更改後發生的事件。

as the documentation states。你是否更改項目列表?不,你沒有。

你要找的是OnChange事件:

發生時,ItemIndex屬性變化選擇不同的項目的用戶的結果。 編寫OnChange事件處理程序以響應ItemIndex屬性的更改。一旦列表成功更改,OnChange允許響應。

請參閱documentation for more details

+0

我一定是盲目的!感謝您的快速回答!順便說一句,我的名字是Günter沒有'h':) – Softtouch

+0

@Softtouch你需要認識到'OnChange'事件不是唯一的事情,你可以做到這一點。真正的問題是'OnItemsChange'事件中'GetSelected' getter方法失敗的原因 –

-1

我真的不明白倒票他們真的是一個???對我來說。不過,我決定更新我的答案,並試圖使其更清晰

第一:你需要認識到,OnChange事件是不是你能做到這一點上的唯一事件。真正的問題是GetSelected getter方法在OnItemsChange事件中失敗並返回nil

selected屬性的聲明是這樣的

property Selected: TListItem read GetSelected write SetSelected; 

其getter方法的檢查是這樣的:

if (FItemIndex >= 0) and (FItemIndex < Adapter.Count) then 
    return code 
else 
    result := nil; 

這麼清楚的東西是在documentation

發生

列表視圖中當前選定的列表項。 此屬性 是零如果沒有選擇項目

通過選中它們表示上述檢查。這首先提出瞭如何解決這個事件的下列問題。在documentation它說

項目列表已被更改後發生的事件。

這意味着當你改變項目的存在(刪除,添加,而不是改變高度或寬度,我已經檢查過)。此外,選擇屬性不返回零,如果事件不會改變選擇

以下測試可用於

在表單中添加以下

  • 的TListView
  • TCheckBox
  • a TButton

在按鈕OnClick事件中添加此

procedure TForm5.Button1Click(Sender: TObject); 
var 
    I: Integer; 
begin 
for I := 1 to 10 do 
listview1.items.add; 
end; 

在OnItemsChange事件添加此

procedure TForm5.ListView1ItemsChange(Sender: TObject); 
begin 
caption := 'fired'+datetimetostr(now); 
if checkbox1.IsChecked then 
caption := 'selected item index: '+ inttostr(listview1.Selected.index); 
end; 

你得到如下結果

  • 第一次用CheckBox.IsChecked = True加入(選擇,因爲沒有項目沒有)的項目,你會得到一個AV,因爲沒有什麼可以選擇
  • 成功添加一個項目後未勾選複選框選擇我t並選中該框然後添加另一個項目。 Voila no AV

從我的角度來看,我認爲你是第一個案例(這很奇怪,你沒有調查爲什麼)。

撇開文件中有關OnChange事件的說法。只要您確保在調用GetSelected方法之前選擇了項目,就不會有AV。

最後:我真的感到很失望的是,人們不會去額外的努力來回答爲什麼問題。

如果你不知道它爲什麼失敗,那麼如何確保它不會再失敗?

+0

爲什麼在使用光標鍵時如何找到所選項目?以及爲什麼財產失敗? –

+0

如果你看一看上面,OP已經接受了其他答案。不要說這就是爲什麼你會陷入低估的原因,但它確實指出了另一個答案有助於解決這個問題,而這個答案並沒有。最有可能的原因是你的回答沒有解決OnItemsChange事件的使用問題,這正是OP所使用的並且是錯誤的。 –

+0

@JerryDodge從這個答案中得到的一點是:'selected'屬性很好,而且是正確的方法,'OnChange'事件並不是唯一正確的事件。任何通過這個'if(FItemIndex> = 0)和(FItemIndex