2010-04-07 38 views
1

編碼,附​​加一個的OnKeyPress事件處理程序,以一個TStringGrid:德爾福 - 的OnKeyPress前TStringGrid更新單元與新的人物出現在Delphi

用戶正在輸入到網格單元前的OnKeyPress事件觸發實際上已經更新了其價值與被按下的鍵。這顯然是一個問題,當我想知道該單元格的內容是在這個時候,因爲用戶修改它。

的「黑客」辦法很簡單,如果你不考慮每一個細節:剛剛抓住從單元格的值,並且由於事件的OnKeyPress用重點參數走來,該值追加到尾部 - 現在你擁有了手機的當前價值!

錯誤。如果用戶選擇了單元格中的所有文本(即:「foo」)並且他們現在正在鍵入'b',該怎麼辦?由於他們選擇了文本,它將被刪除並替換爲字母'b'。但是,單元格的值在OnKeyPress中仍將顯示爲「foo」,並且鍵值的值將爲'b',因此上述邏輯將導致應用程序斷定單元格現在包含「foob」,其中我們知道是不正確的。

所以,有誰知道如何解決這個問題?有沒有辦法讓OnKeyPress在之後反應網格的內容已經更新,或者也許是在處理程序開始時強制更新的方式?我在這裏拼命地避免使用OnKeyUp事件,所以除此之外的任何建議都將不勝感激。

+4

你爲什麼「拼命地避免使用OnKeyUp事件」? – 2010-04-07 02:03:50

+3

OnKeyPress在控件處理完密鑰並相應地更新其內容之前觸發。如果需要,應用程序的代碼可以事先拒絕密鑰。 – 2010-04-07 07:31:56

+0

@雷米:是的,Deltics已經向我解釋過,並且還提供了答案。 @Mason:OnKeyUp可以觀察所有按鍵,而不僅僅是ASCII按鍵,而且這是很多不必要的努力來過濾掉我不想要的東西。我有使用OnKeyUp的問題(例如,當KeyDown在不同的組件上時捕獲KeyUp - 這是不受歡迎的),這就是爲什麼我重構使用OnKeyPress,所以返回並再次使用它* 。 ** OnSetEditText **應該完全適合我。 – JMTyler 2010-04-07 16:49:23

回答

5

如果你想在一個細胞你爲什麼不使用OnSetEditText事件的變化做出反應?

鍵盤事件用於響應鍵盤輸入,而不是對該輸入的控件響應。控件通常會提供一個或多個附加事件以允許應用程序響應某些輸入的控件響應 - 在這種情況下,鍵盤輸入會導致單元格值被修改,而不是單元格選擇的更改,例如。

順便說一句,這是很自然的是,這些事件應當存在的之前到電網控制響應於這些事件,這樣就有效地可以「過濾器」這樣的事件之前它們到達控制,例如到阻止特定的鍵盤輸入影響單元格的值。

+0

技術**​​ OnSetEditText **似乎在單元失去焦點時觸發 - 值是否實際發生了變化。儘管如此,如果我比較一下值是否真的發生了變化,這對我來說應該是非常好的。非常感謝。 – JMTyler 2010-04-07 05:24:14